diff --git a/Makefile b/Makefile index 25beccb..e8406f8 100644 --- a/Makefile +++ b/Makefile @@ -49,8 +49,8 @@ TARGET_PROTO_DIR = internal/proto/api/v1 TARGET_GEN_PB_DIR = internal/gen/api/v1 TARGET_GEN_CONNECT_DIR = internal/gen/api/v1/apiv1connect -PROTO_FILES = common.proto instance.proto k8s.proto recommendation.proto cluster.proto profiling.proto -GEN_PB_FILES = common.pb.go instance.pb.go k8s.pb.go recommendation.pb.go cluster.pb.go cluster_grpc.pb.go profiling.pb.go profiling_grpc.pb.go +PROTO_FILES = common.proto instance.proto k8s.proto recommendation.proto cluster.proto profiling.proto hpa_connector.proto +GEN_PB_FILES = common.pb.go instance.pb.go k8s.pb.go recommendation.pb.go cluster.pb.go cluster_grpc.pb.go profiling.pb.go profiling_grpc.pb.go hpa_connector.pb.go GEN_CONNECT_FILES = k8s.connect.go recommendation.connect.go cluster.connect.go profiling.connect.go diff --git a/docs/resources/node_policy.md b/docs/resources/node_policy.md index a9fd91f..4bf6433 100644 --- a/docs/resources/node_policy.md +++ b/docs/resources/node_policy.md @@ -292,6 +292,7 @@ resource "devzero_node_policy" "azure_example" { - `azure` (Attributes) Azure-specific configuration for nodes provisioned with this policy. (see [below for nested schema](#nestedatt--azure)) - `capacity_type_tip` (String) Tooltip for capacity types - `capacity_types` (Attributes) Capacity types selector (e.g., spot, on-demand, reserved) (see [below for nested schema](#nestedatt--capacity_types)) +- `cloud_provider_id` (Number) Cloud provider ID this policy is intended for: `1` = AWS, `2` = Azure, `3` = GCP, `4` = OCI. Informational/UI filter — compilation always uses the target cluster's provider. - `description` (String) Free-form description of the policy to help others understand its intent and scope. - `disruption` (Attributes) Configuration for node disruption policies including consolidation and expiration settings. (see [below for nested schema](#nestedatt--disruption)) - `disruptions_tip` (String) Tooltip for disruptions @@ -305,6 +306,7 @@ resource "devzero_node_policy" "azure_example" { - `instance_generations_tip` (String) Tooltip for instance generations - `instance_hypervisors` (Attributes) Instance hypervisors selector (see [below for nested schema](#nestedatt--instance_hypervisors)) - `instance_hypervisors_tip` (String) Tooltip for instance hypervisors +- `instance_local_nvme` (Attributes) Ephemeral NVMe storage per node in GiB (AWS only; karpenter.k8s.aws/instance-local-nvme) (see [below for nested schema](#nestedatt--instance_local_nvme)) - `instance_sizes` (Attributes) Instance sizes selector (e.g., Standard_D4s for Azure, large for AWS) (see [below for nested schema](#nestedatt--instance_sizes)) - `instance_sizes_tip` (String) Tooltip for instance sizes - `instance_types` (Attributes) Instance types selector — explicit full type names (e.g., m5.xlarge for AWS, Standard_D4s_v2 for Azure) (see [below for nested schema](#nestedatt--instance_types)) @@ -317,9 +319,11 @@ resource "devzero_node_policy" "azure_example" { - `operating_systems` (Attributes) Operating systems selector (e.g., linux, windows) (see [below for nested schema](#nestedatt--operating_systems)) - `operating_systems_tip` (String) Tooltip for operating systems - `raw` (Attributes List) Raw Karpenter NodePool and NodeClass YAML specifications for advanced use cases. (see [below for nested schema](#nestedatt--raw)) +- `startup_taints` (Attributes List) List of Kubernetes taints applied to nodes only while they start up (Karpenter `startupTaints`). Removed once the node is ready. (see [below for nested schema](#nestedatt--startup_taints)) - `taints` (Attributes List) List of Kubernetes taints to apply to nodes provisioned with this policy. (see [below for nested schema](#nestedatt--taints)) - `taints_tip` (String) Tooltip for taints - `weight` (Number) Priority weight for this node policy. Higher weights are preferred when multiple policies match. Default: 10 (medium priority). +- `zonal_shift` (Attributes) Behavior during an AWS ARC zonal shift. AWS only — silently ignored for other clouds. (see [below for nested schema](#nestedatt--zonal_shift)) - `zones` (Attributes) Availability zones selector (see [below for nested schema](#nestedatt--zones)) - `zones_tip` (String) Tooltip for zones @@ -358,9 +362,12 @@ Optional: - `ami_selector_terms` (Attributes List) AMI selector terms (see [below for nested schema](#nestedatt--aws--ami_selector_terms)) - `associate_public_ip_address` (Boolean) Associate public IP address with instances - `block_device_mappings` (Attributes List) Block device mappings (see [below for nested schema](#nestedatt--aws--block_device_mappings)) +- `capacity_reservation_selector_terms` (Attributes List) Selects EC2 Capacity Reservations that nodes launched by this policy may use. Terms are ORed; criteria within a term are ANDed. (see [below for nested schema](#nestedatt--aws--capacity_reservation_selector_terms)) +- `context` (String) Context passed through to EC2 Fleet launches (`spec.context` on the EC2NodeClass). Reserved for use by AWS. - `detailed_monitoring` (Boolean) Enable detailed CloudWatch monitoring - `instance_profile` (String) IAM instance profile - `instance_store_policy` (String) Policy for instance store volumes. Valid value: `RAID0`. +- `kubelet` (Attributes) Kubelet configuration overrides applied to nodes launched by this policy (maps to the EC2NodeClass `spec.kubelet` block). (see [below for nested schema](#nestedatt--aws--kubelet)) - `metadata_options` (Attributes) Configuration for EC2 instance metadata service. Defaults provide secure IMDS v2 configuration. (see [below for nested schema](#nestedatt--aws--metadata_options)) - `role` (String) IAM role name - `security_group_selector_terms` (Attributes List) Security group selector terms (see [below for nested schema](#nestedatt--aws--security_group_selector_terms)) @@ -404,6 +411,35 @@ Optional: + +### Nested Schema for `aws.capacity_reservation_selector_terms` + +Optional: + +- `id` (String) Capacity reservation ID +- `owner_id` (String) AWS account ID that owns the capacity reservation +- `tags` (Map of String) Tags to match on the capacity reservation + + + +### Nested Schema for `aws.kubelet` + +Optional: + +- `cluster_dns` (List of String) Cluster DNS server IPs +- `cpu_cfs_quota` (Boolean) Enable CPU CFS quota enforcement for containers that specify CPU limits +- `eviction_hard` (Map of String) Hard eviction thresholds (e.g. memory.available = 100Mi) +- `eviction_max_pod_grace_period` (Number) Maximum pod termination grace period (seconds) used on soft eviction +- `eviction_soft` (Map of String) Soft eviction thresholds +- `eviction_soft_grace_period` (Map of String) Grace periods for soft eviction thresholds +- `image_gc_high_threshold_percent` (Number) Disk usage percentage above which image garbage collection runs +- `image_gc_low_threshold_percent` (Number) Disk usage percentage below which image garbage collection stops +- `kube_reserved` (Map of String) Resources reserved for Kubernetes system daemons +- `max_pods` (Number) Maximum number of pods per node +- `pods_per_core` (Number) Maximum pods per CPU core +- `system_reserved` (Map of String) Resources reserved for system daemons (e.g. cpu, memory, ephemeral-storage) + + ### Nested Schema for `aws.metadata_options` @@ -442,11 +478,30 @@ Optional: - `fips_mode` (String) FIPS 140-2 mode. Valid values: `FIPS`, `Disabled`. - `image_family` (String) Azure image family. Valid values: `Ubuntu`, `Ubuntu2204`, `Ubuntu2404`, `AzureLinux`. +- `image_version` (String) Pinned node image version. Requires the DevZero node operator >= 1.8.4. +- `kubelet` (Attributes) Kubelet configuration overrides applied to nodes launched by this policy (maps to the AKSNodeClass `spec.kubelet` block). (see [below for nested schema](#nestedatt--azure--kubelet)) - `max_pods` (Number) Maximum number of pods per node - `os_disk_size_gb` (Number) OS disk size in GB - `tags` (Map of String) Azure tags to apply to resources - `vnet_subnet_id` (String) VNet subnet ID + +### Nested Schema for `azure.kubelet` + +Optional: + +- `allowed_unsafe_sysctls` (List of String) Unsafe sysctls or sysctl patterns allowed on the node +- `container_log_max_files` (Number) Maximum number of container log files retained per container +- `container_log_max_size` (String) Maximum size of a container log file before rotation (e.g. 50Mi) +- `cpu_cfs_quota` (Boolean) Enable CPU CFS quota enforcement for containers that specify CPU limits +- `cpu_cfs_quota_period` (String) CPU CFS quota period (e.g. 100ms) +- `cpu_manager_policy` (String) CPU manager policy. Valid values: `none`, `static`. +- `image_gc_high_threshold_percent` (Number) Disk usage percentage above which image garbage collection runs +- `image_gc_low_threshold_percent` (Number) Disk usage percentage below which image garbage collection stops +- `pod_pids_limit` (Number) Maximum number of PIDs per pod +- `topology_manager_policy` (String) Topology manager policy. Valid values: `none`, `best-effort`, `restricted`, `single-numa-node`. + + ### Nested Schema for `capacity_types` @@ -604,6 +659,28 @@ Optional: + +### Nested Schema for `instance_local_nvme` + +Optional: + +- `match_expressions` (Attributes List) List of label selector requirements (see [below for nested schema](#nestedatt--instance_local_nvme--match_expressions)) +- `match_labels` (Map of String) Map of label key-value pairs to match + + +### Nested Schema for `instance_local_nvme.match_expressions` + +Required: + +- `key` (String) Label key +- `operator` (String) Operator for matching. Valid values: `In`, `NotIn`, `Exists`, `DoesNotExist`, `Gt`, `Lt`. `Gt`/`Lt` apply to numeric selectors such as `instance_generations` and `instance_cpus`. + +Optional: + +- `values` (List of String) List of values for In/NotIn operators + + + ### Nested Schema for `instance_sizes` @@ -688,6 +765,16 @@ Optional: - `nodepool_yaml` (String) Raw NodePool YAML + +### Nested Schema for `startup_taints` + +Required: + +- `effect` (String) Taint effect. Valid values: `NoSchedule`, `PreferNoSchedule`, `NoExecute`. +- `key` (String) Taint key +- `value` (String) Taint value + + ### Nested Schema for `taints` @@ -698,6 +785,16 @@ Required: - `value` (String) Taint value + +### Nested Schema for `zonal_shift` + +Optional: + +- `allow_zone_fallback` (Boolean) Expand a single-zone policy to other zones when its zone is impacted +- `evict_impacted_nodes` (Boolean) Also terminate existing nodes in the impacted zone (respects PDBs) +- `respect_zonal_shift` (Boolean) Master opt-in. When false the other fields are ignored + + ### Nested Schema for `zones` diff --git a/docs/resources/node_policy_target.md b/docs/resources/node_policy_target.md index 6e991d6..7af02e7 100644 --- a/docs/resources/node_policy_target.md +++ b/docs/resources/node_policy_target.md @@ -44,29 +44,20 @@ resource "devzero_node_policy_target" "comprehensive" { ] } -# Example with multiple clusters -resource "devzero_cluster" "us_east" { - name = "production-us-east-1" +# The API allows at most ONE cluster per target — to cover several clusters, +# create one target per cluster (for_each keeps it concise). +resource "devzero_cluster" "production_regions" { + for_each = toset(["us-east-1", "us-west-2", "eu-west-1"]) + name = "production-${each.key}" } -resource "devzero_cluster" "us_west" { - name = "production-us-west-2" -} - -resource "devzero_cluster" "eu_west" { - name = "production-eu-west-1" -} - -resource "devzero_node_policy_target" "multi_cluster" { - name = "all-production-clusters" - description = "Apply cost optimization policy to all production clusters" +resource "devzero_node_policy_target" "per_cluster" { + for_each = devzero_cluster.production_regions + name = "standard-nodes-${each.key}" + description = "Apply cost optimization policy to ${each.key}" policy_id = devzero_node_policy.standard_nodes.id enabled = true - cluster_ids = [ - devzero_cluster.us_east.id, - devzero_cluster.us_west.id, - devzero_cluster.eu_west.id, - ] + cluster_ids = [each.value.id] } # Example of disabled target (for temporary disabling without destroying) @@ -84,7 +75,7 @@ resource "devzero_node_policy_target" "disabled" { ### Required -- `cluster_ids` (List of String) List of cluster IDs to apply the node policy to. Must reference existing cluster IDs. +- `cluster_ids` (List of String) Cluster ID to apply the node policy to. The API accepts at most one cluster per target; create one target per cluster. - `name` (String) Human-friendly name for the target. Used for display in the DevZero UI. - `policy_id` (String) Node policy to attach this target to. Must reference an existing `devzero_node_policy` resource ID. diff --git a/docs/resources/workload_policy.md b/docs/resources/workload_policy.md index fb8ad0a..adf6b70 100644 --- a/docs/resources/workload_policy.md +++ b/docs/resources/workload_policy.md @@ -71,24 +71,44 @@ resource "devzero_workload_policy" "cost_saving" { ### Optional - `action_triggers` (List of String) Action triggers for when to apply the workload policy. Only one of `on_schedule` or `on_detection` is allowed.The `on_schedule` trigger is used to apply the workload policy on a schedule configured with the `cron_schedule` attribute.The `on_detection` trigger is used to apply the workload policy when a detection trigger event occurs, configured with the `detection_triggers` attribute. +- `allow_in_place_memory_limit_decrease` (Boolean) Allow in-place memory limit decreases. Only honored when `enable_in_place_vertical_scaling` is true — the server silently forces this to false otherwise, so the provider rejects that combination at plan time. Default: false. - `cooldown_minutes` (Number) Minutes to wait between applying recommendations +- `cpu_ceiling_percent` (Number) Ceiling for CPU requests as a percent of the initial request (1-1000) +- `cpu_floor_percent` (Number) Floor for CPU requests as a percent of the initial request (1-100) +- `cpu_limit_ceiling_percent` (Number) Ceiling for CPU limits as a percent of the initial limit (1-1000) +- `cpu_limit_floor_percent` (Number) Floor for CPU limits as a percent of the initial limit (1-100) - `cpu_vertical_scaling` (Attributes) CPU vertical scaling options (see [below for nested schema](#nestedatt--cpu_vertical_scaling)) - `cron_schedule` (String) Cron expression for scheduled application. Uses standard 5-field cron format in the cluster timezone. - `defragmentation_schedule` (String) Cron expression for background defragmentation that can move workloads to reduce fragmentation. - `description` (String) Free-form description of the policy to help others understand its intent and scope. - `detection_triggers` (List of String) Detection triggers for when to apply the workload policy. Valid values: `pod_creation`, `pod_update`, `pod_evict`.The `pod_creation` trigger is used to apply the workload policy when a pod is created.The `pod_update` trigger is used to apply the workload policy when a pod is updated.The `pod_evict` trigger is used to apply the workload policy when a pod is evicted. - `drift_delta_percent` (Number) Percentage drift from baseline that triggers VPA refresh +- `enable_in_place_vertical_scaling` (Boolean) When true, vertical recommendations are applied in place (without recreating pods) where the cluster supports it. Default: false. - `enable_pmax_protection` (Boolean) When true, the recommender raises requests to cover observed peak usage when the peak-to-recommendation ratio exceeds `pmax_ratio_threshold`. Default: false. - `gpu_vertical_scaling` (Attributes) GPU vertical scaling options (see [below for nested schema](#nestedatt--gpu_vertical_scaling)) - `gpu_vram_vertical_scaling` (Attributes) GPU VRAM vertical scaling options (see [below for nested schema](#nestedatt--gpu_vram_vertical_scaling)) - `horizontal_scaling` (Attributes) Horizontal scaling options (see [below for nested schema](#nestedatt--horizontal_scaling)) - `hysteresis_vs_target` (Number) Hysteresis threshold vs target for HPA coordination +- `jvm_cpu_startup_floor_millicores` (Number) CPU floor during JVM startup, in millicores. Unset inherits the system default (75m); explicit `0` disables the floor. +- `jvm_heap_headroom_multiplier` (Number) Headroom multiplier applied to the JVM heap recommendation +- `jvm_heap_optimization_enabled` (Boolean) Enable JVM heap sizing recommendations +- `jvm_heap_target_percentile` (Number) Target percentile for JVM heap sizing (0.0-1.0) +- `jvm_max_heap_bytes` (Number) Upper bound for the JVM heap recommendation in bytes +- `jvm_min_heap_bytes` (Number) Lower bound for the JVM heap recommendation in bytes +- `jvm_non_heap_overhead_bytes` (Number) Fixed non-heap overhead in bytes +- `jvm_non_heap_overhead_percent` (Number) Non-heap overhead as a fraction of heap +- `jvm_prefer_container_support` (Boolean) Prefer container-aware JVM flags (UseContainerSupport) over explicit -Xmx - `live_migration_enabled` (Boolean) Allow live migration when applying recommendations - `loopback_period_seconds` (Number) Loopback period seconds of the workload policy. The loopback period is the period of time to look back for resource usage data. +- `memory_ceiling_percent` (Number) Ceiling for memory requests as a percent of the initial request (1-1000) +- `memory_floor_percent` (Number) Floor for memory requests as a percent of the initial request (1-100) +- `memory_limit_ceiling_percent` (Number) Ceiling for memory limits as a percent of the initial limit (1-1000) +- `memory_limit_floor_percent` (Number) Floor for memory limits as a percent of the initial limit (1-100) - `memory_vertical_scaling` (Attributes) Memory vertical scaling options (see [below for nested schema](#nestedatt--memory_vertical_scaling)) - `min_change_percent` (Number) Global minimum change threshold for applying recommendations - `min_data_points` (Number) Global minimum data points required for recommendations - `min_vpa_window_data_points` (Number) Minimum data points in VPA analysis window +- `pdb_enabled` (Boolean) Respect PodDisruptionBudgets when applying recommendations - `pmax_ratio_threshold` (Number) Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 — triggers when peak is 3× the recommendation. Default: 3.0. - `scheduler_plugins` (List of String) Kubernetes scheduler plugins to activate - `stability_cv_max` (Number) Maximum coefficient of variation to consider stable @@ -106,6 +126,7 @@ Optional: - `adjust_req_even_if_not_set` (Boolean) When true, the recommender will suggest resource requests even if the workload currently has none set. Default: false. - `enabled` (Boolean) Enable or disable vertical scaling for this resource. When disabled, vertical recommendations will not be applied. - `limit_multiplier` (Number) How much higher limits should be vs requests (e.g., 2.0 = 2x the request). +- `limit_use_rss` (Boolean) Memory only: when true, the limit is derived from an RSS-based recommendation instead of the working-set one (the limit multiplier still applies). Ignored for CPU/GPU. - `limits_adjustment_enabled` (Boolean) Allow recommender to adjust container limits as well as requests. When disabled, only requests are modified. - `limits_removal_enabled` (Boolean) When true, the recommender will remove resource limits from workloads (CPU axis only — memory limits removal is not supported). Default: false. - `max_request` (Number) Upper bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. @@ -114,6 +135,7 @@ Optional: - `min_data_points` (Number) Minimum data points required for VPA decisions - `min_request` (Number) Lower bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. - `overhead_multiplier` (Number) Additional headroom added to recommendations, expressed as a fraction (e.g., 0.05 for 5%). +- `request_use_rss` (Boolean) Memory only: when true, size the memory request recommendation from RSS (resident set size) instead of the default working set. Ignored for CPU/GPU. - `target_percentile` (Number) Target percentile for resource sizing (e.g., 0.75 = P75). @@ -125,6 +147,7 @@ Optional: - `adjust_req_even_if_not_set` (Boolean) When true, the recommender will suggest resource requests even if the workload currently has none set. Default: false. - `enabled` (Boolean) Enable or disable vertical scaling for this resource. When disabled, vertical recommendations will not be applied. - `limit_multiplier` (Number) How much higher limits should be vs requests (e.g., 2.0 = 2x the request). +- `limit_use_rss` (Boolean) Memory only: when true, the limit is derived from an RSS-based recommendation instead of the working-set one (the limit multiplier still applies). Ignored for CPU/GPU. - `limits_adjustment_enabled` (Boolean) Allow recommender to adjust container limits as well as requests. When disabled, only requests are modified. - `limits_removal_enabled` (Boolean) When true, the recommender will remove resource limits from workloads (CPU axis only — memory limits removal is not supported). Default: false. - `max_request` (Number) Upper bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. @@ -133,6 +156,7 @@ Optional: - `min_data_points` (Number) Minimum data points required for VPA decisions - `min_request` (Number) Lower bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. - `overhead_multiplier` (Number) Additional headroom added to recommendations, expressed as a fraction (e.g., 0.05 for 5%). +- `request_use_rss` (Boolean) Memory only: when true, size the memory request recommendation from RSS (resident set size) instead of the default working set. Ignored for CPU/GPU. - `target_percentile` (Number) Target percentile for resource sizing (e.g., 0.75 = P75). @@ -144,6 +168,7 @@ Optional: - `adjust_req_even_if_not_set` (Boolean) When true, the recommender will suggest resource requests even if the workload currently has none set. Default: false. - `enabled` (Boolean) Enable or disable vertical scaling for this resource. When disabled, vertical recommendations will not be applied. - `limit_multiplier` (Number) How much higher limits should be vs requests (e.g., 2.0 = 2x the request). +- `limit_use_rss` (Boolean) Memory only: when true, the limit is derived from an RSS-based recommendation instead of the working-set one (the limit multiplier still applies). Ignored for CPU/GPU. - `limits_adjustment_enabled` (Boolean) Allow recommender to adjust container limits as well as requests. When disabled, only requests are modified. - `limits_removal_enabled` (Boolean) When true, the recommender will remove resource limits from workloads (CPU axis only — memory limits removal is not supported). Default: false. - `max_request` (Number) Upper bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. @@ -152,6 +177,7 @@ Optional: - `min_data_points` (Number) Minimum data points required for VPA decisions - `min_request` (Number) Lower bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. - `overhead_multiplier` (Number) Additional headroom added to recommendations, expressed as a fraction (e.g., 0.05 for 5%). +- `request_use_rss` (Boolean) Memory only: when true, size the memory request recommendation from RSS (resident set size) instead of the default working set. Ignored for CPU/GPU. - `target_percentile` (Number) Target percentile for resource sizing (e.g., 0.75 = P75). @@ -160,12 +186,16 @@ Optional: Optional: +- `composite_formula` (String) Composite formula for multi-metric HPA scaling. Variables: `cpu`, `memory`, `networkingress`, `networkegress` (each the metric's current/target ratio). Example: `cpu * 0.6 + memory * 0.4`. - `enabled` (Boolean) Enable or disable horizontal scaling - `max_replica_change_percent` (Number) Maximum percent replica change in one step - `max_replicas` (Number) Upper bound on replicas - `min_data_points` (Number) Minimum data points required for HPA decisions - `min_replicas` (Number) Lower bound on replicas +- `network_target_throughput_bytes_per_sec` (Number) Target network throughput per replica in bytes/sec. `0` (or unset) auto-detects from P95 + 15% headroom based on the selected metric direction. - `primary_metric` (String) Primary metric to use for HPA decisions +- `scale_down_cooldown_seconds` (Number) Scale-down cooldown in seconds. Overrides the default Kubernetes stabilization window (300s). +- `target_memory_utilization` (Number) Target memory utilization for HPA scaling (0.0-1.0). Defaults to 0.80 server-side when unset. - `target_utilization` (Number) Target utilization for primary metric (0.0-1.0) @@ -177,6 +207,7 @@ Optional: - `adjust_req_even_if_not_set` (Boolean) When true, the recommender will suggest resource requests even if the workload currently has none set. Default: false. - `enabled` (Boolean) Enable or disable vertical scaling for this resource. When disabled, vertical recommendations will not be applied. - `limit_multiplier` (Number) How much higher limits should be vs requests (e.g., 2.0 = 2x the request). +- `limit_use_rss` (Boolean) Memory only: when true, the limit is derived from an RSS-based recommendation instead of the working-set one (the limit multiplier still applies). Ignored for CPU/GPU. - `limits_adjustment_enabled` (Boolean) Allow recommender to adjust container limits as well as requests. When disabled, only requests are modified. - `limits_removal_enabled` (Boolean) When true, the recommender will remove resource limits from workloads (CPU axis only — memory limits removal is not supported). Default: false. - `max_request` (Number) Upper bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. @@ -185,6 +216,7 @@ Optional: - `min_data_points` (Number) Minimum data points required for VPA decisions - `min_request` (Number) Lower bound for container resource requests (e.g., CPU millicores or memory bytes) considered by the recommender. - `overhead_multiplier` (Number) Additional headroom added to recommendations, expressed as a fraction (e.g., 0.05 for 5%). +- `request_use_rss` (Boolean) Memory only: when true, size the memory request recommendation from RSS (resident set size) instead of the default working set. Ignored for CPU/GPU. - `target_percentile` (Number) Target percentile for resource sizing (e.g., 0.75 = P75). ## Import diff --git a/docs/resources/workload_policy_target.md b/docs/resources/workload_policy_target.md index 5b34bc8..164e180 100644 --- a/docs/resources/workload_policy_target.md +++ b/docs/resources/workload_policy_target.md @@ -76,21 +76,43 @@ resource "devzero_workload_policy_target" "full" { ### Optional +- `annotation_selector` (Attributes) Select workloads by annotations. Uses the same semantics as label selectors, evaluated against workload annotations. (see [below for nested schema](#nestedatt--annotation_selector)) - `description` (String) Free-form description of the target to help others understand its purpose. - `enabled` (Boolean) Enable or disable this target. When disabled, the associated policy will not apply to the selected workloads. - `kind_filter` (List of String) Restrict matching to specific Kubernetes kinds. Allowed values: `Pod`, `Job`, `Deployment`, `StatefulSet`, `DaemonSet`, `ReplicaSet`, `CronJob`, `ReplicationController`, `Rollout`. +- `kind_filter_not_in` (List of String) Kubernetes kinds to exclude from matching. Same allowed values as `kind_filter`. - `name_pattern` (Attributes) Regex to match workload names. Useful to target rollouts or name conventions (e.g., `^api-.*`). (see [below for nested schema](#nestedatt--name_pattern)) - `namespace_pattern` (Attributes) Regex to match namespace names. Useful when namespaces follow a naming convention (e.g., `^prod-`). (see [below for nested schema](#nestedatt--namespace_pattern)) - `namespace_selector` (Attributes) Select namespaces by labels. Uses the same semantics as Kubernetes label selectors. (see [below for nested schema](#nestedatt--namespace_selector)) -- `node_group_names` (List of String) Restrict matching to specific node groups by name +- `node_group_names` (List of String, Deprecated) Restrict matching to specific node groups by name. Deprecated upstream — unused by any active target and removed from the UI. - `priority` (Number) Evaluation priority among multiple targets. Higher values take precedence when multiple targets overlap. - `workload_names` (List of String) Explicit list of workload names to include +- `workload_names_not_in` (List of String) Explicit list of workload names to exclude from matching. - `workload_selector` (Attributes) Select workloads by labels. Applies to Kubernetes objects like Deployments, StatefulSets, DaemonSets, etc. (see [below for nested schema](#nestedatt--workload_selector)) ### Read-Only - `id` (String) Unique identifier of the workload policy target. Managed by the provider. + +### Nested Schema for `annotation_selector` + +Optional: + +- `match_expressions` (Attributes List) Advanced label selector requirements. Each expression supports operators `In`, `NotIn`, `Exists`, `DoesNotExist`. Use `values` only with `In`/`NotIn`. (see [below for nested schema](#nestedatt--annotation_selector--match_expressions)) +- `match_labels` (Map of String) Exact label key/value pairs that the target must match. Keys and values must be strings. Example: `{ "app": "api", "env": "prod" }`. + + +### Nested Schema for `annotation_selector.match_expressions` + +Optional: + +- `key` (String) Label key to evaluate. Example: `app` or `kubernetes.io/name`. +- `operator` (String) Label selection operator. One of `In`, `NotIn`, `Exists`, `DoesNotExist`. +- `values` (List of String) Values to compare against the key. Required with `In`/`NotIn`; must be omitted with `Exists`/`DoesNotExist`. + + + ### Nested Schema for `name_pattern` diff --git a/docs/resources/workload_rule.md b/docs/resources/workload_rule.md index 368241b..02cf2ad 100644 --- a/docs/resources/workload_rule.md +++ b/docs/resources/workload_rule.md @@ -51,14 +51,16 @@ resource "devzero_workload_rule" "manual" { } hpa_rule = { - enabled = true - min_replicas = 1 - max_replicas = 10 - target_utilization = 0.70 - primary_metric = "cpu" + enabled = true + min_replicas = 1 + max_replicas = 10 - # External/Prometheus metric trigger + # Metric triggers: built-in CPU/Memory or external (e.g. Prometheus) metrics = [ + { + type = "CPU" + target_utilization = "0.70" + }, { type = "prometheus" target_value = "100" @@ -137,10 +139,12 @@ resource "devzero_workload_rule" "per_container" { - `cron_schedule` (String) Cron expression for scheduled application (5-field UTC) - `defragmentation_schedule` (String) Cron expression for node defragmentation - `detection_triggers` (List of String) Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update' +- `disabled` (Boolean) Whether the rule is disabled. A disabled rule exists but is not evaluated. Changing this after creation uses the ToggleWorkloadRuleDisabled API (the upsert API rejects `disabled` on update). - `emergency_response` (Attributes) Emergency response configuration for OOM and CPU throttle events (see [below for nested schema](#nestedatt--emergency_response)) - `gpu_rule` (Attributes) GPU vertical scaling rule configuration (see [below for nested schema](#nestedatt--gpu_rule)) - `hpa_rule` (Attributes) Horizontal (replica) scaling rule configuration (see [below for nested schema](#nestedatt--hpa_rule)) - `live_migration_enabled` (Boolean) Allow live pod migration when applying recommendations +- `lookback_period_seconds` (Number) Per-rule override of the metrics lookback window in seconds. Unset inherits the team default (7 days). Minimum 3600 (1h), maximum 2592000 (30d); higher tiers may be capped server-side. - `memory_rule` (Attributes) Memory vertical scaling rule configuration (see [below for nested schema](#nestedatt--memory_rule)) - `scheduler_plugins` (List of String) Kubernetes scheduler plugins to activate - `use_in_place_vertical_scaling` (Boolean) Use in-place pod vertical scaling instead of pod restarts @@ -169,10 +173,12 @@ Optional: - `enabled` (Boolean) Enable this resource axis rule - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request - `min_request` (Number) Minimum resource request +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) @@ -183,10 +189,12 @@ Optional: - `enabled` (Boolean) Enable this resource axis rule - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request - `min_request` (Number) Minimum resource request +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) @@ -197,10 +205,12 @@ Optional: - `enabled` (Boolean) Enable this resource axis rule - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request - `min_request` (Number) Minimum resource request +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) @@ -210,14 +220,22 @@ Optional: Optional: +- `ceiling_percent` (Number) Ceiling for the request as a percent of initial_request (1-1000) - `enabled` (Boolean) Enable this resource axis rule +- `floor_percent` (Number) Floor for the request as a percent of initial_request (1-100) +- `initial_limit` (Number) Baseline limit the limit floor/ceiling percents are computed against +- `initial_request` (Number) Baseline request the floor/ceiling percents are computed against +- `limit_ceiling_percent` (Number) Ceiling for the limit as a percent of initial_limit (1-1000) +- `limit_floor_percent` (Number) Floor for the limit as a percent of initial_limit (1-100) - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request (millicores for CPU, bytes for memory/GPU) - `max_scale_down_percent` (Number) Maximum percentage decrease allowed in a single cycle - `max_scale_up_percent` (Number) Maximum percentage increase allowed in a single cycle - `min_request` (Number) Minimum resource request (millicores for CPU, bytes for memory/GPU) +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) @@ -238,14 +256,22 @@ Optional: Optional: +- `ceiling_percent` (Number) Ceiling for the request as a percent of initial_request (1-1000) - `enabled` (Boolean) Enable this resource axis rule +- `floor_percent` (Number) Floor for the request as a percent of initial_request (1-100) +- `initial_limit` (Number) Baseline limit the limit floor/ceiling percents are computed against +- `initial_request` (Number) Baseline request the floor/ceiling percents are computed against +- `limit_ceiling_percent` (Number) Ceiling for the limit as a percent of initial_limit (1-1000) +- `limit_floor_percent` (Number) Floor for the limit as a percent of initial_limit (1-100) - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request (millicores for CPU, bytes for memory/GPU) - `max_scale_down_percent` (Number) Maximum percentage decrease allowed in a single cycle - `max_scale_up_percent` (Number) Maximum percentage increase allowed in a single cycle - `min_request` (Number) Minimum resource request (millicores for CPU, bytes for memory/GPU) +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) @@ -260,11 +286,8 @@ Optional: - `fallback` (Attributes) Replica fallback configuration when metrics are unavailable (see [below for nested schema](#nestedatt--hpa_rule--fallback)) - `max_replica_change_percent` (Number) Maximum percentage change in replica count per cycle - `max_replicas` (Number) Maximum number of replicas -- `metrics` (Attributes List) Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primary_metric. (see [below for nested schema](#nestedatt--hpa_rule--metrics)) +- `metrics` (Attributes List) HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed target_utilization/primary_metric fields. (see [below for nested schema](#nestedatt--hpa_rule--metrics)) - `min_replicas` (Number) Minimum number of replicas -- `primary_metric` (String) Primary metric for HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress' -- `target_memory_utilization` (Number) Target memory utilization ratio (0-1), tuned independently of CPU -- `target_utilization` (Number) Target CPU utilization ratio (0-1) ### Nested Schema for `hpa_rule.behavior` @@ -337,6 +360,7 @@ Required: Optional: +- `connector_id` (String) HPA connector ID to source this metric's connection settings from - `metadata` (Map of String) Free-form key-value metadata for external scalers (e.g. serverAddress, query for Prometheus). - `query` (String) PromQL query string. Packed into metadata by the service layer. - `server_address` (String) Prometheus server URL. Packed into metadata by the service layer. @@ -351,12 +375,20 @@ Optional: Optional: +- `ceiling_percent` (Number) Ceiling for the request as a percent of initial_request (1-1000) - `enabled` (Boolean) Enable this resource axis rule +- `floor_percent` (Number) Floor for the request as a percent of initial_request (1-100) +- `initial_limit` (Number) Baseline limit the limit floor/ceiling percents are computed against +- `initial_request` (Number) Baseline request the floor/ceiling percents are computed against +- `limit_ceiling_percent` (Number) Ceiling for the limit as a percent of initial_limit (1-1000) +- `limit_floor_percent` (Number) Floor for the limit as a percent of initial_limit (1-100) - `limit_multiplier` (Number) Multiplier applied to the request to derive the resource limit +- `limit_use_rss` (Boolean) Memory only: derive the limit from an RSS-based recommendation - `limits_adjustment_enabled` (Boolean) Whether to also adjust resource limits alongside requests - `limits_removal_enabled` (Boolean) Actively remove limits from workloads - `max_request` (Number) Maximum resource request (millicores for CPU, bytes for memory/GPU) - `max_scale_down_percent` (Number) Maximum percentage decrease allowed in a single cycle - `max_scale_up_percent` (Number) Maximum percentage increase allowed in a single cycle - `min_request` (Number) Minimum resource request (millicores for CPU, bytes for memory/GPU) +- `request_use_rss` (Boolean) Memory only: size the request from RSS instead of working set - `target_percentile` (Number) Percentile of usage data used as the recommendation target (0-1) diff --git a/examples/resources/devzero_node_policy_target/resource.tf b/examples/resources/devzero_node_policy_target/resource.tf index df09938..88baf5c 100644 --- a/examples/resources/devzero_node_policy_target/resource.tf +++ b/examples/resources/devzero_node_policy_target/resource.tf @@ -29,29 +29,20 @@ resource "devzero_node_policy_target" "comprehensive" { ] } -# Example with multiple clusters -resource "devzero_cluster" "us_east" { - name = "production-us-east-1" +# The API allows at most ONE cluster per target — to cover several clusters, +# create one target per cluster (for_each keeps it concise). +resource "devzero_cluster" "production_regions" { + for_each = toset(["us-east-1", "us-west-2", "eu-west-1"]) + name = "production-${each.key}" } -resource "devzero_cluster" "us_west" { - name = "production-us-west-2" -} - -resource "devzero_cluster" "eu_west" { - name = "production-eu-west-1" -} - -resource "devzero_node_policy_target" "multi_cluster" { - name = "all-production-clusters" - description = "Apply cost optimization policy to all production clusters" +resource "devzero_node_policy_target" "per_cluster" { + for_each = devzero_cluster.production_regions + name = "standard-nodes-${each.key}" + description = "Apply cost optimization policy to ${each.key}" policy_id = devzero_node_policy.standard_nodes.id enabled = true - cluster_ids = [ - devzero_cluster.us_east.id, - devzero_cluster.us_west.id, - devzero_cluster.eu_west.id, - ] + cluster_ids = [each.value.id] } # Example of disabled target (for temporary disabling without destroying) diff --git a/examples/resources/devzero_workload_rule/resource.tf b/examples/resources/devzero_workload_rule/resource.tf index d5fe1b6..62041de 100644 --- a/examples/resources/devzero_workload_rule/resource.tf +++ b/examples/resources/devzero_workload_rule/resource.tf @@ -36,14 +36,16 @@ resource "devzero_workload_rule" "manual" { } hpa_rule = { - enabled = true - min_replicas = 1 - max_replicas = 10 - target_utilization = 0.70 - primary_metric = "cpu" + enabled = true + min_replicas = 1 + max_replicas = 10 - # External/Prometheus metric trigger + # Metric triggers: built-in CPU/Memory or external (e.g. Prometheus) metrics = [ + { + type = "CPU" + target_utilization = "0.70" + }, { type = "prometheus" target_value = "100" diff --git a/internal/gen/api/v1/apiv1connect/k8s.connect.go b/internal/gen/api/v1/apiv1connect/k8s.connect.go index bd0a870..508ba4e 100644 --- a/internal/gen/api/v1/apiv1connect/k8s.connect.go +++ b/internal/gen/api/v1/apiv1connect/k8s.connect.go @@ -85,6 +85,12 @@ const ( K8SServiceGetNodeProcedure = "/api.v1.K8SService/GetNode" // K8SServiceGetWorkloadsProcedure is the fully-qualified name of the K8SService's GetWorkloads RPC. K8SServiceGetWorkloadsProcedure = "/api.v1.K8SService/GetWorkloads" + // K8SServiceListWorkloadsPaginatedProcedure is the fully-qualified name of the K8SService's + // ListWorkloadsPaginated RPC. + K8SServiceListWorkloadsPaginatedProcedure = "/api.v1.K8SService/ListWorkloadsPaginated" + // K8SServiceGetWorkloadsSummaryProcedure is the fully-qualified name of the K8SService's + // GetWorkloadsSummary RPC. + K8SServiceGetWorkloadsSummaryProcedure = "/api.v1.K8SService/GetWorkloadsSummary" // K8SServiceGetWorkloadProcedure is the fully-qualified name of the K8SService's GetWorkload RPC. K8SServiceGetWorkloadProcedure = "/api.v1.K8SService/GetWorkload" // K8SServiceGetWorkloadContainerPercentilesProcedure is the fully-qualified name of the @@ -96,6 +102,18 @@ const ( // K8SServiceGetLatestContainerRequestLimitsProcedure is the fully-qualified name of the // K8SService's GetLatestContainerRequestLimits RPC. K8SServiceGetLatestContainerRequestLimitsProcedure = "/api.v1.K8SService/GetLatestContainerRequestLimits" + // K8SServiceGetNodeGPUMigInstancesProcedure is the fully-qualified name of the K8SService's + // GetNodeGPUMigInstances RPC. + K8SServiceGetNodeGPUMigInstancesProcedure = "/api.v1.K8SService/GetNodeGPUMigInstances" + // K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure is the fully-qualified name of the + // K8SService's GetNodeGPUMigInstanceTimeseries RPC. + K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure = "/api.v1.K8SService/GetNodeGPUMigInstanceTimeseries" + // K8SServiceGetContainerIndividualGPUMetricsProcedure is the fully-qualified name of the + // K8SService's GetContainerIndividualGPUMetrics RPC. + K8SServiceGetContainerIndividualGPUMetricsProcedure = "/api.v1.K8SService/GetContainerIndividualGPUMetrics" + // K8SServiceGetWorkloadLanguagesProcedure is the fully-qualified name of the K8SService's + // GetWorkloadLanguages RPC. + K8SServiceGetWorkloadLanguagesProcedure = "/api.v1.K8SService/GetWorkloadLanguages" // K8SServiceGetForecastWorkloadsProcedure is the fully-qualified name of the K8SService's // GetForecastWorkloads RPC. K8SServiceGetForecastWorkloadsProcedure = "/api.v1.K8SService/GetForecastWorkloads" @@ -104,6 +122,9 @@ const ( K8SServiceGetForecastWorkloadProcedure = "/api.v1.K8SService/GetForecastWorkload" // K8SServiceGetResourcesProcedure is the fully-qualified name of the K8SService's GetResources RPC. K8SServiceGetResourcesProcedure = "/api.v1.K8SService/GetResources" + // K8SServiceGetResourceFilterOptionsProcedure is the fully-qualified name of the K8SService's + // GetResourceFilterOptions RPC. + K8SServiceGetResourceFilterOptionsProcedure = "/api.v1.K8SService/GetResourceFilterOptions" // K8SServiceGetPodsProcedure is the fully-qualified name of the K8SService's GetPods RPC. K8SServiceGetPodsProcedure = "/api.v1.K8SService/GetPods" // K8SServiceGetLatestOperatorVersionProcedure is the fully-qualified name of the K8SService's @@ -153,6 +174,9 @@ const ( K8SServiceRemoveClusterTagsProcedure = "/api.v1.K8SService/RemoveClusterTags" // K8SServiceListTagsProcedure is the fully-qualified name of the K8SService's ListTags RPC. K8SServiceListTagsProcedure = "/api.v1.K8SService/ListTags" + // K8SServiceGetMigPartedConfigProcedure is the fully-qualified name of the K8SService's + // GetMigPartedConfig RPC. + K8SServiceGetMigPartedConfigProcedure = "/api.v1.K8SService/GetMigPartedConfig" // ClusterMutationServiceCreateClusterProcedure is the fully-qualified name of the // ClusterMutationService's CreateCluster RPC. ClusterMutationServiceCreateClusterProcedure = "/api.v1.ClusterMutationService/CreateCluster" @@ -216,6 +240,13 @@ type K8SServiceClient interface { GetNode(context.Context, *connect.Request[v1.GetNodeRequest]) (*connect.Response[v1.GetNodeResponse], error) // GetWorkloads retrieves all workloads for a specific cluster. GetWorkloads(context.Context, *connect.Request[v1.GetWorkloadsRequest]) (*connect.Response[v1.GetWorkloadsResponse], error) + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) // GetWorkload retrieves detailed information for a specific workload. GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) // GetWorkloadContainerPercentiles retrieves per-container percentile metrics for a workload. @@ -227,6 +258,18 @@ type K8SServiceClient interface { GetWorkloadContainerTimeSeries(context.Context, *connect.Request[v1.GetWorkloadContainerTimeSeriesRequest]) (*connect.Response[v1.GetWorkloadContainerTimeSeriesResponse], error) // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. GetLatestContainerRequestLimits(context.Context, *connect.Request[v1.GetLatestContainerRequestLimitsRequest]) (*connect.Response[v1.GetLatestContainerRequestLimitsResponse], error) + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) // GetForecastWorkloads retrieves all workloads for a specific cluster. // // Deprecated: do not use. @@ -237,6 +280,8 @@ type K8SServiceClient interface { GetForecastWorkload(context.Context, *connect.Request[v1.GetForecastWorkloadRequest]) (*connect.Response[v1.GetForecastWorkloadResponse], error) // GetResources retrivers specific resource and their details from db, simulating informer. GetResources(context.Context, *connect.Request[v1.GetResourcesRequest]) (*connect.Response[v1.GetResourcesResponse], error) + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) // GetPods retrieves Pod resources and their details from db. GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) GetLatestOperatorVersion(context.Context, *connect.Request[v1.GetLatestOperatorVersionRequest]) (*connect.Response[v1.GetLatestOperatorVersionResponse], error) @@ -264,6 +309,10 @@ type K8SServiceClient interface { RemoveClusterTags(context.Context, *connect.Request[v1.RemoveClusterTagsRequest]) (*connect.Response[v1.RemoveClusterTagsResponse], error) // ListTags lists all tags for a team. ListTags(context.Context, *connect.Request[v1.ListTagsRequest]) (*connect.Response[v1.ListTagsResponse], error) + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) } // NewK8SServiceClient constructs a client for the api.v1.K8SService service. By default, it uses @@ -366,6 +415,16 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetWorkloadsProcedure, opts..., ), + listWorkloadsPaginated: connect.NewClient[v1.ListWorkloadsPaginatedRequest, v1.ListWorkloadsPaginatedResponse]( + httpClient, + baseURL+K8SServiceListWorkloadsPaginatedProcedure, + opts..., + ), + getWorkloadsSummary: connect.NewClient[v1.GetWorkloadsSummaryRequest, v1.GetWorkloadsSummaryResponse]( + httpClient, + baseURL+K8SServiceGetWorkloadsSummaryProcedure, + opts..., + ), getWorkload: connect.NewClient[v1.GetWorkloadRequest, v1.GetWorkloadResponse]( httpClient, baseURL+K8SServiceGetWorkloadProcedure, @@ -386,6 +445,26 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetLatestContainerRequestLimitsProcedure, opts..., ), + getNodeGPUMigInstances: connect.NewClient[v1.GetNodeGPUMigInstancesRequest, v1.GetNodeGPUMigInstancesResponse]( + httpClient, + baseURL+K8SServiceGetNodeGPUMigInstancesProcedure, + opts..., + ), + getNodeGPUMigInstanceTimeseries: connect.NewClient[v1.GetNodeGPUMigInstanceTimeseriesRequest, v1.GetNodeGPUMigInstanceTimeseriesResponse]( + httpClient, + baseURL+K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure, + opts..., + ), + getContainerIndividualGPUMetrics: connect.NewClient[v1.GetContainerIndividualGPUMetricsRequest, v1.GetContainerIndividualGPUMetricsResponse]( + httpClient, + baseURL+K8SServiceGetContainerIndividualGPUMetricsProcedure, + opts..., + ), + getWorkloadLanguages: connect.NewClient[v1.GetWorkloadLanguagesRequest, v1.GetWorkloadLanguagesResponse]( + httpClient, + baseURL+K8SServiceGetWorkloadLanguagesProcedure, + opts..., + ), getForecastWorkloads: connect.NewClient[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse]( httpClient, baseURL+K8SServiceGetForecastWorkloadsProcedure, @@ -401,6 +480,11 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceGetResourcesProcedure, opts..., ), + getResourceFilterOptions: connect.NewClient[v1.GetResourceFilterOptionsRequest, v1.GetResourceFilterOptionsResponse]( + httpClient, + baseURL+K8SServiceGetResourceFilterOptionsProcedure, + opts..., + ), getPods: connect.NewClient[v1.GetPodsRequest, v1.GetPodsResponse]( httpClient, baseURL+K8SServiceGetPodsProcedure, @@ -486,53 +570,66 @@ func NewK8SServiceClient(httpClient connect.HTTPClient, baseURL string, opts ... baseURL+K8SServiceListTagsProcedure, opts..., ), + getMigPartedConfig: connect.NewClient[v1.GetMigPartedConfigRequest, v1.GetMigPartedConfigResponse]( + httpClient, + baseURL+K8SServiceGetMigPartedConfigProcedure, + opts..., + ), } } // k8SServiceClient implements K8SServiceClient. type k8SServiceClient struct { - getWorkloadsStats *connect.Client[v1.GetWorkloadsStatsRequest, v1.GetWorkloadsStatsResponse] - getClusters *connect.Client[v1.GetClustersRequest, v1.GetClustersResponse] - listClusters *connect.Client[v1.ListClustersRequest, v1.ListClustersResponse] - getCluster *connect.Client[v1.GetClusterRequest, v1.GetClusterResponse] - getClusterMetadata *connect.Client[v1.GetClusterMetadataRequest, v1.GetClusterMetadataResponse] - getAllNamespaces *connect.Client[v1.GetAllNamespacesRequest, v1.GetAllNamespacesResponse] - searchNamespacesByCluster *connect.Client[v1.SearchNamespacesByClusterRequest, v1.SearchNamespacesByClusterResponse] - listNamespacesByCluster *connect.Client[v1.ListNamespacesByClusterRequest, v1.ListNamespacesByClusterResponse] - getAllWorkloadNames *connect.Client[v1.GetAllWorkloadNamesRequest, v1.GetAllWorkloadNamesResponse] - getAllWorkloadLabels *connect.Client[v1.GetAllWorkloadLabelsRequest, v1.GetAllWorkloadLabelsResponse] - getAllNodeGroupNames *connect.Client[v1.GetAllNodeGroupNamesRequest, v1.GetAllNodeGroupNamesResponse] - metadataForWorkloads *connect.Client[v1.MetadataForWorkloadsRequest, v1.MetadataForWorkloadsResponse] - getNodeGroups *connect.Client[v1.GetNodeGroupsRequest, v1.GetNodeGroupsResponse] - getAllNodeGroups *connect.Client[v1.GetAllNodeGroupsRequest, v1.GetAllNodeGroupsResponse] - getNodeGroupsUtilization *connect.Client[v1.GetNodeGroupsUtilizationRequest, v1.GetNodeGroupsUtilizationResponse] - getNodeGroup *connect.Client[v1.GetNodeGroupRequest, v1.GetNodeGroupResponse] - getNode *connect.Client[v1.GetNodeRequest, v1.GetNodeResponse] - getWorkloads *connect.Client[v1.GetWorkloadsRequest, v1.GetWorkloadsResponse] - getWorkload *connect.Client[v1.GetWorkloadRequest, v1.GetWorkloadResponse] - getWorkloadContainerPercentiles *connect.Client[v1.GetWorkloadContainerPercentilesRequest, v1.GetWorkloadContainerPercentilesResponse] - getWorkloadContainerTimeSeries *connect.Client[v1.GetWorkloadContainerTimeSeriesRequest, v1.GetWorkloadContainerTimeSeriesResponse] - getLatestContainerRequestLimits *connect.Client[v1.GetLatestContainerRequestLimitsRequest, v1.GetLatestContainerRequestLimitsResponse] - getForecastWorkloads *connect.Client[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse] - getForecastWorkload *connect.Client[v1.GetForecastWorkloadRequest, v1.GetForecastWorkloadResponse] - getResources *connect.Client[v1.GetResourcesRequest, v1.GetResourcesResponse] - getPods *connect.Client[v1.GetPodsRequest, v1.GetPodsResponse] - getLatestOperatorVersion *connect.Client[v1.GetLatestOperatorVersionRequest, v1.GetLatestOperatorVersionResponse] - galaxyGetWorkloadPerspective *connect.Client[v1.GalaxyGetWorkloadPerspectiveRequest, v1.GalaxyGetWorkloadPerspectiveResponse] - listAuditLogs *connect.Client[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] - listAuditLogOriginators *connect.Client[v1.ListAuditLogOriginatorsRequest, v1.ListAuditLogOriginatorsResponse] - sendWorkloadEmail *connect.Client[v1.SendWorkloadEmailRequest, v1.SendWorkloadEmailResponse] - sendWeeklySummaryEmail *connect.Client[v1.SendWeeklySummaryEmailRequest, v1.SendWeeklySummaryEmailResponse] - getClustersNodeInfo *connect.Client[v1.GetClustersNodeInfoRequest, v1.GetClustersNodeInfoResponse] - searchK8SResources *connect.Client[v1.SearchK8SResourcesRequest, v1.SearchK8SResourcesResponse] - searchK8SWorkloads *connect.Client[v1.SearchK8SWorkloadsRequest, v1.SearchK8SWorkloadsResponse] - getClusterType *connect.Client[v1.GetClusterTypeRequest, v1.GetClusterTypeResponse] - getRelationsForKind *connect.Client[v1.GetRelatedResourcesRequest, v1.GetRelatedResourcesResponse] - lookupNodeInstance *connect.Client[v1.LookupNodeInstanceRequest, v1.LookupNodeInstanceResponse] - getWorkloadPodHistory *connect.Client[v1.GetWorkloadPodHistoryRequest, v1.GetWorkloadPodHistoryResponse] - addClusterTags *connect.Client[v1.AddClusterTagsRequest, v1.AddClusterTagsResponse] - removeClusterTags *connect.Client[v1.RemoveClusterTagsRequest, v1.RemoveClusterTagsResponse] - listTags *connect.Client[v1.ListTagsRequest, v1.ListTagsResponse] + getWorkloadsStats *connect.Client[v1.GetWorkloadsStatsRequest, v1.GetWorkloadsStatsResponse] + getClusters *connect.Client[v1.GetClustersRequest, v1.GetClustersResponse] + listClusters *connect.Client[v1.ListClustersRequest, v1.ListClustersResponse] + getCluster *connect.Client[v1.GetClusterRequest, v1.GetClusterResponse] + getClusterMetadata *connect.Client[v1.GetClusterMetadataRequest, v1.GetClusterMetadataResponse] + getAllNamespaces *connect.Client[v1.GetAllNamespacesRequest, v1.GetAllNamespacesResponse] + searchNamespacesByCluster *connect.Client[v1.SearchNamespacesByClusterRequest, v1.SearchNamespacesByClusterResponse] + listNamespacesByCluster *connect.Client[v1.ListNamespacesByClusterRequest, v1.ListNamespacesByClusterResponse] + getAllWorkloadNames *connect.Client[v1.GetAllWorkloadNamesRequest, v1.GetAllWorkloadNamesResponse] + getAllWorkloadLabels *connect.Client[v1.GetAllWorkloadLabelsRequest, v1.GetAllWorkloadLabelsResponse] + getAllNodeGroupNames *connect.Client[v1.GetAllNodeGroupNamesRequest, v1.GetAllNodeGroupNamesResponse] + metadataForWorkloads *connect.Client[v1.MetadataForWorkloadsRequest, v1.MetadataForWorkloadsResponse] + getNodeGroups *connect.Client[v1.GetNodeGroupsRequest, v1.GetNodeGroupsResponse] + getAllNodeGroups *connect.Client[v1.GetAllNodeGroupsRequest, v1.GetAllNodeGroupsResponse] + getNodeGroupsUtilization *connect.Client[v1.GetNodeGroupsUtilizationRequest, v1.GetNodeGroupsUtilizationResponse] + getNodeGroup *connect.Client[v1.GetNodeGroupRequest, v1.GetNodeGroupResponse] + getNode *connect.Client[v1.GetNodeRequest, v1.GetNodeResponse] + getWorkloads *connect.Client[v1.GetWorkloadsRequest, v1.GetWorkloadsResponse] + listWorkloadsPaginated *connect.Client[v1.ListWorkloadsPaginatedRequest, v1.ListWorkloadsPaginatedResponse] + getWorkloadsSummary *connect.Client[v1.GetWorkloadsSummaryRequest, v1.GetWorkloadsSummaryResponse] + getWorkload *connect.Client[v1.GetWorkloadRequest, v1.GetWorkloadResponse] + getWorkloadContainerPercentiles *connect.Client[v1.GetWorkloadContainerPercentilesRequest, v1.GetWorkloadContainerPercentilesResponse] + getWorkloadContainerTimeSeries *connect.Client[v1.GetWorkloadContainerTimeSeriesRequest, v1.GetWorkloadContainerTimeSeriesResponse] + getLatestContainerRequestLimits *connect.Client[v1.GetLatestContainerRequestLimitsRequest, v1.GetLatestContainerRequestLimitsResponse] + getNodeGPUMigInstances *connect.Client[v1.GetNodeGPUMigInstancesRequest, v1.GetNodeGPUMigInstancesResponse] + getNodeGPUMigInstanceTimeseries *connect.Client[v1.GetNodeGPUMigInstanceTimeseriesRequest, v1.GetNodeGPUMigInstanceTimeseriesResponse] + getContainerIndividualGPUMetrics *connect.Client[v1.GetContainerIndividualGPUMetricsRequest, v1.GetContainerIndividualGPUMetricsResponse] + getWorkloadLanguages *connect.Client[v1.GetWorkloadLanguagesRequest, v1.GetWorkloadLanguagesResponse] + getForecastWorkloads *connect.Client[v1.GetForecastWorkloadsRequest, v1.GetForecastWorkloadsResponse] + getForecastWorkload *connect.Client[v1.GetForecastWorkloadRequest, v1.GetForecastWorkloadResponse] + getResources *connect.Client[v1.GetResourcesRequest, v1.GetResourcesResponse] + getResourceFilterOptions *connect.Client[v1.GetResourceFilterOptionsRequest, v1.GetResourceFilterOptionsResponse] + getPods *connect.Client[v1.GetPodsRequest, v1.GetPodsResponse] + getLatestOperatorVersion *connect.Client[v1.GetLatestOperatorVersionRequest, v1.GetLatestOperatorVersionResponse] + galaxyGetWorkloadPerspective *connect.Client[v1.GalaxyGetWorkloadPerspectiveRequest, v1.GalaxyGetWorkloadPerspectiveResponse] + listAuditLogs *connect.Client[v1.ListAuditLogsRequest, v1.ListAuditLogsResponse] + listAuditLogOriginators *connect.Client[v1.ListAuditLogOriginatorsRequest, v1.ListAuditLogOriginatorsResponse] + sendWorkloadEmail *connect.Client[v1.SendWorkloadEmailRequest, v1.SendWorkloadEmailResponse] + sendWeeklySummaryEmail *connect.Client[v1.SendWeeklySummaryEmailRequest, v1.SendWeeklySummaryEmailResponse] + getClustersNodeInfo *connect.Client[v1.GetClustersNodeInfoRequest, v1.GetClustersNodeInfoResponse] + searchK8SResources *connect.Client[v1.SearchK8SResourcesRequest, v1.SearchK8SResourcesResponse] + searchK8SWorkloads *connect.Client[v1.SearchK8SWorkloadsRequest, v1.SearchK8SWorkloadsResponse] + getClusterType *connect.Client[v1.GetClusterTypeRequest, v1.GetClusterTypeResponse] + getRelationsForKind *connect.Client[v1.GetRelatedResourcesRequest, v1.GetRelatedResourcesResponse] + lookupNodeInstance *connect.Client[v1.LookupNodeInstanceRequest, v1.LookupNodeInstanceResponse] + getWorkloadPodHistory *connect.Client[v1.GetWorkloadPodHistoryRequest, v1.GetWorkloadPodHistoryResponse] + addClusterTags *connect.Client[v1.AddClusterTagsRequest, v1.AddClusterTagsResponse] + removeClusterTags *connect.Client[v1.RemoveClusterTagsRequest, v1.RemoveClusterTagsResponse] + listTags *connect.Client[v1.ListTagsRequest, v1.ListTagsResponse] + getMigPartedConfig *connect.Client[v1.GetMigPartedConfigRequest, v1.GetMigPartedConfigResponse] } // GetWorkloadsStats calls api.v1.K8SService.GetWorkloadsStats. @@ -627,6 +724,16 @@ func (c *k8SServiceClient) GetWorkloads(ctx context.Context, req *connect.Reques return c.getWorkloads.CallUnary(ctx, req) } +// ListWorkloadsPaginated calls api.v1.K8SService.ListWorkloadsPaginated. +func (c *k8SServiceClient) ListWorkloadsPaginated(ctx context.Context, req *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) { + return c.listWorkloadsPaginated.CallUnary(ctx, req) +} + +// GetWorkloadsSummary calls api.v1.K8SService.GetWorkloadsSummary. +func (c *k8SServiceClient) GetWorkloadsSummary(ctx context.Context, req *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) { + return c.getWorkloadsSummary.CallUnary(ctx, req) +} + // GetWorkload calls api.v1.K8SService.GetWorkload. func (c *k8SServiceClient) GetWorkload(ctx context.Context, req *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) { return c.getWorkload.CallUnary(ctx, req) @@ -647,6 +754,26 @@ func (c *k8SServiceClient) GetLatestContainerRequestLimits(ctx context.Context, return c.getLatestContainerRequestLimits.CallUnary(ctx, req) } +// GetNodeGPUMigInstances calls api.v1.K8SService.GetNodeGPUMigInstances. +func (c *k8SServiceClient) GetNodeGPUMigInstances(ctx context.Context, req *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) { + return c.getNodeGPUMigInstances.CallUnary(ctx, req) +} + +// GetNodeGPUMigInstanceTimeseries calls api.v1.K8SService.GetNodeGPUMigInstanceTimeseries. +func (c *k8SServiceClient) GetNodeGPUMigInstanceTimeseries(ctx context.Context, req *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) { + return c.getNodeGPUMigInstanceTimeseries.CallUnary(ctx, req) +} + +// GetContainerIndividualGPUMetrics calls api.v1.K8SService.GetContainerIndividualGPUMetrics. +func (c *k8SServiceClient) GetContainerIndividualGPUMetrics(ctx context.Context, req *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) { + return c.getContainerIndividualGPUMetrics.CallUnary(ctx, req) +} + +// GetWorkloadLanguages calls api.v1.K8SService.GetWorkloadLanguages. +func (c *k8SServiceClient) GetWorkloadLanguages(ctx context.Context, req *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) { + return c.getWorkloadLanguages.CallUnary(ctx, req) +} + // GetForecastWorkloads calls api.v1.K8SService.GetForecastWorkloads. // // Deprecated: do not use. @@ -666,6 +793,11 @@ func (c *k8SServiceClient) GetResources(ctx context.Context, req *connect.Reques return c.getResources.CallUnary(ctx, req) } +// GetResourceFilterOptions calls api.v1.K8SService.GetResourceFilterOptions. +func (c *k8SServiceClient) GetResourceFilterOptions(ctx context.Context, req *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) { + return c.getResourceFilterOptions.CallUnary(ctx, req) +} + // GetPods calls api.v1.K8SService.GetPods. func (c *k8SServiceClient) GetPods(ctx context.Context, req *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) { return c.getPods.CallUnary(ctx, req) @@ -751,6 +883,11 @@ func (c *k8SServiceClient) ListTags(ctx context.Context, req *connect.Request[v1 return c.listTags.CallUnary(ctx, req) } +// GetMigPartedConfig calls api.v1.K8SService.GetMigPartedConfig. +func (c *k8SServiceClient) GetMigPartedConfig(ctx context.Context, req *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) { + return c.getMigPartedConfig.CallUnary(ctx, req) +} + // K8SServiceHandler is an implementation of the api.v1.K8SService service. type K8SServiceHandler interface { // GetWorkloadsStats retrieves stats for workloads in a specific cluster. @@ -791,6 +928,13 @@ type K8SServiceHandler interface { GetNode(context.Context, *connect.Request[v1.GetNodeRequest]) (*connect.Response[v1.GetNodeResponse], error) // GetWorkloads retrieves all workloads for a specific cluster. GetWorkloads(context.Context, *connect.Request[v1.GetWorkloadsRequest]) (*connect.Response[v1.GetWorkloadsResponse], error) + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) // GetWorkload retrieves detailed information for a specific workload. GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) // GetWorkloadContainerPercentiles retrieves per-container percentile metrics for a workload. @@ -802,6 +946,18 @@ type K8SServiceHandler interface { GetWorkloadContainerTimeSeries(context.Context, *connect.Request[v1.GetWorkloadContainerTimeSeriesRequest]) (*connect.Response[v1.GetWorkloadContainerTimeSeriesResponse], error) // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. GetLatestContainerRequestLimits(context.Context, *connect.Request[v1.GetLatestContainerRequestLimitsRequest]) (*connect.Response[v1.GetLatestContainerRequestLimitsResponse], error) + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) // GetForecastWorkloads retrieves all workloads for a specific cluster. // // Deprecated: do not use. @@ -812,6 +968,8 @@ type K8SServiceHandler interface { GetForecastWorkload(context.Context, *connect.Request[v1.GetForecastWorkloadRequest]) (*connect.Response[v1.GetForecastWorkloadResponse], error) // GetResources retrivers specific resource and their details from db, simulating informer. GetResources(context.Context, *connect.Request[v1.GetResourcesRequest]) (*connect.Response[v1.GetResourcesResponse], error) + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) // GetPods retrieves Pod resources and their details from db. GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) GetLatestOperatorVersion(context.Context, *connect.Request[v1.GetLatestOperatorVersionRequest]) (*connect.Response[v1.GetLatestOperatorVersionResponse], error) @@ -839,6 +997,10 @@ type K8SServiceHandler interface { RemoveClusterTags(context.Context, *connect.Request[v1.RemoveClusterTagsRequest]) (*connect.Response[v1.RemoveClusterTagsResponse], error) // ListTags lists all tags for a team. ListTags(context.Context, *connect.Request[v1.ListTagsRequest]) (*connect.Response[v1.ListTagsResponse], error) + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) } // NewK8SServiceHandler builds an HTTP handler from the service implementation. It returns the path @@ -937,6 +1099,16 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetWorkloads, opts..., ) + k8SServiceListWorkloadsPaginatedHandler := connect.NewUnaryHandler( + K8SServiceListWorkloadsPaginatedProcedure, + svc.ListWorkloadsPaginated, + opts..., + ) + k8SServiceGetWorkloadsSummaryHandler := connect.NewUnaryHandler( + K8SServiceGetWorkloadsSummaryProcedure, + svc.GetWorkloadsSummary, + opts..., + ) k8SServiceGetWorkloadHandler := connect.NewUnaryHandler( K8SServiceGetWorkloadProcedure, svc.GetWorkload, @@ -957,6 +1129,26 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetLatestContainerRequestLimits, opts..., ) + k8SServiceGetNodeGPUMigInstancesHandler := connect.NewUnaryHandler( + K8SServiceGetNodeGPUMigInstancesProcedure, + svc.GetNodeGPUMigInstances, + opts..., + ) + k8SServiceGetNodeGPUMigInstanceTimeseriesHandler := connect.NewUnaryHandler( + K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure, + svc.GetNodeGPUMigInstanceTimeseries, + opts..., + ) + k8SServiceGetContainerIndividualGPUMetricsHandler := connect.NewUnaryHandler( + K8SServiceGetContainerIndividualGPUMetricsProcedure, + svc.GetContainerIndividualGPUMetrics, + opts..., + ) + k8SServiceGetWorkloadLanguagesHandler := connect.NewUnaryHandler( + K8SServiceGetWorkloadLanguagesProcedure, + svc.GetWorkloadLanguages, + opts..., + ) k8SServiceGetForecastWorkloadsHandler := connect.NewUnaryHandler( K8SServiceGetForecastWorkloadsProcedure, svc.GetForecastWorkloads, @@ -972,6 +1164,11 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.GetResources, opts..., ) + k8SServiceGetResourceFilterOptionsHandler := connect.NewUnaryHandler( + K8SServiceGetResourceFilterOptionsProcedure, + svc.GetResourceFilterOptions, + opts..., + ) k8SServiceGetPodsHandler := connect.NewUnaryHandler( K8SServiceGetPodsProcedure, svc.GetPods, @@ -1057,6 +1254,11 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) svc.ListTags, opts..., ) + k8SServiceGetMigPartedConfigHandler := connect.NewUnaryHandler( + K8SServiceGetMigPartedConfigProcedure, + svc.GetMigPartedConfig, + opts..., + ) return "/api.v1.K8SService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case K8SServiceGetWorkloadsStatsProcedure: @@ -1095,6 +1297,10 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceGetNodeHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadsProcedure: k8SServiceGetWorkloadsHandler.ServeHTTP(w, r) + case K8SServiceListWorkloadsPaginatedProcedure: + k8SServiceListWorkloadsPaginatedHandler.ServeHTTP(w, r) + case K8SServiceGetWorkloadsSummaryProcedure: + k8SServiceGetWorkloadsSummaryHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadProcedure: k8SServiceGetWorkloadHandler.ServeHTTP(w, r) case K8SServiceGetWorkloadContainerPercentilesProcedure: @@ -1103,12 +1309,22 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceGetWorkloadContainerTimeSeriesHandler.ServeHTTP(w, r) case K8SServiceGetLatestContainerRequestLimitsProcedure: k8SServiceGetLatestContainerRequestLimitsHandler.ServeHTTP(w, r) + case K8SServiceGetNodeGPUMigInstancesProcedure: + k8SServiceGetNodeGPUMigInstancesHandler.ServeHTTP(w, r) + case K8SServiceGetNodeGPUMigInstanceTimeseriesProcedure: + k8SServiceGetNodeGPUMigInstanceTimeseriesHandler.ServeHTTP(w, r) + case K8SServiceGetContainerIndividualGPUMetricsProcedure: + k8SServiceGetContainerIndividualGPUMetricsHandler.ServeHTTP(w, r) + case K8SServiceGetWorkloadLanguagesProcedure: + k8SServiceGetWorkloadLanguagesHandler.ServeHTTP(w, r) case K8SServiceGetForecastWorkloadsProcedure: k8SServiceGetForecastWorkloadsHandler.ServeHTTP(w, r) case K8SServiceGetForecastWorkloadProcedure: k8SServiceGetForecastWorkloadHandler.ServeHTTP(w, r) case K8SServiceGetResourcesProcedure: k8SServiceGetResourcesHandler.ServeHTTP(w, r) + case K8SServiceGetResourceFilterOptionsProcedure: + k8SServiceGetResourceFilterOptionsHandler.ServeHTTP(w, r) case K8SServiceGetPodsProcedure: k8SServiceGetPodsHandler.ServeHTTP(w, r) case K8SServiceGetLatestOperatorVersionProcedure: @@ -1143,6 +1359,8 @@ func NewK8SServiceHandler(svc K8SServiceHandler, opts ...connect.HandlerOption) k8SServiceRemoveClusterTagsHandler.ServeHTTP(w, r) case K8SServiceListTagsProcedure: k8SServiceListTagsHandler.ServeHTTP(w, r) + case K8SServiceGetMigPartedConfigProcedure: + k8SServiceGetMigPartedConfigHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -1224,6 +1442,14 @@ func (UnimplementedK8SServiceHandler) GetWorkloads(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloads is not implemented")) } +func (UnimplementedK8SServiceHandler) ListWorkloadsPaginated(context.Context, *connect.Request[v1.ListWorkloadsPaginatedRequest]) (*connect.Response[v1.ListWorkloadsPaginatedResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.ListWorkloadsPaginated is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetWorkloadsSummary(context.Context, *connect.Request[v1.GetWorkloadsSummaryRequest]) (*connect.Response[v1.GetWorkloadsSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloadsSummary is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetWorkload(context.Context, *connect.Request[v1.GetWorkloadRequest]) (*connect.Response[v1.GetWorkloadResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkload is not implemented")) } @@ -1240,6 +1466,22 @@ func (UnimplementedK8SServiceHandler) GetLatestContainerRequestLimits(context.Co return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetLatestContainerRequestLimits is not implemented")) } +func (UnimplementedK8SServiceHandler) GetNodeGPUMigInstances(context.Context, *connect.Request[v1.GetNodeGPUMigInstancesRequest]) (*connect.Response[v1.GetNodeGPUMigInstancesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetNodeGPUMigInstances is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetNodeGPUMigInstanceTimeseries(context.Context, *connect.Request[v1.GetNodeGPUMigInstanceTimeseriesRequest]) (*connect.Response[v1.GetNodeGPUMigInstanceTimeseriesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetNodeGPUMigInstanceTimeseries is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetContainerIndividualGPUMetrics(context.Context, *connect.Request[v1.GetContainerIndividualGPUMetricsRequest]) (*connect.Response[v1.GetContainerIndividualGPUMetricsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetContainerIndividualGPUMetrics is not implemented")) +} + +func (UnimplementedK8SServiceHandler) GetWorkloadLanguages(context.Context, *connect.Request[v1.GetWorkloadLanguagesRequest]) (*connect.Response[v1.GetWorkloadLanguagesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetWorkloadLanguages is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetForecastWorkloads(context.Context, *connect.Request[v1.GetForecastWorkloadsRequest]) (*connect.Response[v1.GetForecastWorkloadsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetForecastWorkloads is not implemented")) } @@ -1252,6 +1494,10 @@ func (UnimplementedK8SServiceHandler) GetResources(context.Context, *connect.Req return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetResources is not implemented")) } +func (UnimplementedK8SServiceHandler) GetResourceFilterOptions(context.Context, *connect.Request[v1.GetResourceFilterOptionsRequest]) (*connect.Response[v1.GetResourceFilterOptionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetResourceFilterOptions is not implemented")) +} + func (UnimplementedK8SServiceHandler) GetPods(context.Context, *connect.Request[v1.GetPodsRequest]) (*connect.Response[v1.GetPodsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetPods is not implemented")) } @@ -1320,6 +1566,10 @@ func (UnimplementedK8SServiceHandler) ListTags(context.Context, *connect.Request return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.ListTags is not implemented")) } +func (UnimplementedK8SServiceHandler) GetMigPartedConfig(context.Context, *connect.Request[v1.GetMigPartedConfigRequest]) (*connect.Response[v1.GetMigPartedConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8SService.GetMigPartedConfig is not implemented")) +} + // ClusterMutationServiceClient is a client for the api.v1.ClusterMutationService service. type ClusterMutationServiceClient interface { // CreateCluster creates a new cluster. diff --git a/internal/gen/api/v1/apiv1connect/profiling.connect.go b/internal/gen/api/v1/apiv1connect/profiling.connect.go index 6ed91ad..bd5ad67 100644 --- a/internal/gen/api/v1/apiv1connect/profiling.connect.go +++ b/internal/gen/api/v1/apiv1connect/profiling.connect.go @@ -36,11 +36,19 @@ const ( // ProfilingServiceGetWorkloadProfilesProcedure is the fully-qualified name of the // ProfilingService's GetWorkloadProfiles RPC. ProfilingServiceGetWorkloadProfilesProcedure = "/api.v1.ProfilingService/GetWorkloadProfiles" + // ProfilingServiceGetWorkloadProfileAvailabilityProcedure is the fully-qualified name of the + // ProfilingService's GetWorkloadProfileAvailability RPC. + ProfilingServiceGetWorkloadProfileAvailabilityProcedure = "/api.v1.ProfilingService/GetWorkloadProfileAvailability" ) // ProfilingServiceClient is a client for the api.v1.ProfilingService service. type ProfilingServiceClient interface { GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) } // NewProfilingServiceClient constructs a client for the api.v1.ProfilingService service. By @@ -58,12 +66,18 @@ func NewProfilingServiceClient(httpClient connect.HTTPClient, baseURL string, op baseURL+ProfilingServiceGetWorkloadProfilesProcedure, opts..., ), + getWorkloadProfileAvailability: connect.NewClient[v1.GetWorkloadProfileAvailabilityRequest, v1.GetWorkloadProfileAvailabilityResponse]( + httpClient, + baseURL+ProfilingServiceGetWorkloadProfileAvailabilityProcedure, + opts..., + ), } } // profilingServiceClient implements ProfilingServiceClient. type profilingServiceClient struct { - getWorkloadProfiles *connect.Client[v1.GetWorkloadProfilesRequest, v1.GetWorkloadProfilesResponse] + getWorkloadProfiles *connect.Client[v1.GetWorkloadProfilesRequest, v1.GetWorkloadProfilesResponse] + getWorkloadProfileAvailability *connect.Client[v1.GetWorkloadProfileAvailabilityRequest, v1.GetWorkloadProfileAvailabilityResponse] } // GetWorkloadProfiles calls api.v1.ProfilingService.GetWorkloadProfiles. @@ -71,9 +85,19 @@ func (c *profilingServiceClient) GetWorkloadProfiles(ctx context.Context, req *c return c.getWorkloadProfiles.CallUnary(ctx, req) } +// GetWorkloadProfileAvailability calls api.v1.ProfilingService.GetWorkloadProfileAvailability. +func (c *profilingServiceClient) GetWorkloadProfileAvailability(ctx context.Context, req *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) { + return c.getWorkloadProfileAvailability.CallUnary(ctx, req) +} + // ProfilingServiceHandler is an implementation of the api.v1.ProfilingService service. type ProfilingServiceHandler interface { GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) } // NewProfilingServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -87,10 +111,17 @@ func NewProfilingServiceHandler(svc ProfilingServiceHandler, opts ...connect.Han svc.GetWorkloadProfiles, opts..., ) + profilingServiceGetWorkloadProfileAvailabilityHandler := connect.NewUnaryHandler( + ProfilingServiceGetWorkloadProfileAvailabilityProcedure, + svc.GetWorkloadProfileAvailability, + opts..., + ) return "/api.v1.ProfilingService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case ProfilingServiceGetWorkloadProfilesProcedure: profilingServiceGetWorkloadProfilesHandler.ServeHTTP(w, r) + case ProfilingServiceGetWorkloadProfileAvailabilityProcedure: + profilingServiceGetWorkloadProfileAvailabilityHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -103,3 +134,7 @@ type UnimplementedProfilingServiceHandler struct{} func (UnimplementedProfilingServiceHandler) GetWorkloadProfiles(context.Context, *connect.Request[v1.GetWorkloadProfilesRequest]) (*connect.Response[v1.GetWorkloadProfilesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.ProfilingService.GetWorkloadProfiles is not implemented")) } + +func (UnimplementedProfilingServiceHandler) GetWorkloadProfileAvailability(context.Context, *connect.Request[v1.GetWorkloadProfileAvailabilityRequest]) (*connect.Response[v1.GetWorkloadProfileAvailabilityResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.ProfilingService.GetWorkloadProfileAvailability is not implemented")) +} diff --git a/internal/gen/api/v1/apiv1connect/recommendation.connect.go b/internal/gen/api/v1/apiv1connect/recommendation.connect.go index 8c85cd8..7484237 100644 --- a/internal/gen/api/v1/apiv1connect/recommendation.connect.go +++ b/internal/gen/api/v1/apiv1connect/recommendation.connect.go @@ -203,6 +203,12 @@ const ( // K8SRecommendationServiceSuggestedKarpenterConfigProcedure is the fully-qualified name of the // K8sRecommendationService's SuggestedKarpenterConfig RPC. K8SRecommendationServiceSuggestedKarpenterConfigProcedure = "/api.v1.K8sRecommendationService/SuggestedKarpenterConfig" + // K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure is the fully-qualified name of the + // K8sRecommendationService's SuggestNodePolicyImprovements RPC. + K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure = "/api.v1.K8sRecommendationService/SuggestNodePolicyImprovements" + // K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListClusterNodePolicySuggestions RPC. + K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure = "/api.v1.K8sRecommendationService/ListClusterNodePolicySuggestions" // K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure is the fully-qualified name of // the K8sRecommendationService's GenerateNodePoliciesFromKarpenter RPC. K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure = "/api.v1.K8sRecommendationService/GenerateNodePoliciesFromKarpenter" @@ -221,15 +227,42 @@ const ( // K8SRecommendationServiceGetCheckpointApplyStatusProcedure is the fully-qualified name of the // K8sRecommendationService's GetCheckpointApplyStatus RPC. K8SRecommendationServiceGetCheckpointApplyStatusProcedure = "/api.v1.K8sRecommendationService/GetCheckpointApplyStatus" + // K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure is the fully-qualified name of + // the K8sRecommendationService's GetClusterCheckpointLabelCoverage RPC. + K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure = "/api.v1.K8sRecommendationService/GetClusterCheckpointLabelCoverage" + // K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure is the fully-qualified name of + // the K8sRecommendationService's ListNodeGroupCheckpointLabelState RPC. + K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure = "/api.v1.K8sRecommendationService/ListNodeGroupCheckpointLabelState" // K8SRecommendationServiceGetNodeAnnotationReadinessProcedure is the fully-qualified name of the // K8sRecommendationService's GetNodeAnnotationReadiness RPC. K8SRecommendationServiceGetNodeAnnotationReadinessProcedure = "/api.v1.K8sRecommendationService/GetNodeAnnotationReadiness" + // K8SRecommendationServiceDetectClusterAutoscalerProcedure is the fully-qualified name of the + // K8sRecommendationService's DetectClusterAutoscaler RPC. + K8SRecommendationServiceDetectClusterAutoscalerProcedure = "/api.v1.K8sRecommendationService/DetectClusterAutoscaler" // K8SRecommendationServiceGetMigrationStateProcedure is the fully-qualified name of the // K8sRecommendationService's GetMigrationState RPC. K8SRecommendationServiceGetMigrationStateProcedure = "/api.v1.K8sRecommendationService/GetMigrationState" // K8SRecommendationServiceUpdateMigrationStateProcedure is the fully-qualified name of the // K8sRecommendationService's UpdateMigrationState RPC. K8SRecommendationServiceUpdateMigrationStateProcedure = "/api.v1.K8sRecommendationService/UpdateMigrationState" + // K8SRecommendationServiceGetKarpenterMigrationStateProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterMigrationState RPC. + K8SRecommendationServiceGetKarpenterMigrationStateProcedure = "/api.v1.K8sRecommendationService/GetKarpenterMigrationState" + // K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateKarpenterMigrationState RPC. + K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure = "/api.v1.K8sRecommendationService/UpdateKarpenterMigrationState" + // K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure is the fully-qualified name of + // the K8sRecommendationService's DetectKarpenterOwnershipConflicts RPC. + K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure = "/api.v1.K8sRecommendationService/DetectKarpenterOwnershipConflicts" + // K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure is the fully-qualified + // name of the K8sRecommendationService's AcknowledgeKarpenterOwnershipConflict RPC. + K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure = "/api.v1.K8sRecommendationService/AcknowledgeKarpenterOwnershipConflict" + // K8SRecommendationServiceGetKarpenterSourceResourcesProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterSourceResources RPC. + K8SRecommendationServiceGetKarpenterSourceResourcesProcedure = "/api.v1.K8sRecommendationService/GetKarpenterSourceResources" + // K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure is the fully-qualified name of the + // K8sRecommendationService's GetKarpenterAdoptionStatus RPC. + K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure = "/api.v1.K8sRecommendationService/GetKarpenterAdoptionStatus" // K8SRecommendationServiceReportNodePoolValidationProcedure is the fully-qualified name of the // K8sRecommendationService's ReportNodePoolValidation RPC. K8SRecommendationServiceReportNodePoolValidationProcedure = "/api.v1.K8sRecommendationService/ReportNodePoolValidation" @@ -257,6 +290,9 @@ const ( // K8SRecommendationServiceGetInstanceCategoriesProcedure is the fully-qualified name of the // K8sRecommendationService's GetInstanceCategories RPC. K8SRecommendationServiceGetInstanceCategoriesProcedure = "/api.v1.K8sRecommendationService/GetInstanceCategories" + // K8SRecommendationServiceGetInstanceShapesProcedure is the fully-qualified name of the + // K8sRecommendationService's GetInstanceShapes RPC. + K8SRecommendationServiceGetInstanceShapesProcedure = "/api.v1.K8sRecommendationService/GetInstanceShapes" // K8SRecommendationServiceGetInstanceCPUsProcedure is the fully-qualified name of the // K8sRecommendationService's GetInstanceCPUs RPC. K8SRecommendationServiceGetInstanceCPUsProcedure = "/api.v1.K8sRecommendationService/GetInstanceCPUs" @@ -275,6 +311,9 @@ const ( // K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure is the fully-qualified name of // the K8sRecommendationService's GetPDBRecommendationForWorkload RPC. K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure = "/api.v1.K8sRecommendationService/GetPDBRecommendationForWorkload" + // K8SRecommendationServiceListWorkloadStructuralHealthProcedure is the fully-qualified name of the + // K8sRecommendationService's ListWorkloadStructuralHealth RPC. + K8SRecommendationServiceListWorkloadStructuralHealthProcedure = "/api.v1.K8sRecommendationService/ListWorkloadStructuralHealth" // K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's CreateStorageRecommendationPolicy RPC. K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure = "/api.v1.K8sRecommendationService/CreateStorageRecommendationPolicy" @@ -338,15 +377,48 @@ const ( // K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure is the fully-qualified name of the // K8sRecommendationService's GetWorkloadOptimizationPolicy RPC. K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/GetWorkloadOptimizationPolicy" + // K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure is the fully-qualified + // name of the K8sRecommendationService's GetWorkloadOptimizationPolicyByWorkload RPC. + K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure = "/api.v1.K8sRecommendationService/GetWorkloadOptimizationPolicyByWorkload" // K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's UpdateWorkloadOptimizationPolicy RPC. K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateWorkloadOptimizationPolicy" + // K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure is the fully-qualified + // name of the K8sRecommendationService's ToggleWorkloadOptimizationPolicyDisabled RPC. + K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleWorkloadOptimizationPolicyDisabled" // K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure is the fully-qualified name of // the K8sRecommendationService's DeleteWorkloadOptimizationPolicy RPC. K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteWorkloadOptimizationPolicy" + // K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure is the fully-qualified + // name of the K8sRecommendationService's PreviewWorkloadOptimizationPolicyMatches RPC. + K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewWorkloadOptimizationPolicyMatches" + // K8SRecommendationServiceCreateSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSchedulerPolicy RPC. + K8SRecommendationServiceCreateSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/CreateSchedulerPolicy" + // K8SRecommendationServiceListSchedulerPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSchedulerPolicies RPC. + K8SRecommendationServiceListSchedulerPoliciesProcedure = "/api.v1.K8sRecommendationService/ListSchedulerPolicies" + // K8SRecommendationServiceUpdateSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSchedulerPolicy RPC. + K8SRecommendationServiceUpdateSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateSchedulerPolicy" + // K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure is the fully-qualified name of the + // K8sRecommendationService's ToggleSchedulerPolicyDisabled RPC. + K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleSchedulerPolicyDisabled" + // K8SRecommendationServiceDeleteSchedulerPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSchedulerPolicy RPC. + K8SRecommendationServiceDeleteSchedulerPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteSchedulerPolicy" + // K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's PreviewSchedulerPolicyTargets RPC. + K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/PreviewSchedulerPolicyTargets" + // K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListSchedulerPolicyEnrollments RPC. + K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure = "/api.v1.K8sRecommendationService/ListSchedulerPolicyEnrollments" // K8SRecommendationServiceUpsertManualWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's UpsertManualWorkloadRule RPC. K8SRecommendationServiceUpsertManualWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/UpsertManualWorkloadRule" + // K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure is the fully-qualified name of the + // K8sRecommendationService's ToggleWorkloadRuleDisabled RPC. + K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure = "/api.v1.K8sRecommendationService/ToggleWorkloadRuleDisabled" // K8SRecommendationServicePreviewWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's PreviewWorkloadRule RPC. K8SRecommendationServicePreviewWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/PreviewWorkloadRule" @@ -368,15 +440,117 @@ const ( // K8SRecommendationServiceDeleteWorkloadRuleProcedure is the fully-qualified name of the // K8sRecommendationService's DeleteWorkloadRule RPC. K8SRecommendationServiceDeleteWorkloadRuleProcedure = "/api.v1.K8sRecommendationService/DeleteWorkloadRule" + // K8SRecommendationServiceDeleteAllWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteAllWorkloadRules RPC. + K8SRecommendationServiceDeleteAllWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/DeleteAllWorkloadRules" + // K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's BulkDeleteWorkloadRules RPC. + K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BulkDeleteWorkloadRules" + // K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure is the fully-qualified name of + // the K8sRecommendationService's BulkToggleWorkloadRulesDisabled RPC. + K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure = "/api.v1.K8sRecommendationService/BulkToggleWorkloadRulesDisabled" // K8SRecommendationServiceGetWorkloadContainerNamesProcedure is the fully-qualified name of the // K8sRecommendationService's GetWorkloadContainerNames RPC. K8SRecommendationServiceGetWorkloadContainerNamesProcedure = "/api.v1.K8sRecommendationService/GetWorkloadContainerNames" // K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure is the fully-qualified name of the // K8sRecommendationService's BatchAutoOptimizeWorkloads RPC. K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure = "/api.v1.K8sRecommendationService/BatchAutoOptimizeWorkloads" + // K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure is the fully-qualified name of + // the K8sRecommendationService's BatchUpsertManualWorkloadRules RPC. + K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BatchUpsertManualWorkloadRules" + // K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure is the fully-qualified name of the + // K8sRecommendationService's BatchPreviewWorkloadRules RPC. + K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure = "/api.v1.K8sRecommendationService/BatchPreviewWorkloadRules" + // K8SRecommendationServiceApplyOneTimeOptimizationProcedure is the fully-qualified name of the + // K8sRecommendationService's ApplyOneTimeOptimization RPC. + K8SRecommendationServiceApplyOneTimeOptimizationProcedure = "/api.v1.K8sRecommendationService/ApplyOneTimeOptimization" + // K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure is the fully-qualified name of + // the K8sRecommendationService's DeleteRuleAndApplyRecommendation RPC. + K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure = "/api.v1.K8sRecommendationService/DeleteRuleAndApplyRecommendation" // K8SRecommendationServiceGetNodeRecommendationStatusProcedure is the fully-qualified name of the // K8sRecommendationService's GetNodeRecommendationStatus RPC. K8SRecommendationServiceGetNodeRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetNodeRecommendationStatus" + // K8SRecommendationServiceCreateSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSnapshotPolicies RPC. + K8SRecommendationServiceCreateSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/CreateSnapshotPolicies" + // K8SRecommendationServiceListSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSnapshotPolicies RPC. + K8SRecommendationServiceListSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/ListSnapshotPolicies" + // K8SRecommendationServiceUpdateSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSnapshotPolicy RPC. + K8SRecommendationServiceUpdateSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateSnapshotPolicy" + // K8SRecommendationServiceDeleteSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSnapshotPolicy RPC. + K8SRecommendationServiceDeleteSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteSnapshotPolicy" + // K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's CreateSnapshotPolicyTargets RPC. + K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/CreateSnapshotPolicyTargets" + // K8SRecommendationServiceListSnapshotPolicyTargetsProcedure is the fully-qualified name of the + // K8sRecommendationService's ListSnapshotPolicyTargets RPC. + K8SRecommendationServiceListSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/ListSnapshotPolicyTargets" + // K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateSnapshotPolicyTarget RPC. + K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/UpdateSnapshotPolicyTarget" + // K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteSnapshotPolicyTarget RPC. + K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/DeleteSnapshotPolicyTarget" + // K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure is the fully-qualified name of + // the K8sRecommendationService's CreateForensicSnapshotPolicies RPC. + K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/CreateForensicSnapshotPolicies" + // K8SRecommendationServiceListForensicSnapshotPoliciesProcedure is the fully-qualified name of the + // K8sRecommendationService's ListForensicSnapshotPolicies RPC. + K8SRecommendationServiceListForensicSnapshotPoliciesProcedure = "/api.v1.K8sRecommendationService/ListForensicSnapshotPolicies" + // K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's UpdateForensicSnapshotPolicy RPC. + K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/UpdateForensicSnapshotPolicy" + // K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's DeleteForensicSnapshotPolicy RPC. + K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure = "/api.v1.K8sRecommendationService/DeleteForensicSnapshotPolicy" + // K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure is the fully-qualified name + // of the K8sRecommendationService's CreateForensicSnapshotPolicyTargets RPC. + K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/CreateForensicSnapshotPolicyTargets" + // K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure is the fully-qualified name of + // the K8sRecommendationService's ListForensicSnapshotPolicyTargets RPC. + K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure = "/api.v1.K8sRecommendationService/ListForensicSnapshotPolicyTargets" + // K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure is the fully-qualified name + // of the K8sRecommendationService's UpdateForensicSnapshotPolicyTarget RPC. + K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/UpdateForensicSnapshotPolicyTarget" + // K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure is the fully-qualified name + // of the K8sRecommendationService's DeleteForensicSnapshotPolicyTarget RPC. + K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure = "/api.v1.K8sRecommendationService/DeleteForensicSnapshotPolicyTarget" + // K8SRecommendationServiceTriggerForensicSnapshotRunProcedure is the fully-qualified name of the + // K8sRecommendationService's TriggerForensicSnapshotRun RPC. + K8SRecommendationServiceTriggerForensicSnapshotRunProcedure = "/api.v1.K8sRecommendationService/TriggerForensicSnapshotRun" + // K8SRecommendationServiceListReferencedAuthenticationsProcedure is the fully-qualified name of the + // K8sRecommendationService's ListReferencedAuthentications RPC. + K8SRecommendationServiceListReferencedAuthenticationsProcedure = "/api.v1.K8sRecommendationService/ListReferencedAuthentications" + // K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure is the fully-qualified name + // of the K8sRecommendationService's PreviewSnapshotPolicyTargetMatches RPC. + K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewSnapshotPolicyTargetMatches" + // K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure is the + // fully-qualified name of the K8sRecommendationService's PreviewForensicSnapshotPolicyTargetMatches + // RPC. + K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure = "/api.v1.K8sRecommendationService/PreviewForensicSnapshotPolicyTargetMatches" + // K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure is the fully-qualified name + // of the K8sRecommendationService's GetSnapshotPolicyTargetRenderedScope RPC. + K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure = "/api.v1.K8sRecommendationService/GetSnapshotPolicyTargetRenderedScope" + // K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure is the + // fully-qualified name of the K8sRecommendationService's + // GetForensicSnapshotPolicyTargetRenderedScope RPC. + K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure = "/api.v1.K8sRecommendationService/GetForensicSnapshotPolicyTargetRenderedScope" + // K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure is the fully-qualified name of + // the K8sRecommendationService's GetSnapshotRecommendationStatus RPC. + K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetSnapshotRecommendationStatus" + // K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure is the fully-qualified + // name of the K8sRecommendationService's GetForensicSnapshotRecommendationStatus RPC. + K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure = "/api.v1.K8sRecommendationService/GetForensicSnapshotRecommendationStatus" + // K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure is the fully-qualified name + // of the K8sRecommendationService's PreviewSnapshotRecommendationConfig RPC. + K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure = "/api.v1.K8sRecommendationService/PreviewSnapshotRecommendationConfig" + // K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure is the + // fully-qualified name of the K8sRecommendationService's + // PreviewForensicSnapshotRecommendationConfig RPC. + K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure = "/api.v1.K8sRecommendationService/PreviewForensicSnapshotRecommendationConfig" ) // K8SRecommendationServiceClient is a client for the api.v1.K8sRecommendationService service. @@ -479,6 +653,26 @@ type K8SRecommendationServiceClient interface { DeleteNodePolicy(context.Context, *connect.Request[v1.DeleteNodePolicyRequest]) (*connect.Response[v1.DeleteNodePolicyResponse], error) SuggestedNodePolicy(context.Context, *connect.Request[v1.SuggestedNodePolicyRequest]) (*connect.Response[v1.SuggestedNodePolicyResponse], error) SuggestedKarpenterConfig(context.Context, *connect.Request[v1.SuggestedKarpenterConfigRequest]) (*connect.Response[v1.SuggestedKarpenterConfigResponse], error) + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) @@ -505,12 +699,38 @@ type K8SRecommendationServiceClient interface { // policy. The FE polls this while a batch is in flight so the toggle CTA can // render "9/10 labelled, 1 failed". GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) // Migration wizard state management GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) UpdateMigrationState(context.Context, *connect.Request[v1.UpdateMigrationStateRequest]) (*connect.Response[v1.UpdateMigrationStateResponse], error) + // Karpenter migration wizard + GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) + UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) + DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) + AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) + GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) + GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) // NodePool validation phone-home ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) GetNodePoolValidations(context.Context, *connect.Request[v1.GetNodePoolValidationsRequest]) (*connect.Response[v1.GetNodePoolValidationsResponse], error) @@ -521,6 +741,7 @@ type K8SRecommendationServiceClient interface { GetInstanceFamilies(context.Context, *connect.Request[v1.GetInstanceFamiliesRequest]) (*connect.Response[v1.GetInstanceFamiliesResponse], error) GetInstanceSizes(context.Context, *connect.Request[v1.GetInstanceSizesRequest]) (*connect.Response[v1.GetInstanceSizesResponse], error) GetInstanceCategories(context.Context, *connect.Request[v1.GetInstanceCategoriesRequest]) (*connect.Response[v1.GetInstanceCategoriesResponse], error) + GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) GetInstanceTypeNames(context.Context, *connect.Request[v1.GetInstanceTypeNamesRequest]) (*connect.Response[v1.GetInstanceTypeNamesResponse], error) // PodDisruptionBudget RPCs @@ -529,6 +750,11 @@ type K8SRecommendationServiceClient interface { CreatePodDisruptionBudget(context.Context, *connect.Request[v1.CreatePodDisruptionBudgetRequest]) (*connect.Response[v1.CreatePodDisruptionBudgetResponse], error) // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) GetPDBRecommendationForWorkload(context.Context, *connect.Request[v1.GetPDBRecommendationForWorkloadRequest]) (*connect.Response[v1.GetPDBRecommendationForWorkloadResponse], error) + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) // Storage Recommendation Policies CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) GetStorageRecommendationPolicy(context.Context, *connect.Request[v1.GetStorageRecommendationPolicyRequest]) (*connect.Response[v1.GetStorageRecommendationPolicyResponse], error) @@ -557,10 +783,30 @@ type K8SRecommendationServiceClient interface { CreateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.CreateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.CreateWorkloadOptimizationPolicyResponse], error) ListWorkloadOptimizationPolicies(context.Context, *connect.Request[v1.ListWorkloadOptimizationPoliciesRequest]) (*connect.Response[v1.ListWorkloadOptimizationPoliciesResponse], error) GetWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyResponse], error) + GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) + // The sole way to change an existing policy's disabled state. See message doc. + ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) + // Scheduler Policies: CRUD + targeting preview + CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) + ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) + UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) + ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) + DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) + PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) // MPA V3: Workload Rules (CRUD) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) + // The sole way to change an EXISTING rule's disabled state. See message doc. + ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) GetWorkloadRulesByPolicy(context.Context, *connect.Request[v1.GetWorkloadRulesByPolicyRequest]) (*connect.Response[v1.GetWorkloadRulesByPolicyResponse], error) ListWorkloadRules(context.Context, *connect.Request[v1.ListWorkloadRulesRequest]) (*connect.Response[v1.ListWorkloadRulesResponse], error) @@ -568,10 +814,58 @@ type K8SRecommendationServiceClient interface { GetWorkloadRuleByWorkload(context.Context, *connect.Request[v1.GetWorkloadRuleByWorkloadRequest]) (*connect.Response[v1.GetWorkloadRuleByWorkloadResponse], error) GetWorkloadByWorkloadRule(context.Context, *connect.Request[v1.GetWorkloadByWorkloadRuleRequest]) (*connect.Response[v1.GetWorkloadByWorkloadRuleResponse], error) DeleteWorkloadRule(context.Context, *connect.Request[v1.DeleteWorkloadRuleRequest]) (*connect.Response[v1.DeleteWorkloadRuleResponse], error) + DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) + BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) + BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) BatchAutoOptimizeWorkloads(context.Context, *connect.Request[v1.BatchAutoOptimizeWorkloadsRequest]) (*connect.Response[v1.BatchAutoOptimizeWorkloadsResponse], error) + BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) + BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) + ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) // Get current node pool config status and recent apply history for a cluster GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) + // ---- Snapshot policies (resilience) — spec §5 ---- + CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) + ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) + UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) + DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) + CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) + ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) + UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) + DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) + ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) + UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) + DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) + CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) + ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) + UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) + DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) + // Arms a forensic capture run: the ONLY way run_generation moves. + TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) + // ---- Targeting preview + read model + delivery status ---- + PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) + PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) + GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) + GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) + GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) + GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) + PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) } // NewK8SRecommendationServiceClient constructs a client for the api.v1.K8sRecommendationService @@ -864,6 +1158,16 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceSuggestedKarpenterConfigProcedure, opts..., ), + suggestNodePolicyImprovements: connect.NewClient[v1.SuggestNodePolicyImprovementsRequest, v1.SuggestNodePolicyImprovementsResponse]( + httpClient, + baseURL+K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure, + opts..., + ), + listClusterNodePolicySuggestions: connect.NewClient[v1.ListClusterNodePolicySuggestionsRequest, v1.ListClusterNodePolicySuggestionsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure, + opts..., + ), generateNodePoliciesFromKarpenter: connect.NewClient[v1.GenerateNodePoliciesFromKarpenterRequest, v1.GenerateNodePoliciesFromKarpenterResponse]( httpClient, baseURL+K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure, @@ -894,11 +1198,26 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetCheckpointApplyStatusProcedure, opts..., ), + getClusterCheckpointLabelCoverage: connect.NewClient[v1.GetClusterCheckpointLabelCoverageRequest, v1.GetClusterCheckpointLabelCoverageResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure, + opts..., + ), + listNodeGroupCheckpointLabelState: connect.NewClient[v1.ListNodeGroupCheckpointLabelStateRequest, v1.ListNodeGroupCheckpointLabelStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure, + opts..., + ), getNodeAnnotationReadiness: connect.NewClient[v1.GetNodeAnnotationReadinessRequest, v1.GetNodeAnnotationReadinessResponse]( httpClient, baseURL+K8SRecommendationServiceGetNodeAnnotationReadinessProcedure, opts..., ), + detectClusterAutoscaler: connect.NewClient[v1.DetectClusterAutoscalerRequest, v1.DetectClusterAutoscalerResponse]( + httpClient, + baseURL+K8SRecommendationServiceDetectClusterAutoscalerProcedure, + opts..., + ), getMigrationState: connect.NewClient[v1.GetMigrationStateRequest, v1.GetMigrationStateResponse]( httpClient, baseURL+K8SRecommendationServiceGetMigrationStateProcedure, @@ -909,6 +1228,36 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceUpdateMigrationStateProcedure, opts..., ), + getKarpenterMigrationState: connect.NewClient[v1.GetKarpenterMigrationStateRequest, v1.GetKarpenterMigrationStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterMigrationStateProcedure, + opts..., + ), + updateKarpenterMigrationState: connect.NewClient[v1.UpdateKarpenterMigrationStateRequest, v1.UpdateKarpenterMigrationStateResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure, + opts..., + ), + detectKarpenterOwnershipConflicts: connect.NewClient[v1.DetectKarpenterOwnershipConflictsRequest, v1.DetectKarpenterOwnershipConflictsResponse]( + httpClient, + baseURL+K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure, + opts..., + ), + acknowledgeKarpenterOwnershipConflict: connect.NewClient[v1.AcknowledgeKarpenterOwnershipConflictRequest, v1.AcknowledgeKarpenterOwnershipConflictResponse]( + httpClient, + baseURL+K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure, + opts..., + ), + getKarpenterSourceResources: connect.NewClient[v1.GetKarpenterSourceResourcesRequest, v1.GetKarpenterSourceResourcesResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterSourceResourcesProcedure, + opts..., + ), + getKarpenterAdoptionStatus: connect.NewClient[v1.GetKarpenterAdoptionStatusRequest, v1.GetKarpenterAdoptionStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure, + opts..., + ), reportNodePoolValidation: connect.NewClient[v1.ReportNodePoolValidationRequest, v1.ReportNodePoolValidationResponse]( httpClient, baseURL+K8SRecommendationServiceReportNodePoolValidationProcedure, @@ -954,6 +1303,11 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetInstanceCategoriesProcedure, opts..., ), + getInstanceShapes: connect.NewClient[v1.GetInstanceShapesRequest, v1.GetInstanceShapesResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetInstanceShapesProcedure, + opts..., + ), getInstanceCPUs: connect.NewClient[v1.GetInstanceCPUsRequest, v1.GetInstanceCPUsResponse]( httpClient, baseURL+K8SRecommendationServiceGetInstanceCPUsProcedure, @@ -984,6 +1338,11 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure, opts..., ), + listWorkloadStructuralHealth: connect.NewClient[v1.ListWorkloadStructuralHealthRequest, v1.ListWorkloadStructuralHealthResponse]( + httpClient, + baseURL+K8SRecommendationServiceListWorkloadStructuralHealthProcedure, + opts..., + ), createStorageRecommendationPolicy: connect.NewClient[v1.CreateStorageRecommendationPolicyRequest, v1.CreateStorageRecommendationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure, @@ -1089,21 +1448,76 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure, opts..., ), + getWorkloadOptimizationPolicyByWorkload: connect.NewClient[v1.GetWorkloadOptimizationPolicyByWorkloadRequest, v1.GetWorkloadOptimizationPolicyByWorkloadResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure, + opts..., + ), updateWorkloadOptimizationPolicy: connect.NewClient[v1.UpdateWorkloadOptimizationPolicyRequest, v1.UpdateWorkloadOptimizationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure, opts..., ), + toggleWorkloadOptimizationPolicyDisabled: connect.NewClient[v1.ToggleWorkloadOptimizationPolicyDisabledRequest, v1.ToggleWorkloadOptimizationPolicyDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure, + opts..., + ), deleteWorkloadOptimizationPolicy: connect.NewClient[v1.DeleteWorkloadOptimizationPolicyRequest, v1.DeleteWorkloadOptimizationPolicyResponse]( httpClient, baseURL+K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure, opts..., ), + previewWorkloadOptimizationPolicyMatches: connect.NewClient[v1.PreviewWorkloadOptimizationPolicyMatchesRequest, v1.PreviewWorkloadOptimizationPolicyMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure, + opts..., + ), + createSchedulerPolicy: connect.NewClient[v1.CreateSchedulerPolicyRequest, v1.CreateSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSchedulerPolicyProcedure, + opts..., + ), + listSchedulerPolicies: connect.NewClient[v1.ListSchedulerPoliciesRequest, v1.ListSchedulerPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSchedulerPoliciesProcedure, + opts..., + ), + updateSchedulerPolicy: connect.NewClient[v1.UpdateSchedulerPolicyRequest, v1.UpdateSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSchedulerPolicyProcedure, + opts..., + ), + toggleSchedulerPolicyDisabled: connect.NewClient[v1.ToggleSchedulerPolicyDisabledRequest, v1.ToggleSchedulerPolicyDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure, + opts..., + ), + deleteSchedulerPolicy: connect.NewClient[v1.DeleteSchedulerPolicyRequest, v1.DeleteSchedulerPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSchedulerPolicyProcedure, + opts..., + ), + previewSchedulerPolicyTargets: connect.NewClient[v1.PreviewSchedulerPolicyTargetsRequest, v1.PreviewSchedulerPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure, + opts..., + ), + listSchedulerPolicyEnrollments: connect.NewClient[v1.ListSchedulerPolicyEnrollmentsRequest, v1.ListSchedulerPolicyEnrollmentsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure, + opts..., + ), upsertManualWorkloadRule: connect.NewClient[v1.UpsertManualWorkloadRuleRequest, v1.UpsertManualWorkloadRuleResponse]( httpClient, baseURL+K8SRecommendationServiceUpsertManualWorkloadRuleProcedure, opts..., ), + toggleWorkloadRuleDisabled: connect.NewClient[v1.ToggleWorkloadRuleDisabledRequest, v1.ToggleWorkloadRuleDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure, + opts..., + ), previewWorkloadRule: connect.NewClient[v1.PreviewWorkloadRuleRequest, v1.PreviewWorkloadRuleResponse]( httpClient, baseURL+K8SRecommendationServicePreviewWorkloadRuleProcedure, @@ -1139,6 +1553,21 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceDeleteWorkloadRuleProcedure, opts..., ), + deleteAllWorkloadRules: connect.NewClient[v1.DeleteAllWorkloadRulesRequest, v1.DeleteAllWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteAllWorkloadRulesProcedure, + opts..., + ), + bulkDeleteWorkloadRules: connect.NewClient[v1.BulkDeleteWorkloadRulesRequest, v1.BulkDeleteWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure, + opts..., + ), + bulkToggleWorkloadRulesDisabled: connect.NewClient[v1.BulkToggleWorkloadRulesDisabledRequest, v1.BulkToggleWorkloadRulesDisabledResponse]( + httpClient, + baseURL+K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure, + opts..., + ), getWorkloadContainerNames: connect.NewClient[v1.GetWorkloadContainerNamesRequest, v1.GetWorkloadContainerNamesResponse]( httpClient, baseURL+K8SRecommendationServiceGetWorkloadContainerNamesProcedure, @@ -1149,11 +1578,161 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure, opts..., ), + batchUpsertManualWorkloadRules: connect.NewClient[v1.BatchUpsertManualWorkloadRulesRequest, v1.BatchUpsertManualWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure, + opts..., + ), + batchPreviewWorkloadRules: connect.NewClient[v1.BatchPreviewWorkloadRulesRequest, v1.BatchPreviewWorkloadRulesResponse]( + httpClient, + baseURL+K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure, + opts..., + ), + applyOneTimeOptimization: connect.NewClient[v1.ApplyOneTimeOptimizationRequest, v1.ApplyOneTimeOptimizationResponse]( + httpClient, + baseURL+K8SRecommendationServiceApplyOneTimeOptimizationProcedure, + opts..., + ), + deleteRuleAndApplyRecommendation: connect.NewClient[v1.DeleteRuleAndApplyRecommendationRequest, v1.DeleteRuleAndApplyRecommendationResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure, + opts..., + ), getNodeRecommendationStatus: connect.NewClient[v1.GetNodeRecommendationStatusRequest, v1.GetNodeRecommendationStatusResponse]( httpClient, baseURL+K8SRecommendationServiceGetNodeRecommendationStatusProcedure, opts..., ), + createSnapshotPolicies: connect.NewClient[v1.CreateSnapshotPoliciesRequest, v1.CreateSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSnapshotPoliciesProcedure, + opts..., + ), + listSnapshotPolicies: connect.NewClient[v1.ListSnapshotPoliciesRequest, v1.ListSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSnapshotPoliciesProcedure, + opts..., + ), + updateSnapshotPolicy: connect.NewClient[v1.UpdateSnapshotPolicyRequest, v1.UpdateSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSnapshotPolicyProcedure, + opts..., + ), + deleteSnapshotPolicy: connect.NewClient[v1.DeleteSnapshotPolicyRequest, v1.DeleteSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSnapshotPolicyProcedure, + opts..., + ), + createSnapshotPolicyTargets: connect.NewClient[v1.CreateSnapshotPolicyTargetsRequest, v1.CreateSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure, + opts..., + ), + listSnapshotPolicyTargets: connect.NewClient[v1.ListSnapshotPolicyTargetsRequest, v1.ListSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListSnapshotPolicyTargetsProcedure, + opts..., + ), + updateSnapshotPolicyTarget: connect.NewClient[v1.UpdateSnapshotPolicyTargetRequest, v1.UpdateSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure, + opts..., + ), + deleteSnapshotPolicyTarget: connect.NewClient[v1.DeleteSnapshotPolicyTargetRequest, v1.DeleteSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure, + opts..., + ), + createForensicSnapshotPolicies: connect.NewClient[v1.CreateForensicSnapshotPoliciesRequest, v1.CreateForensicSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure, + opts..., + ), + listForensicSnapshotPolicies: connect.NewClient[v1.ListForensicSnapshotPoliciesRequest, v1.ListForensicSnapshotPoliciesResponse]( + httpClient, + baseURL+K8SRecommendationServiceListForensicSnapshotPoliciesProcedure, + opts..., + ), + updateForensicSnapshotPolicy: connect.NewClient[v1.UpdateForensicSnapshotPolicyRequest, v1.UpdateForensicSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure, + opts..., + ), + deleteForensicSnapshotPolicy: connect.NewClient[v1.DeleteForensicSnapshotPolicyRequest, v1.DeleteForensicSnapshotPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure, + opts..., + ), + createForensicSnapshotPolicyTargets: connect.NewClient[v1.CreateForensicSnapshotPolicyTargetsRequest, v1.CreateForensicSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure, + opts..., + ), + listForensicSnapshotPolicyTargets: connect.NewClient[v1.ListForensicSnapshotPolicyTargetsRequest, v1.ListForensicSnapshotPolicyTargetsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure, + opts..., + ), + updateForensicSnapshotPolicyTarget: connect.NewClient[v1.UpdateForensicSnapshotPolicyTargetRequest, v1.UpdateForensicSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure, + opts..., + ), + deleteForensicSnapshotPolicyTarget: connect.NewClient[v1.DeleteForensicSnapshotPolicyTargetRequest, v1.DeleteForensicSnapshotPolicyTargetResponse]( + httpClient, + baseURL+K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure, + opts..., + ), + triggerForensicSnapshotRun: connect.NewClient[v1.TriggerForensicSnapshotRunRequest, v1.TriggerForensicSnapshotRunResponse]( + httpClient, + baseURL+K8SRecommendationServiceTriggerForensicSnapshotRunProcedure, + opts..., + ), + listReferencedAuthentications: connect.NewClient[v1.ListReferencedAuthenticationsRequest, v1.ListReferencedAuthenticationsResponse]( + httpClient, + baseURL+K8SRecommendationServiceListReferencedAuthenticationsProcedure, + opts..., + ), + previewSnapshotPolicyTargetMatches: connect.NewClient[v1.PreviewSnapshotPolicyTargetMatchesRequest, v1.PreviewSnapshotPolicyTargetMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure, + opts..., + ), + previewForensicSnapshotPolicyTargetMatches: connect.NewClient[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest, v1.PreviewForensicSnapshotPolicyTargetMatchesResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure, + opts..., + ), + getSnapshotPolicyTargetRenderedScope: connect.NewClient[v1.GetSnapshotPolicyTargetRenderedScopeRequest, v1.GetSnapshotPolicyTargetRenderedScopeResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure, + opts..., + ), + getForensicSnapshotPolicyTargetRenderedScope: connect.NewClient[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest, v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure, + opts..., + ), + getSnapshotRecommendationStatus: connect.NewClient[v1.GetSnapshotRecommendationStatusRequest, v1.GetSnapshotRecommendationStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure, + opts..., + ), + getForensicSnapshotRecommendationStatus: connect.NewClient[v1.GetForensicSnapshotRecommendationStatusRequest, v1.GetForensicSnapshotRecommendationStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure, + opts..., + ), + previewSnapshotRecommendationConfig: connect.NewClient[v1.PreviewSnapshotRecommendationConfigRequest, v1.PreviewSnapshotRecommendationConfigResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure, + opts..., + ), + previewForensicSnapshotRecommendationConfig: connect.NewClient[v1.PreviewForensicSnapshotRecommendationConfigRequest, v1.PreviewForensicSnapshotRecommendationConfigResponse]( + httpClient, + baseURL+K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure, + opts..., + ), } } @@ -1215,15 +1794,26 @@ type k8SRecommendationServiceClient struct { deleteNodePolicy *connect.Client[v1.DeleteNodePolicyRequest, v1.DeleteNodePolicyResponse] suggestedNodePolicy *connect.Client[v1.SuggestedNodePolicyRequest, v1.SuggestedNodePolicyResponse] suggestedKarpenterConfig *connect.Client[v1.SuggestedKarpenterConfigRequest, v1.SuggestedKarpenterConfigResponse] + suggestNodePolicyImprovements *connect.Client[v1.SuggestNodePolicyImprovementsRequest, v1.SuggestNodePolicyImprovementsResponse] + listClusterNodePolicySuggestions *connect.Client[v1.ListClusterNodePolicySuggestionsRequest, v1.ListClusterNodePolicySuggestionsResponse] generateNodePoliciesFromKarpenter *connect.Client[v1.GenerateNodePoliciesFromKarpenterRequest, v1.GenerateNodePoliciesFromKarpenterResponse] generateNodePoliciesFromNodeGroups *connect.Client[v1.GenerateNodePoliciesFromNodeGroupsRequest, v1.GenerateNodePoliciesFromNodeGroupsResponse] getNodeGroupsCheckpointStatus *connect.Client[v1.GetNodeGroupsCheckpointStatusRequest, v1.GetNodeGroupsCheckpointStatusResponse] setNodePolicyCheckpointLabel *connect.Client[v1.SetNodePolicyCheckpointLabelRequest, v1.SetNodePolicyCheckpointLabelResponse] enableCheckpointForPolicy *connect.Client[v1.EnableCheckpointForPolicyRequest, v1.EnableCheckpointForPolicyResponse] getCheckpointApplyStatus *connect.Client[v1.GetCheckpointApplyStatusRequest, v1.GetCheckpointApplyStatusResponse] + getClusterCheckpointLabelCoverage *connect.Client[v1.GetClusterCheckpointLabelCoverageRequest, v1.GetClusterCheckpointLabelCoverageResponse] + listNodeGroupCheckpointLabelState *connect.Client[v1.ListNodeGroupCheckpointLabelStateRequest, v1.ListNodeGroupCheckpointLabelStateResponse] getNodeAnnotationReadiness *connect.Client[v1.GetNodeAnnotationReadinessRequest, v1.GetNodeAnnotationReadinessResponse] + detectClusterAutoscaler *connect.Client[v1.DetectClusterAutoscalerRequest, v1.DetectClusterAutoscalerResponse] getMigrationState *connect.Client[v1.GetMigrationStateRequest, v1.GetMigrationStateResponse] updateMigrationState *connect.Client[v1.UpdateMigrationStateRequest, v1.UpdateMigrationStateResponse] + getKarpenterMigrationState *connect.Client[v1.GetKarpenterMigrationStateRequest, v1.GetKarpenterMigrationStateResponse] + updateKarpenterMigrationState *connect.Client[v1.UpdateKarpenterMigrationStateRequest, v1.UpdateKarpenterMigrationStateResponse] + detectKarpenterOwnershipConflicts *connect.Client[v1.DetectKarpenterOwnershipConflictsRequest, v1.DetectKarpenterOwnershipConflictsResponse] + acknowledgeKarpenterOwnershipConflict *connect.Client[v1.AcknowledgeKarpenterOwnershipConflictRequest, v1.AcknowledgeKarpenterOwnershipConflictResponse] + getKarpenterSourceResources *connect.Client[v1.GetKarpenterSourceResourcesRequest, v1.GetKarpenterSourceResourcesResponse] + getKarpenterAdoptionStatus *connect.Client[v1.GetKarpenterAdoptionStatusRequest, v1.GetKarpenterAdoptionStatusResponse] reportNodePoolValidation *connect.Client[v1.ReportNodePoolValidationRequest, v1.ReportNodePoolValidationResponse] getNodePoolValidations *connect.Client[v1.GetNodePoolValidationsRequest, v1.GetNodePoolValidationsResponse] createNodePolicyTargets *connect.Client[v1.CreateNodePolicyTargetsRequest, v1.CreateNodePolicyTargetsResponse] @@ -1233,12 +1823,14 @@ type k8SRecommendationServiceClient struct { getInstanceFamilies *connect.Client[v1.GetInstanceFamiliesRequest, v1.GetInstanceFamiliesResponse] getInstanceSizes *connect.Client[v1.GetInstanceSizesRequest, v1.GetInstanceSizesResponse] getInstanceCategories *connect.Client[v1.GetInstanceCategoriesRequest, v1.GetInstanceCategoriesResponse] + getInstanceShapes *connect.Client[v1.GetInstanceShapesRequest, v1.GetInstanceShapesResponse] getInstanceCPUs *connect.Client[v1.GetInstanceCPUsRequest, v1.GetInstanceCPUsResponse] getInstanceTypeNames *connect.Client[v1.GetInstanceTypeNamesRequest, v1.GetInstanceTypeNamesResponse] generatePodDisruptionBudget *connect.Client[v1.GeneratePodDisruptionBudgetRequest, v1.GeneratePodDisruptionBudgetResponse] generateAndCreatePodDisruptionBudget *connect.Client[v1.GenerateAndCreatePodDisruptionBudgetRequest, v1.GenerateAndCreatePodDisruptionBudgetResponse] createPodDisruptionBudget *connect.Client[v1.CreatePodDisruptionBudgetRequest, v1.CreatePodDisruptionBudgetResponse] getPDBRecommendationForWorkload *connect.Client[v1.GetPDBRecommendationForWorkloadRequest, v1.GetPDBRecommendationForWorkloadResponse] + listWorkloadStructuralHealth *connect.Client[v1.ListWorkloadStructuralHealthRequest, v1.ListWorkloadStructuralHealthResponse] createStorageRecommendationPolicy *connect.Client[v1.CreateStorageRecommendationPolicyRequest, v1.CreateStorageRecommendationPolicyResponse] getStorageRecommendationPolicy *connect.Client[v1.GetStorageRecommendationPolicyRequest, v1.GetStorageRecommendationPolicyResponse] listStorageRecommendationPolicies *connect.Client[v1.ListStorageRecommendationPoliciesRequest, v1.ListStorageRecommendationPoliciesResponse] @@ -1260,9 +1852,20 @@ type k8SRecommendationServiceClient struct { createWorkloadOptimizationPolicy *connect.Client[v1.CreateWorkloadOptimizationPolicyRequest, v1.CreateWorkloadOptimizationPolicyResponse] listWorkloadOptimizationPolicies *connect.Client[v1.ListWorkloadOptimizationPoliciesRequest, v1.ListWorkloadOptimizationPoliciesResponse] getWorkloadOptimizationPolicy *connect.Client[v1.GetWorkloadOptimizationPolicyRequest, v1.GetWorkloadOptimizationPolicyResponse] + getWorkloadOptimizationPolicyByWorkload *connect.Client[v1.GetWorkloadOptimizationPolicyByWorkloadRequest, v1.GetWorkloadOptimizationPolicyByWorkloadResponse] updateWorkloadOptimizationPolicy *connect.Client[v1.UpdateWorkloadOptimizationPolicyRequest, v1.UpdateWorkloadOptimizationPolicyResponse] + toggleWorkloadOptimizationPolicyDisabled *connect.Client[v1.ToggleWorkloadOptimizationPolicyDisabledRequest, v1.ToggleWorkloadOptimizationPolicyDisabledResponse] deleteWorkloadOptimizationPolicy *connect.Client[v1.DeleteWorkloadOptimizationPolicyRequest, v1.DeleteWorkloadOptimizationPolicyResponse] + previewWorkloadOptimizationPolicyMatches *connect.Client[v1.PreviewWorkloadOptimizationPolicyMatchesRequest, v1.PreviewWorkloadOptimizationPolicyMatchesResponse] + createSchedulerPolicy *connect.Client[v1.CreateSchedulerPolicyRequest, v1.CreateSchedulerPolicyResponse] + listSchedulerPolicies *connect.Client[v1.ListSchedulerPoliciesRequest, v1.ListSchedulerPoliciesResponse] + updateSchedulerPolicy *connect.Client[v1.UpdateSchedulerPolicyRequest, v1.UpdateSchedulerPolicyResponse] + toggleSchedulerPolicyDisabled *connect.Client[v1.ToggleSchedulerPolicyDisabledRequest, v1.ToggleSchedulerPolicyDisabledResponse] + deleteSchedulerPolicy *connect.Client[v1.DeleteSchedulerPolicyRequest, v1.DeleteSchedulerPolicyResponse] + previewSchedulerPolicyTargets *connect.Client[v1.PreviewSchedulerPolicyTargetsRequest, v1.PreviewSchedulerPolicyTargetsResponse] + listSchedulerPolicyEnrollments *connect.Client[v1.ListSchedulerPolicyEnrollmentsRequest, v1.ListSchedulerPolicyEnrollmentsResponse] upsertManualWorkloadRule *connect.Client[v1.UpsertManualWorkloadRuleRequest, v1.UpsertManualWorkloadRuleResponse] + toggleWorkloadRuleDisabled *connect.Client[v1.ToggleWorkloadRuleDisabledRequest, v1.ToggleWorkloadRuleDisabledResponse] previewWorkloadRule *connect.Client[v1.PreviewWorkloadRuleRequest, v1.PreviewWorkloadRuleResponse] getWorkloadRulesByPolicy *connect.Client[v1.GetWorkloadRulesByPolicyRequest, v1.GetWorkloadRulesByPolicyResponse] listWorkloadRules *connect.Client[v1.ListWorkloadRulesRequest, v1.ListWorkloadRulesResponse] @@ -1270,9 +1873,42 @@ type k8SRecommendationServiceClient struct { getWorkloadRuleByWorkload *connect.Client[v1.GetWorkloadRuleByWorkloadRequest, v1.GetWorkloadRuleByWorkloadResponse] getWorkloadByWorkloadRule *connect.Client[v1.GetWorkloadByWorkloadRuleRequest, v1.GetWorkloadByWorkloadRuleResponse] deleteWorkloadRule *connect.Client[v1.DeleteWorkloadRuleRequest, v1.DeleteWorkloadRuleResponse] + deleteAllWorkloadRules *connect.Client[v1.DeleteAllWorkloadRulesRequest, v1.DeleteAllWorkloadRulesResponse] + bulkDeleteWorkloadRules *connect.Client[v1.BulkDeleteWorkloadRulesRequest, v1.BulkDeleteWorkloadRulesResponse] + bulkToggleWorkloadRulesDisabled *connect.Client[v1.BulkToggleWorkloadRulesDisabledRequest, v1.BulkToggleWorkloadRulesDisabledResponse] getWorkloadContainerNames *connect.Client[v1.GetWorkloadContainerNamesRequest, v1.GetWorkloadContainerNamesResponse] batchAutoOptimizeWorkloads *connect.Client[v1.BatchAutoOptimizeWorkloadsRequest, v1.BatchAutoOptimizeWorkloadsResponse] + batchUpsertManualWorkloadRules *connect.Client[v1.BatchUpsertManualWorkloadRulesRequest, v1.BatchUpsertManualWorkloadRulesResponse] + batchPreviewWorkloadRules *connect.Client[v1.BatchPreviewWorkloadRulesRequest, v1.BatchPreviewWorkloadRulesResponse] + applyOneTimeOptimization *connect.Client[v1.ApplyOneTimeOptimizationRequest, v1.ApplyOneTimeOptimizationResponse] + deleteRuleAndApplyRecommendation *connect.Client[v1.DeleteRuleAndApplyRecommendationRequest, v1.DeleteRuleAndApplyRecommendationResponse] getNodeRecommendationStatus *connect.Client[v1.GetNodeRecommendationStatusRequest, v1.GetNodeRecommendationStatusResponse] + createSnapshotPolicies *connect.Client[v1.CreateSnapshotPoliciesRequest, v1.CreateSnapshotPoliciesResponse] + listSnapshotPolicies *connect.Client[v1.ListSnapshotPoliciesRequest, v1.ListSnapshotPoliciesResponse] + updateSnapshotPolicy *connect.Client[v1.UpdateSnapshotPolicyRequest, v1.UpdateSnapshotPolicyResponse] + deleteSnapshotPolicy *connect.Client[v1.DeleteSnapshotPolicyRequest, v1.DeleteSnapshotPolicyResponse] + createSnapshotPolicyTargets *connect.Client[v1.CreateSnapshotPolicyTargetsRequest, v1.CreateSnapshotPolicyTargetsResponse] + listSnapshotPolicyTargets *connect.Client[v1.ListSnapshotPolicyTargetsRequest, v1.ListSnapshotPolicyTargetsResponse] + updateSnapshotPolicyTarget *connect.Client[v1.UpdateSnapshotPolicyTargetRequest, v1.UpdateSnapshotPolicyTargetResponse] + deleteSnapshotPolicyTarget *connect.Client[v1.DeleteSnapshotPolicyTargetRequest, v1.DeleteSnapshotPolicyTargetResponse] + createForensicSnapshotPolicies *connect.Client[v1.CreateForensicSnapshotPoliciesRequest, v1.CreateForensicSnapshotPoliciesResponse] + listForensicSnapshotPolicies *connect.Client[v1.ListForensicSnapshotPoliciesRequest, v1.ListForensicSnapshotPoliciesResponse] + updateForensicSnapshotPolicy *connect.Client[v1.UpdateForensicSnapshotPolicyRequest, v1.UpdateForensicSnapshotPolicyResponse] + deleteForensicSnapshotPolicy *connect.Client[v1.DeleteForensicSnapshotPolicyRequest, v1.DeleteForensicSnapshotPolicyResponse] + createForensicSnapshotPolicyTargets *connect.Client[v1.CreateForensicSnapshotPolicyTargetsRequest, v1.CreateForensicSnapshotPolicyTargetsResponse] + listForensicSnapshotPolicyTargets *connect.Client[v1.ListForensicSnapshotPolicyTargetsRequest, v1.ListForensicSnapshotPolicyTargetsResponse] + updateForensicSnapshotPolicyTarget *connect.Client[v1.UpdateForensicSnapshotPolicyTargetRequest, v1.UpdateForensicSnapshotPolicyTargetResponse] + deleteForensicSnapshotPolicyTarget *connect.Client[v1.DeleteForensicSnapshotPolicyTargetRequest, v1.DeleteForensicSnapshotPolicyTargetResponse] + triggerForensicSnapshotRun *connect.Client[v1.TriggerForensicSnapshotRunRequest, v1.TriggerForensicSnapshotRunResponse] + listReferencedAuthentications *connect.Client[v1.ListReferencedAuthenticationsRequest, v1.ListReferencedAuthenticationsResponse] + previewSnapshotPolicyTargetMatches *connect.Client[v1.PreviewSnapshotPolicyTargetMatchesRequest, v1.PreviewSnapshotPolicyTargetMatchesResponse] + previewForensicSnapshotPolicyTargetMatches *connect.Client[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest, v1.PreviewForensicSnapshotPolicyTargetMatchesResponse] + getSnapshotPolicyTargetRenderedScope *connect.Client[v1.GetSnapshotPolicyTargetRenderedScopeRequest, v1.GetSnapshotPolicyTargetRenderedScopeResponse] + getForensicSnapshotPolicyTargetRenderedScope *connect.Client[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest, v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse] + getSnapshotRecommendationStatus *connect.Client[v1.GetSnapshotRecommendationStatusRequest, v1.GetSnapshotRecommendationStatusResponse] + getForensicSnapshotRecommendationStatus *connect.Client[v1.GetForensicSnapshotRecommendationStatusRequest, v1.GetForensicSnapshotRecommendationStatusResponse] + previewSnapshotRecommendationConfig *connect.Client[v1.PreviewSnapshotRecommendationConfigRequest, v1.PreviewSnapshotRecommendationConfigResponse] + previewForensicSnapshotRecommendationConfig *connect.Client[v1.PreviewForensicSnapshotRecommendationConfigRequest, v1.PreviewForensicSnapshotRecommendationConfigResponse] } // GetNodeGroupStats calls api.v1.K8sRecommendationService.GetNodeGroupStats. @@ -1618,6 +2254,18 @@ func (c *k8SRecommendationServiceClient) SuggestedKarpenterConfig(ctx context.Co return c.suggestedKarpenterConfig.CallUnary(ctx, req) } +// SuggestNodePolicyImprovements calls +// api.v1.K8sRecommendationService.SuggestNodePolicyImprovements. +func (c *k8SRecommendationServiceClient) SuggestNodePolicyImprovements(ctx context.Context, req *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) { + return c.suggestNodePolicyImprovements.CallUnary(ctx, req) +} + +// ListClusterNodePolicySuggestions calls +// api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions. +func (c *k8SRecommendationServiceClient) ListClusterNodePolicySuggestions(ctx context.Context, req *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) { + return c.listClusterNodePolicySuggestions.CallUnary(ctx, req) +} + // GenerateNodePoliciesFromKarpenter calls // api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter. func (c *k8SRecommendationServiceClient) GenerateNodePoliciesFromKarpenter(ctx context.Context, req *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) { @@ -1651,11 +2299,28 @@ func (c *k8SRecommendationServiceClient) GetCheckpointApplyStatus(ctx context.Co return c.getCheckpointApplyStatus.CallUnary(ctx, req) } +// GetClusterCheckpointLabelCoverage calls +// api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage. +func (c *k8SRecommendationServiceClient) GetClusterCheckpointLabelCoverage(ctx context.Context, req *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) { + return c.getClusterCheckpointLabelCoverage.CallUnary(ctx, req) +} + +// ListNodeGroupCheckpointLabelState calls +// api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState. +func (c *k8SRecommendationServiceClient) ListNodeGroupCheckpointLabelState(ctx context.Context, req *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) { + return c.listNodeGroupCheckpointLabelState.CallUnary(ctx, req) +} + // GetNodeAnnotationReadiness calls api.v1.K8sRecommendationService.GetNodeAnnotationReadiness. func (c *k8SRecommendationServiceClient) GetNodeAnnotationReadiness(ctx context.Context, req *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) { return c.getNodeAnnotationReadiness.CallUnary(ctx, req) } +// DetectClusterAutoscaler calls api.v1.K8sRecommendationService.DetectClusterAutoscaler. +func (c *k8SRecommendationServiceClient) DetectClusterAutoscaler(ctx context.Context, req *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) { + return c.detectClusterAutoscaler.CallUnary(ctx, req) +} + // GetMigrationState calls api.v1.K8sRecommendationService.GetMigrationState. func (c *k8SRecommendationServiceClient) GetMigrationState(ctx context.Context, req *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) { return c.getMigrationState.CallUnary(ctx, req) @@ -1666,6 +2331,39 @@ func (c *k8SRecommendationServiceClient) UpdateMigrationState(ctx context.Contex return c.updateMigrationState.CallUnary(ctx, req) } +// GetKarpenterMigrationState calls api.v1.K8sRecommendationService.GetKarpenterMigrationState. +func (c *k8SRecommendationServiceClient) GetKarpenterMigrationState(ctx context.Context, req *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) { + return c.getKarpenterMigrationState.CallUnary(ctx, req) +} + +// UpdateKarpenterMigrationState calls +// api.v1.K8sRecommendationService.UpdateKarpenterMigrationState. +func (c *k8SRecommendationServiceClient) UpdateKarpenterMigrationState(ctx context.Context, req *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) { + return c.updateKarpenterMigrationState.CallUnary(ctx, req) +} + +// DetectKarpenterOwnershipConflicts calls +// api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts. +func (c *k8SRecommendationServiceClient) DetectKarpenterOwnershipConflicts(ctx context.Context, req *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) { + return c.detectKarpenterOwnershipConflicts.CallUnary(ctx, req) +} + +// AcknowledgeKarpenterOwnershipConflict calls +// api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict. +func (c *k8SRecommendationServiceClient) AcknowledgeKarpenterOwnershipConflict(ctx context.Context, req *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) { + return c.acknowledgeKarpenterOwnershipConflict.CallUnary(ctx, req) +} + +// GetKarpenterSourceResources calls api.v1.K8sRecommendationService.GetKarpenterSourceResources. +func (c *k8SRecommendationServiceClient) GetKarpenterSourceResources(ctx context.Context, req *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) { + return c.getKarpenterSourceResources.CallUnary(ctx, req) +} + +// GetKarpenterAdoptionStatus calls api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus. +func (c *k8SRecommendationServiceClient) GetKarpenterAdoptionStatus(ctx context.Context, req *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) { + return c.getKarpenterAdoptionStatus.CallUnary(ctx, req) +} + // ReportNodePoolValidation calls api.v1.K8sRecommendationService.ReportNodePoolValidation. func (c *k8SRecommendationServiceClient) ReportNodePoolValidation(ctx context.Context, req *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) { return c.reportNodePoolValidation.CallUnary(ctx, req) @@ -1712,6 +2410,11 @@ func (c *k8SRecommendationServiceClient) GetInstanceCategories(ctx context.Conte return c.getInstanceCategories.CallUnary(ctx, req) } +// GetInstanceShapes calls api.v1.K8sRecommendationService.GetInstanceShapes. +func (c *k8SRecommendationServiceClient) GetInstanceShapes(ctx context.Context, req *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) { + return c.getInstanceShapes.CallUnary(ctx, req) +} + // GetInstanceCPUs calls api.v1.K8sRecommendationService.GetInstanceCPUs. func (c *k8SRecommendationServiceClient) GetInstanceCPUs(ctx context.Context, req *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) { return c.getInstanceCPUs.CallUnary(ctx, req) @@ -1744,6 +2447,11 @@ func (c *k8SRecommendationServiceClient) GetPDBRecommendationForWorkload(ctx con return c.getPDBRecommendationForWorkload.CallUnary(ctx, req) } +// ListWorkloadStructuralHealth calls api.v1.K8sRecommendationService.ListWorkloadStructuralHealth. +func (c *k8SRecommendationServiceClient) ListWorkloadStructuralHealth(ctx context.Context, req *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) { + return c.listWorkloadStructuralHealth.CallUnary(ctx, req) +} + // CreateStorageRecommendationPolicy calls // api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy. func (c *k8SRecommendationServiceClient) CreateStorageRecommendationPolicy(ctx context.Context, req *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) { @@ -1862,23 +2570,84 @@ func (c *k8SRecommendationServiceClient) GetWorkloadOptimizationPolicy(ctx conte return c.getWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// GetWorkloadOptimizationPolicyByWorkload calls +// api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload. +func (c *k8SRecommendationServiceClient) GetWorkloadOptimizationPolicyByWorkload(ctx context.Context, req *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) { + return c.getWorkloadOptimizationPolicyByWorkload.CallUnary(ctx, req) +} + // UpdateWorkloadOptimizationPolicy calls // api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy. func (c *k8SRecommendationServiceClient) UpdateWorkloadOptimizationPolicy(ctx context.Context, req *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) { return c.updateWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// ToggleWorkloadOptimizationPolicyDisabled calls +// api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled. +func (c *k8SRecommendationServiceClient) ToggleWorkloadOptimizationPolicyDisabled(ctx context.Context, req *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) { + return c.toggleWorkloadOptimizationPolicyDisabled.CallUnary(ctx, req) +} + // DeleteWorkloadOptimizationPolicy calls // api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy. func (c *k8SRecommendationServiceClient) DeleteWorkloadOptimizationPolicy(ctx context.Context, req *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) { return c.deleteWorkloadOptimizationPolicy.CallUnary(ctx, req) } +// PreviewWorkloadOptimizationPolicyMatches calls +// api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches. +func (c *k8SRecommendationServiceClient) PreviewWorkloadOptimizationPolicyMatches(ctx context.Context, req *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) { + return c.previewWorkloadOptimizationPolicyMatches.CallUnary(ctx, req) +} + +// CreateSchedulerPolicy calls api.v1.K8sRecommendationService.CreateSchedulerPolicy. +func (c *k8SRecommendationServiceClient) CreateSchedulerPolicy(ctx context.Context, req *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) { + return c.createSchedulerPolicy.CallUnary(ctx, req) +} + +// ListSchedulerPolicies calls api.v1.K8sRecommendationService.ListSchedulerPolicies. +func (c *k8SRecommendationServiceClient) ListSchedulerPolicies(ctx context.Context, req *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) { + return c.listSchedulerPolicies.CallUnary(ctx, req) +} + +// UpdateSchedulerPolicy calls api.v1.K8sRecommendationService.UpdateSchedulerPolicy. +func (c *k8SRecommendationServiceClient) UpdateSchedulerPolicy(ctx context.Context, req *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) { + return c.updateSchedulerPolicy.CallUnary(ctx, req) +} + +// ToggleSchedulerPolicyDisabled calls +// api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled. +func (c *k8SRecommendationServiceClient) ToggleSchedulerPolicyDisabled(ctx context.Context, req *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) { + return c.toggleSchedulerPolicyDisabled.CallUnary(ctx, req) +} + +// DeleteSchedulerPolicy calls api.v1.K8sRecommendationService.DeleteSchedulerPolicy. +func (c *k8SRecommendationServiceClient) DeleteSchedulerPolicy(ctx context.Context, req *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) { + return c.deleteSchedulerPolicy.CallUnary(ctx, req) +} + +// PreviewSchedulerPolicyTargets calls +// api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets. +func (c *k8SRecommendationServiceClient) PreviewSchedulerPolicyTargets(ctx context.Context, req *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) { + return c.previewSchedulerPolicyTargets.CallUnary(ctx, req) +} + +// ListSchedulerPolicyEnrollments calls +// api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments. +func (c *k8SRecommendationServiceClient) ListSchedulerPolicyEnrollments(ctx context.Context, req *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) { + return c.listSchedulerPolicyEnrollments.CallUnary(ctx, req) +} + // UpsertManualWorkloadRule calls api.v1.K8sRecommendationService.UpsertManualWorkloadRule. func (c *k8SRecommendationServiceClient) UpsertManualWorkloadRule(ctx context.Context, req *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) { return c.upsertManualWorkloadRule.CallUnary(ctx, req) } +// ToggleWorkloadRuleDisabled calls api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled. +func (c *k8SRecommendationServiceClient) ToggleWorkloadRuleDisabled(ctx context.Context, req *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) { + return c.toggleWorkloadRuleDisabled.CallUnary(ctx, req) +} + // PreviewWorkloadRule calls api.v1.K8sRecommendationService.PreviewWorkloadRule. func (c *k8SRecommendationServiceClient) PreviewWorkloadRule(ctx context.Context, req *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) { return c.previewWorkloadRule.CallUnary(ctx, req) @@ -1914,6 +2683,22 @@ func (c *k8SRecommendationServiceClient) DeleteWorkloadRule(ctx context.Context, return c.deleteWorkloadRule.CallUnary(ctx, req) } +// DeleteAllWorkloadRules calls api.v1.K8sRecommendationService.DeleteAllWorkloadRules. +func (c *k8SRecommendationServiceClient) DeleteAllWorkloadRules(ctx context.Context, req *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) { + return c.deleteAllWorkloadRules.CallUnary(ctx, req) +} + +// BulkDeleteWorkloadRules calls api.v1.K8sRecommendationService.BulkDeleteWorkloadRules. +func (c *k8SRecommendationServiceClient) BulkDeleteWorkloadRules(ctx context.Context, req *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) { + return c.bulkDeleteWorkloadRules.CallUnary(ctx, req) +} + +// BulkToggleWorkloadRulesDisabled calls +// api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled. +func (c *k8SRecommendationServiceClient) BulkToggleWorkloadRulesDisabled(ctx context.Context, req *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) { + return c.bulkToggleWorkloadRulesDisabled.CallUnary(ctx, req) +} + // GetWorkloadContainerNames calls api.v1.K8sRecommendationService.GetWorkloadContainerNames. func (c *k8SRecommendationServiceClient) GetWorkloadContainerNames(ctx context.Context, req *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) { return c.getWorkloadContainerNames.CallUnary(ctx, req) @@ -1924,32 +2709,198 @@ func (c *k8SRecommendationServiceClient) BatchAutoOptimizeWorkloads(ctx context. return c.batchAutoOptimizeWorkloads.CallUnary(ctx, req) } +// BatchUpsertManualWorkloadRules calls +// api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules. +func (c *k8SRecommendationServiceClient) BatchUpsertManualWorkloadRules(ctx context.Context, req *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) { + return c.batchUpsertManualWorkloadRules.CallUnary(ctx, req) +} + +// BatchPreviewWorkloadRules calls api.v1.K8sRecommendationService.BatchPreviewWorkloadRules. +func (c *k8SRecommendationServiceClient) BatchPreviewWorkloadRules(ctx context.Context, req *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) { + return c.batchPreviewWorkloadRules.CallUnary(ctx, req) +} + +// ApplyOneTimeOptimization calls api.v1.K8sRecommendationService.ApplyOneTimeOptimization. +func (c *k8SRecommendationServiceClient) ApplyOneTimeOptimization(ctx context.Context, req *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) { + return c.applyOneTimeOptimization.CallUnary(ctx, req) +} + +// DeleteRuleAndApplyRecommendation calls +// api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation. +func (c *k8SRecommendationServiceClient) DeleteRuleAndApplyRecommendation(ctx context.Context, req *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) { + return c.deleteRuleAndApplyRecommendation.CallUnary(ctx, req) +} + // GetNodeRecommendationStatus calls api.v1.K8sRecommendationService.GetNodeRecommendationStatus. func (c *k8SRecommendationServiceClient) GetNodeRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) { return c.getNodeRecommendationStatus.CallUnary(ctx, req) } -// K8SRecommendationServiceHandler is an implementation of the api.v1.K8sRecommendationService -// service. -type K8SRecommendationServiceHandler interface { - // Node Group Stats - GetNodeGroupStats(context.Context, *connect.Request[v1.GetNodeGroupStatsRequest]) (*connect.Response[v1.GetNodeGroupStatsResponse], error) - // Deprecated: do not use. - GetLatestNodeGroupRecommendation(context.Context, *connect.Request[v1.GetLatestNodeGroupRecommendationRequest]) (*connect.Response[v1.GetLatestNodeGroupRecommendationResponse], error) - // Workload Stats - GetLatestWorkloadRecommendation(context.Context, *connect.Request[v1.GetLatestWorkloadRecommendationRequest]) (*connect.Response[v1.GetLatestWorkloadRecommendationResponse], error) - GetPreviewWorkloadRecommendation(context.Context, *connect.Request[v1.GetPreviewWorkloadRecommendationRequest]) (*connect.Response[v1.GetPreviewWorkloadRecommendationResponse], error) - GetPreviewWorkloadRecommendations(context.Context, *connect.Request[v1.GetPreviewWorkloadRecommendationsRequest]) (*connect.Response[v1.GetPreviewWorkloadRecommendationsResponse], error) - GetRecommendationsForWorkload(context.Context, *connect.Request[v1.GetRecommendationsForWorkloadRequest]) (*connect.Response[v1.GetRecommendationsForWorkloadResponse], error) - GetRecommendations(context.Context, *connect.Request[v1.GetRecommendationsRequest]) (*connect.Response[v1.GetRecommendationsResponse], error) - // NodeGroup Recommendation Policies (Deprecated) - // - // Deprecated: do not use. - CreateNodeGroupRecommendationPolicy(context.Context, *connect.Request[v1.CreateNodeGroupRecommendationPolicyRequest]) (*connect.Response[v1.CreateNodeGroupRecommendationPolicyResponse], error) - // Deprecated: do not use. - GetNodeGroupRecommendationPolicy(context.Context, *connect.Request[v1.GetNodeGroupRecommendationPolicyRequest]) (*connect.Response[v1.GetNodeGroupRecommendationPolicyResponse], error) - // Deprecated: do not use. - ListNodeGroupRecommendationPolicies(context.Context, *connect.Request[v1.ListNodeGroupRecommendationPoliciesRequest]) (*connect.Response[v1.ListNodeGroupRecommendationPoliciesResponse], error) +// CreateSnapshotPolicies calls api.v1.K8sRecommendationService.CreateSnapshotPolicies. +func (c *k8SRecommendationServiceClient) CreateSnapshotPolicies(ctx context.Context, req *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) { + return c.createSnapshotPolicies.CallUnary(ctx, req) +} + +// ListSnapshotPolicies calls api.v1.K8sRecommendationService.ListSnapshotPolicies. +func (c *k8SRecommendationServiceClient) ListSnapshotPolicies(ctx context.Context, req *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) { + return c.listSnapshotPolicies.CallUnary(ctx, req) +} + +// UpdateSnapshotPolicy calls api.v1.K8sRecommendationService.UpdateSnapshotPolicy. +func (c *k8SRecommendationServiceClient) UpdateSnapshotPolicy(ctx context.Context, req *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) { + return c.updateSnapshotPolicy.CallUnary(ctx, req) +} + +// DeleteSnapshotPolicy calls api.v1.K8sRecommendationService.DeleteSnapshotPolicy. +func (c *k8SRecommendationServiceClient) DeleteSnapshotPolicy(ctx context.Context, req *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) { + return c.deleteSnapshotPolicy.CallUnary(ctx, req) +} + +// CreateSnapshotPolicyTargets calls api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) CreateSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) { + return c.createSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// ListSnapshotPolicyTargets calls api.v1.K8sRecommendationService.ListSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) ListSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) { + return c.listSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// UpdateSnapshotPolicyTarget calls api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) UpdateSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) { + return c.updateSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// DeleteSnapshotPolicyTarget calls api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) DeleteSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) { + return c.deleteSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// CreateForensicSnapshotPolicies calls +// api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies. +func (c *k8SRecommendationServiceClient) CreateForensicSnapshotPolicies(ctx context.Context, req *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) { + return c.createForensicSnapshotPolicies.CallUnary(ctx, req) +} + +// ListForensicSnapshotPolicies calls api.v1.K8sRecommendationService.ListForensicSnapshotPolicies. +func (c *k8SRecommendationServiceClient) ListForensicSnapshotPolicies(ctx context.Context, req *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) { + return c.listForensicSnapshotPolicies.CallUnary(ctx, req) +} + +// UpdateForensicSnapshotPolicy calls api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy. +func (c *k8SRecommendationServiceClient) UpdateForensicSnapshotPolicy(ctx context.Context, req *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) { + return c.updateForensicSnapshotPolicy.CallUnary(ctx, req) +} + +// DeleteForensicSnapshotPolicy calls api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy. +func (c *k8SRecommendationServiceClient) DeleteForensicSnapshotPolicy(ctx context.Context, req *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) { + return c.deleteForensicSnapshotPolicy.CallUnary(ctx, req) +} + +// CreateForensicSnapshotPolicyTargets calls +// api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) CreateForensicSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) { + return c.createForensicSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// ListForensicSnapshotPolicyTargets calls +// api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets. +func (c *k8SRecommendationServiceClient) ListForensicSnapshotPolicyTargets(ctx context.Context, req *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) { + return c.listForensicSnapshotPolicyTargets.CallUnary(ctx, req) +} + +// UpdateForensicSnapshotPolicyTarget calls +// api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) UpdateForensicSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) { + return c.updateForensicSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// DeleteForensicSnapshotPolicyTarget calls +// api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget. +func (c *k8SRecommendationServiceClient) DeleteForensicSnapshotPolicyTarget(ctx context.Context, req *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) { + return c.deleteForensicSnapshotPolicyTarget.CallUnary(ctx, req) +} + +// TriggerForensicSnapshotRun calls api.v1.K8sRecommendationService.TriggerForensicSnapshotRun. +func (c *k8SRecommendationServiceClient) TriggerForensicSnapshotRun(ctx context.Context, req *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) { + return c.triggerForensicSnapshotRun.CallUnary(ctx, req) +} + +// ListReferencedAuthentications calls +// api.v1.K8sRecommendationService.ListReferencedAuthentications. +func (c *k8SRecommendationServiceClient) ListReferencedAuthentications(ctx context.Context, req *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) { + return c.listReferencedAuthentications.CallUnary(ctx, req) +} + +// PreviewSnapshotPolicyTargetMatches calls +// api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches. +func (c *k8SRecommendationServiceClient) PreviewSnapshotPolicyTargetMatches(ctx context.Context, req *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) { + return c.previewSnapshotPolicyTargetMatches.CallUnary(ctx, req) +} + +// PreviewForensicSnapshotPolicyTargetMatches calls +// api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches. +func (c *k8SRecommendationServiceClient) PreviewForensicSnapshotPolicyTargetMatches(ctx context.Context, req *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) { + return c.previewForensicSnapshotPolicyTargetMatches.CallUnary(ctx, req) +} + +// GetSnapshotPolicyTargetRenderedScope calls +// api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope. +func (c *k8SRecommendationServiceClient) GetSnapshotPolicyTargetRenderedScope(ctx context.Context, req *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) { + return c.getSnapshotPolicyTargetRenderedScope.CallUnary(ctx, req) +} + +// GetForensicSnapshotPolicyTargetRenderedScope calls +// api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope. +func (c *k8SRecommendationServiceClient) GetForensicSnapshotPolicyTargetRenderedScope(ctx context.Context, req *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) { + return c.getForensicSnapshotPolicyTargetRenderedScope.CallUnary(ctx, req) +} + +// GetSnapshotRecommendationStatus calls +// api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus. +func (c *k8SRecommendationServiceClient) GetSnapshotRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) { + return c.getSnapshotRecommendationStatus.CallUnary(ctx, req) +} + +// GetForensicSnapshotRecommendationStatus calls +// api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus. +func (c *k8SRecommendationServiceClient) GetForensicSnapshotRecommendationStatus(ctx context.Context, req *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) { + return c.getForensicSnapshotRecommendationStatus.CallUnary(ctx, req) +} + +// PreviewSnapshotRecommendationConfig calls +// api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig. +func (c *k8SRecommendationServiceClient) PreviewSnapshotRecommendationConfig(ctx context.Context, req *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) { + return c.previewSnapshotRecommendationConfig.CallUnary(ctx, req) +} + +// PreviewForensicSnapshotRecommendationConfig calls +// api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig. +func (c *k8SRecommendationServiceClient) PreviewForensicSnapshotRecommendationConfig(ctx context.Context, req *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) { + return c.previewForensicSnapshotRecommendationConfig.CallUnary(ctx, req) +} + +// K8SRecommendationServiceHandler is an implementation of the api.v1.K8sRecommendationService +// service. +type K8SRecommendationServiceHandler interface { + // Node Group Stats + GetNodeGroupStats(context.Context, *connect.Request[v1.GetNodeGroupStatsRequest]) (*connect.Response[v1.GetNodeGroupStatsResponse], error) + // Deprecated: do not use. + GetLatestNodeGroupRecommendation(context.Context, *connect.Request[v1.GetLatestNodeGroupRecommendationRequest]) (*connect.Response[v1.GetLatestNodeGroupRecommendationResponse], error) + // Workload Stats + GetLatestWorkloadRecommendation(context.Context, *connect.Request[v1.GetLatestWorkloadRecommendationRequest]) (*connect.Response[v1.GetLatestWorkloadRecommendationResponse], error) + GetPreviewWorkloadRecommendation(context.Context, *connect.Request[v1.GetPreviewWorkloadRecommendationRequest]) (*connect.Response[v1.GetPreviewWorkloadRecommendationResponse], error) + GetPreviewWorkloadRecommendations(context.Context, *connect.Request[v1.GetPreviewWorkloadRecommendationsRequest]) (*connect.Response[v1.GetPreviewWorkloadRecommendationsResponse], error) + GetRecommendationsForWorkload(context.Context, *connect.Request[v1.GetRecommendationsForWorkloadRequest]) (*connect.Response[v1.GetRecommendationsForWorkloadResponse], error) + GetRecommendations(context.Context, *connect.Request[v1.GetRecommendationsRequest]) (*connect.Response[v1.GetRecommendationsResponse], error) + // NodeGroup Recommendation Policies (Deprecated) + // + // Deprecated: do not use. + CreateNodeGroupRecommendationPolicy(context.Context, *connect.Request[v1.CreateNodeGroupRecommendationPolicyRequest]) (*connect.Response[v1.CreateNodeGroupRecommendationPolicyResponse], error) + // Deprecated: do not use. + GetNodeGroupRecommendationPolicy(context.Context, *connect.Request[v1.GetNodeGroupRecommendationPolicyRequest]) (*connect.Response[v1.GetNodeGroupRecommendationPolicyResponse], error) + // Deprecated: do not use. + ListNodeGroupRecommendationPolicies(context.Context, *connect.Request[v1.ListNodeGroupRecommendationPoliciesRequest]) (*connect.Response[v1.ListNodeGroupRecommendationPoliciesResponse], error) // Deprecated: do not use. UpdateNodeGroupRecommendationPolicy(context.Context, *connect.Request[v1.UpdateNodeGroupRecommendationPolicyRequest]) (*connect.Response[v1.UpdateNodeGroupRecommendationPolicyResponse], error) // Deprecated: do not use. @@ -2030,6 +2981,26 @@ type K8SRecommendationServiceHandler interface { DeleteNodePolicy(context.Context, *connect.Request[v1.DeleteNodePolicyRequest]) (*connect.Response[v1.DeleteNodePolicyResponse], error) SuggestedNodePolicy(context.Context, *connect.Request[v1.SuggestedNodePolicyRequest]) (*connect.Response[v1.SuggestedNodePolicyResponse], error) SuggestedKarpenterConfig(context.Context, *connect.Request[v1.SuggestedKarpenterConfigRequest]) (*connect.Response[v1.SuggestedKarpenterConfigResponse], error) + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) @@ -2056,12 +3027,38 @@ type K8SRecommendationServiceHandler interface { // policy. The FE polls this while a batch is in flight so the toggle CTA can // render "9/10 labelled, 1 failed". GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) // Migration wizard state management GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) UpdateMigrationState(context.Context, *connect.Request[v1.UpdateMigrationStateRequest]) (*connect.Response[v1.UpdateMigrationStateResponse], error) + // Karpenter migration wizard + GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) + UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) + DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) + AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) + GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) + GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) // NodePool validation phone-home ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) GetNodePoolValidations(context.Context, *connect.Request[v1.GetNodePoolValidationsRequest]) (*connect.Response[v1.GetNodePoolValidationsResponse], error) @@ -2072,6 +3069,7 @@ type K8SRecommendationServiceHandler interface { GetInstanceFamilies(context.Context, *connect.Request[v1.GetInstanceFamiliesRequest]) (*connect.Response[v1.GetInstanceFamiliesResponse], error) GetInstanceSizes(context.Context, *connect.Request[v1.GetInstanceSizesRequest]) (*connect.Response[v1.GetInstanceSizesResponse], error) GetInstanceCategories(context.Context, *connect.Request[v1.GetInstanceCategoriesRequest]) (*connect.Response[v1.GetInstanceCategoriesResponse], error) + GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) GetInstanceTypeNames(context.Context, *connect.Request[v1.GetInstanceTypeNamesRequest]) (*connect.Response[v1.GetInstanceTypeNamesResponse], error) // PodDisruptionBudget RPCs @@ -2080,6 +3078,11 @@ type K8SRecommendationServiceHandler interface { CreatePodDisruptionBudget(context.Context, *connect.Request[v1.CreatePodDisruptionBudgetRequest]) (*connect.Response[v1.CreatePodDisruptionBudgetResponse], error) // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) GetPDBRecommendationForWorkload(context.Context, *connect.Request[v1.GetPDBRecommendationForWorkloadRequest]) (*connect.Response[v1.GetPDBRecommendationForWorkloadResponse], error) + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) // Storage Recommendation Policies CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) GetStorageRecommendationPolicy(context.Context, *connect.Request[v1.GetStorageRecommendationPolicyRequest]) (*connect.Response[v1.GetStorageRecommendationPolicyResponse], error) @@ -2108,10 +3111,30 @@ type K8SRecommendationServiceHandler interface { CreateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.CreateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.CreateWorkloadOptimizationPolicyResponse], error) ListWorkloadOptimizationPolicies(context.Context, *connect.Request[v1.ListWorkloadOptimizationPoliciesRequest]) (*connect.Response[v1.ListWorkloadOptimizationPoliciesResponse], error) GetWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyResponse], error) + GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) + // The sole way to change an existing policy's disabled state. See message doc. + ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) + // Scheduler Policies: CRUD + targeting preview + CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) + ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) + UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) + ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) + DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) + PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) // MPA V3: Workload Rules (CRUD) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) + // The sole way to change an EXISTING rule's disabled state. See message doc. + ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) GetWorkloadRulesByPolicy(context.Context, *connect.Request[v1.GetWorkloadRulesByPolicyRequest]) (*connect.Response[v1.GetWorkloadRulesByPolicyResponse], error) ListWorkloadRules(context.Context, *connect.Request[v1.ListWorkloadRulesRequest]) (*connect.Response[v1.ListWorkloadRulesResponse], error) @@ -2119,10 +3142,58 @@ type K8SRecommendationServiceHandler interface { GetWorkloadRuleByWorkload(context.Context, *connect.Request[v1.GetWorkloadRuleByWorkloadRequest]) (*connect.Response[v1.GetWorkloadRuleByWorkloadResponse], error) GetWorkloadByWorkloadRule(context.Context, *connect.Request[v1.GetWorkloadByWorkloadRuleRequest]) (*connect.Response[v1.GetWorkloadByWorkloadRuleResponse], error) DeleteWorkloadRule(context.Context, *connect.Request[v1.DeleteWorkloadRuleRequest]) (*connect.Response[v1.DeleteWorkloadRuleResponse], error) + DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) + BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) + BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) BatchAutoOptimizeWorkloads(context.Context, *connect.Request[v1.BatchAutoOptimizeWorkloadsRequest]) (*connect.Response[v1.BatchAutoOptimizeWorkloadsResponse], error) + BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) + BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) + ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) // Get current node pool config status and recent apply history for a cluster GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) + // ---- Snapshot policies (resilience) — spec §5 ---- + CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) + ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) + UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) + DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) + CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) + ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) + UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) + DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) + ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) + UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) + DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) + CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) + ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) + UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) + DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) + // Arms a forensic capture run: the ONLY way run_generation moves. + TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) + // ---- Targeting preview + read model + delivery status ---- + PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) + PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) + GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) + GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) + GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) + GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) + PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) } // NewK8SRecommendationServiceHandler builds an HTTP handler from the service implementation. It @@ -2411,6 +3482,16 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.SuggestedKarpenterConfig, opts..., ) + k8SRecommendationServiceSuggestNodePolicyImprovementsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure, + svc.SuggestNodePolicyImprovements, + opts..., + ) + k8SRecommendationServiceListClusterNodePolicySuggestionsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure, + svc.ListClusterNodePolicySuggestions, + opts..., + ) k8SRecommendationServiceGenerateNodePoliciesFromKarpenterHandler := connect.NewUnaryHandler( K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure, svc.GenerateNodePoliciesFromKarpenter, @@ -2441,11 +3522,26 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetCheckpointApplyStatus, opts..., ) + k8SRecommendationServiceGetClusterCheckpointLabelCoverageHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure, + svc.GetClusterCheckpointLabelCoverage, + opts..., + ) + k8SRecommendationServiceListNodeGroupCheckpointLabelStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure, + svc.ListNodeGroupCheckpointLabelState, + opts..., + ) k8SRecommendationServiceGetNodeAnnotationReadinessHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetNodeAnnotationReadinessProcedure, svc.GetNodeAnnotationReadiness, opts..., ) + k8SRecommendationServiceDetectClusterAutoscalerHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDetectClusterAutoscalerProcedure, + svc.DetectClusterAutoscaler, + opts..., + ) k8SRecommendationServiceGetMigrationStateHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetMigrationStateProcedure, svc.GetMigrationState, @@ -2456,6 +3552,36 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.UpdateMigrationState, opts..., ) + k8SRecommendationServiceGetKarpenterMigrationStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterMigrationStateProcedure, + svc.GetKarpenterMigrationState, + opts..., + ) + k8SRecommendationServiceUpdateKarpenterMigrationStateHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure, + svc.UpdateKarpenterMigrationState, + opts..., + ) + k8SRecommendationServiceDetectKarpenterOwnershipConflictsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure, + svc.DetectKarpenterOwnershipConflicts, + opts..., + ) + k8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictHandler := connect.NewUnaryHandler( + K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure, + svc.AcknowledgeKarpenterOwnershipConflict, + opts..., + ) + k8SRecommendationServiceGetKarpenterSourceResourcesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterSourceResourcesProcedure, + svc.GetKarpenterSourceResources, + opts..., + ) + k8SRecommendationServiceGetKarpenterAdoptionStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure, + svc.GetKarpenterAdoptionStatus, + opts..., + ) k8SRecommendationServiceReportNodePoolValidationHandler := connect.NewUnaryHandler( K8SRecommendationServiceReportNodePoolValidationProcedure, svc.ReportNodePoolValidation, @@ -2501,6 +3627,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetInstanceCategories, opts..., ) + k8SRecommendationServiceGetInstanceShapesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetInstanceShapesProcedure, + svc.GetInstanceShapes, + opts..., + ) k8SRecommendationServiceGetInstanceCPUsHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetInstanceCPUsProcedure, svc.GetInstanceCPUs, @@ -2531,6 +3662,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetPDBRecommendationForWorkload, opts..., ) + k8SRecommendationServiceListWorkloadStructuralHealthHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListWorkloadStructuralHealthProcedure, + svc.ListWorkloadStructuralHealth, + opts..., + ) k8SRecommendationServiceCreateStorageRecommendationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure, svc.CreateStorageRecommendationPolicy, @@ -2636,21 +3772,76 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure, + svc.GetWorkloadOptimizationPolicyByWorkload, + opts..., + ) k8SRecommendationServiceUpdateWorkloadOptimizationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure, svc.UpdateWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure, + svc.ToggleWorkloadOptimizationPolicyDisabled, + opts..., + ) k8SRecommendationServiceDeleteWorkloadOptimizationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure, svc.DeleteWorkloadOptimizationPolicy, opts..., ) + k8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure, + svc.PreviewWorkloadOptimizationPolicyMatches, + opts..., + ) + k8SRecommendationServiceCreateSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSchedulerPolicyProcedure, + svc.CreateSchedulerPolicy, + opts..., + ) + k8SRecommendationServiceListSchedulerPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSchedulerPoliciesProcedure, + svc.ListSchedulerPolicies, + opts..., + ) + k8SRecommendationServiceUpdateSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSchedulerPolicyProcedure, + svc.UpdateSchedulerPolicy, + opts..., + ) + k8SRecommendationServiceToggleSchedulerPolicyDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure, + svc.ToggleSchedulerPolicyDisabled, + opts..., + ) + k8SRecommendationServiceDeleteSchedulerPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSchedulerPolicyProcedure, + svc.DeleteSchedulerPolicy, + opts..., + ) + k8SRecommendationServicePreviewSchedulerPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure, + svc.PreviewSchedulerPolicyTargets, + opts..., + ) + k8SRecommendationServiceListSchedulerPolicyEnrollmentsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure, + svc.ListSchedulerPolicyEnrollments, + opts..., + ) k8SRecommendationServiceUpsertManualWorkloadRuleHandler := connect.NewUnaryHandler( K8SRecommendationServiceUpsertManualWorkloadRuleProcedure, svc.UpsertManualWorkloadRule, opts..., ) + k8SRecommendationServiceToggleWorkloadRuleDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure, + svc.ToggleWorkloadRuleDisabled, + opts..., + ) k8SRecommendationServicePreviewWorkloadRuleHandler := connect.NewUnaryHandler( K8SRecommendationServicePreviewWorkloadRuleProcedure, svc.PreviewWorkloadRule, @@ -2686,6 +3877,21 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.DeleteWorkloadRule, opts..., ) + k8SRecommendationServiceDeleteAllWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteAllWorkloadRulesProcedure, + svc.DeleteAllWorkloadRules, + opts..., + ) + k8SRecommendationServiceBulkDeleteWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure, + svc.BulkDeleteWorkloadRules, + opts..., + ) + k8SRecommendationServiceBulkToggleWorkloadRulesDisabledHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure, + svc.BulkToggleWorkloadRulesDisabled, + opts..., + ) k8SRecommendationServiceGetWorkloadContainerNamesHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetWorkloadContainerNamesProcedure, svc.GetWorkloadContainerNames, @@ -2696,11 +3902,161 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.BatchAutoOptimizeWorkloads, opts..., ) + k8SRecommendationServiceBatchUpsertManualWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure, + svc.BatchUpsertManualWorkloadRules, + opts..., + ) + k8SRecommendationServiceBatchPreviewWorkloadRulesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure, + svc.BatchPreviewWorkloadRules, + opts..., + ) + k8SRecommendationServiceApplyOneTimeOptimizationHandler := connect.NewUnaryHandler( + K8SRecommendationServiceApplyOneTimeOptimizationProcedure, + svc.ApplyOneTimeOptimization, + opts..., + ) + k8SRecommendationServiceDeleteRuleAndApplyRecommendationHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure, + svc.DeleteRuleAndApplyRecommendation, + opts..., + ) k8SRecommendationServiceGetNodeRecommendationStatusHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetNodeRecommendationStatusProcedure, svc.GetNodeRecommendationStatus, opts..., ) + k8SRecommendationServiceCreateSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSnapshotPoliciesProcedure, + svc.CreateSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceListSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSnapshotPoliciesProcedure, + svc.ListSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceUpdateSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSnapshotPolicyProcedure, + svc.UpdateSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceDeleteSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSnapshotPolicyProcedure, + svc.DeleteSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceCreateSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure, + svc.CreateSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceListSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListSnapshotPolicyTargetsProcedure, + svc.ListSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceUpdateSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure, + svc.UpdateSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceDeleteSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure, + svc.DeleteSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceCreateForensicSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure, + svc.CreateForensicSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceListForensicSnapshotPoliciesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListForensicSnapshotPoliciesProcedure, + svc.ListForensicSnapshotPolicies, + opts..., + ) + k8SRecommendationServiceUpdateForensicSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure, + svc.UpdateForensicSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceDeleteForensicSnapshotPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure, + svc.DeleteForensicSnapshotPolicy, + opts..., + ) + k8SRecommendationServiceCreateForensicSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure, + svc.CreateForensicSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceListForensicSnapshotPolicyTargetsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure, + svc.ListForensicSnapshotPolicyTargets, + opts..., + ) + k8SRecommendationServiceUpdateForensicSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure, + svc.UpdateForensicSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceDeleteForensicSnapshotPolicyTargetHandler := connect.NewUnaryHandler( + K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure, + svc.DeleteForensicSnapshotPolicyTarget, + opts..., + ) + k8SRecommendationServiceTriggerForensicSnapshotRunHandler := connect.NewUnaryHandler( + K8SRecommendationServiceTriggerForensicSnapshotRunProcedure, + svc.TriggerForensicSnapshotRun, + opts..., + ) + k8SRecommendationServiceListReferencedAuthenticationsHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListReferencedAuthenticationsProcedure, + svc.ListReferencedAuthentications, + opts..., + ) + k8SRecommendationServicePreviewSnapshotPolicyTargetMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure, + svc.PreviewSnapshotPolicyTargetMatches, + opts..., + ) + k8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure, + svc.PreviewForensicSnapshotPolicyTargetMatches, + opts..., + ) + k8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure, + svc.GetSnapshotPolicyTargetRenderedScope, + opts..., + ) + k8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure, + svc.GetForensicSnapshotPolicyTargetRenderedScope, + opts..., + ) + k8SRecommendationServiceGetSnapshotRecommendationStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure, + svc.GetSnapshotRecommendationStatus, + opts..., + ) + k8SRecommendationServiceGetForensicSnapshotRecommendationStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure, + svc.GetForensicSnapshotRecommendationStatus, + opts..., + ) + k8SRecommendationServicePreviewSnapshotRecommendationConfigHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure, + svc.PreviewSnapshotRecommendationConfig, + opts..., + ) + k8SRecommendationServicePreviewForensicSnapshotRecommendationConfigHandler := connect.NewUnaryHandler( + K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure, + svc.PreviewForensicSnapshotRecommendationConfig, + opts..., + ) return "/api.v1.K8sRecommendationService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case K8SRecommendationServiceGetNodeGroupStatsProcedure: @@ -2815,6 +4171,10 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceSuggestedNodePolicyHandler.ServeHTTP(w, r) case K8SRecommendationServiceSuggestedKarpenterConfigProcedure: k8SRecommendationServiceSuggestedKarpenterConfigHandler.ServeHTTP(w, r) + case K8SRecommendationServiceSuggestNodePolicyImprovementsProcedure: + k8SRecommendationServiceSuggestNodePolicyImprovementsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListClusterNodePolicySuggestionsProcedure: + k8SRecommendationServiceListClusterNodePolicySuggestionsHandler.ServeHTTP(w, r) case K8SRecommendationServiceGenerateNodePoliciesFromKarpenterProcedure: k8SRecommendationServiceGenerateNodePoliciesFromKarpenterHandler.ServeHTTP(w, r) case K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure: @@ -2827,12 +4187,30 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceEnableCheckpointForPolicyHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetCheckpointApplyStatusProcedure: k8SRecommendationServiceGetCheckpointApplyStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetClusterCheckpointLabelCoverageProcedure: + k8SRecommendationServiceGetClusterCheckpointLabelCoverageHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListNodeGroupCheckpointLabelStateProcedure: + k8SRecommendationServiceListNodeGroupCheckpointLabelStateHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodeAnnotationReadinessProcedure: k8SRecommendationServiceGetNodeAnnotationReadinessHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDetectClusterAutoscalerProcedure: + k8SRecommendationServiceDetectClusterAutoscalerHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetMigrationStateProcedure: k8SRecommendationServiceGetMigrationStateHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpdateMigrationStateProcedure: k8SRecommendationServiceUpdateMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterMigrationStateProcedure: + k8SRecommendationServiceGetKarpenterMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateKarpenterMigrationStateProcedure: + k8SRecommendationServiceUpdateKarpenterMigrationStateHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDetectKarpenterOwnershipConflictsProcedure: + k8SRecommendationServiceDetectKarpenterOwnershipConflictsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictProcedure: + k8SRecommendationServiceAcknowledgeKarpenterOwnershipConflictHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterSourceResourcesProcedure: + k8SRecommendationServiceGetKarpenterSourceResourcesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetKarpenterAdoptionStatusProcedure: + k8SRecommendationServiceGetKarpenterAdoptionStatusHandler.ServeHTTP(w, r) case K8SRecommendationServiceReportNodePoolValidationProcedure: k8SRecommendationServiceReportNodePoolValidationHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodePoolValidationsProcedure: @@ -2851,6 +4229,8 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceGetInstanceSizesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceCategoriesProcedure: k8SRecommendationServiceGetInstanceCategoriesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetInstanceShapesProcedure: + k8SRecommendationServiceGetInstanceShapesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceCPUsProcedure: k8SRecommendationServiceGetInstanceCPUsHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetInstanceTypeNamesProcedure: @@ -2863,6 +4243,8 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceCreatePodDisruptionBudgetHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetPDBRecommendationForWorkloadProcedure: k8SRecommendationServiceGetPDBRecommendationForWorkloadHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListWorkloadStructuralHealthProcedure: + k8SRecommendationServiceListWorkloadStructuralHealthHandler.ServeHTTP(w, r) case K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure: k8SRecommendationServiceCreateStorageRecommendationPolicyHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetStorageRecommendationPolicyProcedure: @@ -2905,12 +4287,34 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceListWorkloadOptimizationPoliciesHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceGetWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadProcedure: + k8SRecommendationServiceGetWorkloadOptimizationPolicyByWorkloadHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpdateWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceUpdateWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledProcedure: + k8SRecommendationServiceToggleWorkloadOptimizationPolicyDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServiceDeleteWorkloadOptimizationPolicyProcedure: k8SRecommendationServiceDeleteWorkloadOptimizationPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesProcedure: + k8SRecommendationServicePreviewWorkloadOptimizationPolicyMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSchedulerPolicyProcedure: + k8SRecommendationServiceCreateSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSchedulerPoliciesProcedure: + k8SRecommendationServiceListSchedulerPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSchedulerPolicyProcedure: + k8SRecommendationServiceUpdateSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleSchedulerPolicyDisabledProcedure: + k8SRecommendationServiceToggleSchedulerPolicyDisabledHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSchedulerPolicyProcedure: + k8SRecommendationServiceDeleteSchedulerPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSchedulerPolicyTargetsProcedure: + k8SRecommendationServicePreviewSchedulerPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSchedulerPolicyEnrollmentsProcedure: + k8SRecommendationServiceListSchedulerPolicyEnrollmentsHandler.ServeHTTP(w, r) case K8SRecommendationServiceUpsertManualWorkloadRuleProcedure: k8SRecommendationServiceUpsertManualWorkloadRuleHandler.ServeHTTP(w, r) + case K8SRecommendationServiceToggleWorkloadRuleDisabledProcedure: + k8SRecommendationServiceToggleWorkloadRuleDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServicePreviewWorkloadRuleProcedure: k8SRecommendationServicePreviewWorkloadRuleHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadRulesByPolicyProcedure: @@ -2925,12 +4329,78 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt k8SRecommendationServiceGetWorkloadByWorkloadRuleHandler.ServeHTTP(w, r) case K8SRecommendationServiceDeleteWorkloadRuleProcedure: k8SRecommendationServiceDeleteWorkloadRuleHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteAllWorkloadRulesProcedure: + k8SRecommendationServiceDeleteAllWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBulkDeleteWorkloadRulesProcedure: + k8SRecommendationServiceBulkDeleteWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBulkToggleWorkloadRulesDisabledProcedure: + k8SRecommendationServiceBulkToggleWorkloadRulesDisabledHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetWorkloadContainerNamesProcedure: k8SRecommendationServiceGetWorkloadContainerNamesHandler.ServeHTTP(w, r) case K8SRecommendationServiceBatchAutoOptimizeWorkloadsProcedure: k8SRecommendationServiceBatchAutoOptimizeWorkloadsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBatchUpsertManualWorkloadRulesProcedure: + k8SRecommendationServiceBatchUpsertManualWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceBatchPreviewWorkloadRulesProcedure: + k8SRecommendationServiceBatchPreviewWorkloadRulesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceApplyOneTimeOptimizationProcedure: + k8SRecommendationServiceApplyOneTimeOptimizationHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteRuleAndApplyRecommendationProcedure: + k8SRecommendationServiceDeleteRuleAndApplyRecommendationHandler.ServeHTTP(w, r) case K8SRecommendationServiceGetNodeRecommendationStatusProcedure: k8SRecommendationServiceGetNodeRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSnapshotPoliciesProcedure: + k8SRecommendationServiceCreateSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSnapshotPoliciesProcedure: + k8SRecommendationServiceListSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSnapshotPolicyProcedure: + k8SRecommendationServiceUpdateSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSnapshotPolicyProcedure: + k8SRecommendationServiceDeleteSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceCreateSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceListSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateSnapshotPolicyTargetProcedure: + k8SRecommendationServiceUpdateSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteSnapshotPolicyTargetProcedure: + k8SRecommendationServiceDeleteSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateForensicSnapshotPoliciesProcedure: + k8SRecommendationServiceCreateForensicSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListForensicSnapshotPoliciesProcedure: + k8SRecommendationServiceListForensicSnapshotPoliciesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateForensicSnapshotPolicyProcedure: + k8SRecommendationServiceUpdateForensicSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteForensicSnapshotPolicyProcedure: + k8SRecommendationServiceDeleteForensicSnapshotPolicyHandler.ServeHTTP(w, r) + case K8SRecommendationServiceCreateForensicSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceCreateForensicSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListForensicSnapshotPolicyTargetsProcedure: + k8SRecommendationServiceListForensicSnapshotPolicyTargetsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceUpdateForensicSnapshotPolicyTargetProcedure: + k8SRecommendationServiceUpdateForensicSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceDeleteForensicSnapshotPolicyTargetProcedure: + k8SRecommendationServiceDeleteForensicSnapshotPolicyTargetHandler.ServeHTTP(w, r) + case K8SRecommendationServiceTriggerForensicSnapshotRunProcedure: + k8SRecommendationServiceTriggerForensicSnapshotRunHandler.ServeHTTP(w, r) + case K8SRecommendationServiceListReferencedAuthenticationsProcedure: + k8SRecommendationServiceListReferencedAuthenticationsHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSnapshotPolicyTargetMatchesProcedure: + k8SRecommendationServicePreviewSnapshotPolicyTargetMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesProcedure: + k8SRecommendationServicePreviewForensicSnapshotPolicyTargetMatchesHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeProcedure: + k8SRecommendationServiceGetSnapshotPolicyTargetRenderedScopeHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeProcedure: + k8SRecommendationServiceGetForensicSnapshotPolicyTargetRenderedScopeHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetSnapshotRecommendationStatusProcedure: + k8SRecommendationServiceGetSnapshotRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetForensicSnapshotRecommendationStatusProcedure: + k8SRecommendationServiceGetForensicSnapshotRecommendationStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewSnapshotRecommendationConfigProcedure: + k8SRecommendationServicePreviewSnapshotRecommendationConfigHandler.ServeHTTP(w, r) + case K8SRecommendationServicePreviewForensicSnapshotRecommendationConfigProcedure: + k8SRecommendationServicePreviewForensicSnapshotRecommendationConfigHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -3164,6 +4634,14 @@ func (UnimplementedK8SRecommendationServiceHandler) SuggestedKarpenterConfig(con return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SuggestedKarpenterConfig is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) SuggestNodePolicyImprovements(context.Context, *connect.Request[v1.SuggestNodePolicyImprovementsRequest]) (*connect.Response[v1.SuggestNodePolicyImprovementsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SuggestNodePolicyImprovements is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListClusterNodePolicySuggestions(context.Context, *connect.Request[v1.ListClusterNodePolicySuggestionsRequest]) (*connect.Response[v1.ListClusterNodePolicySuggestionsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GenerateNodePoliciesFromKarpenter(context.Context, *connect.Request[v1.GenerateNodePoliciesFromKarpenterRequest]) (*connect.Response[v1.GenerateNodePoliciesFromKarpenterResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter is not implemented")) } @@ -3188,10 +4666,22 @@ func (UnimplementedK8SRecommendationServiceHandler) GetCheckpointApplyStatus(con return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetCheckpointApplyStatus is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetClusterCheckpointLabelCoverage(context.Context, *connect.Request[v1.GetClusterCheckpointLabelCoverageRequest]) (*connect.Response[v1.GetClusterCheckpointLabelCoverageResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListNodeGroupCheckpointLabelState(context.Context, *connect.Request[v1.ListNodeGroupCheckpointLabelStateRequest]) (*connect.Response[v1.ListNodeGroupCheckpointLabelStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetNodeAnnotationReadiness(context.Context, *connect.Request[v1.GetNodeAnnotationReadinessRequest]) (*connect.Response[v1.GetNodeAnnotationReadinessResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeAnnotationReadiness is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) DetectClusterAutoscaler(context.Context, *connect.Request[v1.DetectClusterAutoscalerRequest]) (*connect.Response[v1.DetectClusterAutoscalerResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DetectClusterAutoscaler is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetMigrationState(context.Context, *connect.Request[v1.GetMigrationStateRequest]) (*connect.Response[v1.GetMigrationStateResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetMigrationState is not implemented")) } @@ -3200,6 +4690,30 @@ func (UnimplementedK8SRecommendationServiceHandler) UpdateMigrationState(context return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateMigrationState is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterMigrationState(context.Context, *connect.Request[v1.GetKarpenterMigrationStateRequest]) (*connect.Response[v1.GetKarpenterMigrationStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterMigrationState is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateKarpenterMigrationState(context.Context, *connect.Request[v1.UpdateKarpenterMigrationStateRequest]) (*connect.Response[v1.UpdateKarpenterMigrationStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateKarpenterMigrationState is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DetectKarpenterOwnershipConflicts(context.Context, *connect.Request[v1.DetectKarpenterOwnershipConflictsRequest]) (*connect.Response[v1.DetectKarpenterOwnershipConflictsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) AcknowledgeKarpenterOwnershipConflict(context.Context, *connect.Request[v1.AcknowledgeKarpenterOwnershipConflictRequest]) (*connect.Response[v1.AcknowledgeKarpenterOwnershipConflictResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterSourceResources(context.Context, *connect.Request[v1.GetKarpenterSourceResourcesRequest]) (*connect.Response[v1.GetKarpenterSourceResourcesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterSourceResources is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetKarpenterAdoptionStatus(context.Context, *connect.Request[v1.GetKarpenterAdoptionStatusRequest]) (*connect.Response[v1.GetKarpenterAdoptionStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) ReportNodePoolValidation(context.Context, *connect.Request[v1.ReportNodePoolValidationRequest]) (*connect.Response[v1.ReportNodePoolValidationResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ReportNodePoolValidation is not implemented")) } @@ -3236,6 +4750,10 @@ func (UnimplementedK8SRecommendationServiceHandler) GetInstanceCategories(contex return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceCategories is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetInstanceShapes(context.Context, *connect.Request[v1.GetInstanceShapesRequest]) (*connect.Response[v1.GetInstanceShapesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceShapes is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetInstanceCPUs(context.Context, *connect.Request[v1.GetInstanceCPUsRequest]) (*connect.Response[v1.GetInstanceCPUsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetInstanceCPUs is not implemented")) } @@ -3260,6 +4778,10 @@ func (UnimplementedK8SRecommendationServiceHandler) GetPDBRecommendationForWorkl return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ListWorkloadStructuralHealth(context.Context, *connect.Request[v1.ListWorkloadStructuralHealthRequest]) (*connect.Response[v1.ListWorkloadStructuralHealthResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListWorkloadStructuralHealth is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) CreateStorageRecommendationPolicy(context.Context, *connect.Request[v1.CreateStorageRecommendationPolicyRequest]) (*connect.Response[v1.CreateStorageRecommendationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy is not implemented")) } @@ -3344,18 +4866,62 @@ func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadOptimizationPolic return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadOptimizationPolicyByWorkload(context.Context, *connect.Request[v1.GetWorkloadOptimizationPolicyByWorkloadRequest]) (*connect.Response[v1.GetWorkloadOptimizationPolicyByWorkloadResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) UpdateWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.UpdateWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.UpdateWorkloadOptimizationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ToggleWorkloadOptimizationPolicyDisabled(context.Context, *connect.Request[v1.ToggleWorkloadOptimizationPolicyDisabledRequest]) (*connect.Response[v1.ToggleWorkloadOptimizationPolicyDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) DeleteWorkloadOptimizationPolicy(context.Context, *connect.Request[v1.DeleteWorkloadOptimizationPolicyRequest]) (*connect.Response[v1.DeleteWorkloadOptimizationPolicyResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) PreviewWorkloadOptimizationPolicyMatches(context.Context, *connect.Request[v1.PreviewWorkloadOptimizationPolicyMatchesRequest]) (*connect.Response[v1.PreviewWorkloadOptimizationPolicyMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateSchedulerPolicy(context.Context, *connect.Request[v1.CreateSchedulerPolicyRequest]) (*connect.Response[v1.CreateSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSchedulerPolicies(context.Context, *connect.Request[v1.ListSchedulerPoliciesRequest]) (*connect.Response[v1.ListSchedulerPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSchedulerPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSchedulerPolicy(context.Context, *connect.Request[v1.UpdateSchedulerPolicyRequest]) (*connect.Response[v1.UpdateSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ToggleSchedulerPolicyDisabled(context.Context, *connect.Request[v1.ToggleSchedulerPolicyDisabledRequest]) (*connect.Response[v1.ToggleSchedulerPolicyDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSchedulerPolicy(context.Context, *connect.Request[v1.DeleteSchedulerPolicyRequest]) (*connect.Response[v1.DeleteSchedulerPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSchedulerPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSchedulerPolicyTargets(context.Context, *connect.Request[v1.PreviewSchedulerPolicyTargetsRequest]) (*connect.Response[v1.PreviewSchedulerPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSchedulerPolicyEnrollments(context.Context, *connect.Request[v1.ListSchedulerPolicyEnrollmentsRequest]) (*connect.Response[v1.ListSchedulerPolicyEnrollmentsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) UpsertManualWorkloadRule(context.Context, *connect.Request[v1.UpsertManualWorkloadRuleRequest]) (*connect.Response[v1.UpsertManualWorkloadRuleResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpsertManualWorkloadRule is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) ToggleWorkloadRuleDisabled(context.Context, *connect.Request[v1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[v1.ToggleWorkloadRuleDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) PreviewWorkloadRule(context.Context, *connect.Request[v1.PreviewWorkloadRuleRequest]) (*connect.Response[v1.PreviewWorkloadRuleResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewWorkloadRule is not implemented")) } @@ -3384,6 +4950,18 @@ func (UnimplementedK8SRecommendationServiceHandler) DeleteWorkloadRule(context.C return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteWorkloadRule is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) DeleteAllWorkloadRules(context.Context, *connect.Request[v1.DeleteAllWorkloadRulesRequest]) (*connect.Response[v1.DeleteAllWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteAllWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BulkDeleteWorkloadRules(context.Context, *connect.Request[v1.BulkDeleteWorkloadRulesRequest]) (*connect.Response[v1.BulkDeleteWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BulkDeleteWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BulkToggleWorkloadRulesDisabled(context.Context, *connect.Request[v1.BulkToggleWorkloadRulesDisabledRequest]) (*connect.Response[v1.BulkToggleWorkloadRulesDisabledResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetWorkloadContainerNames(context.Context, *connect.Request[v1.GetWorkloadContainerNamesRequest]) (*connect.Response[v1.GetWorkloadContainerNamesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetWorkloadContainerNames is not implemented")) } @@ -3392,6 +4970,126 @@ func (UnimplementedK8SRecommendationServiceHandler) BatchAutoOptimizeWorkloads(c return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) BatchUpsertManualWorkloadRules(context.Context, *connect.Request[v1.BatchUpsertManualWorkloadRulesRequest]) (*connect.Response[v1.BatchUpsertManualWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) BatchPreviewWorkloadRules(context.Context, *connect.Request[v1.BatchPreviewWorkloadRulesRequest]) (*connect.Response[v1.BatchPreviewWorkloadRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.BatchPreviewWorkloadRules is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ApplyOneTimeOptimization(context.Context, *connect.Request[v1.ApplyOneTimeOptimizationRequest]) (*connect.Response[v1.ApplyOneTimeOptimizationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ApplyOneTimeOptimization is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteRuleAndApplyRecommendation(context.Context, *connect.Request[v1.DeleteRuleAndApplyRecommendationRequest]) (*connect.Response[v1.DeleteRuleAndApplyRecommendationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation is not implemented")) +} + func (UnimplementedK8SRecommendationServiceHandler) GetNodeRecommendationStatus(context.Context, *connect.Request[v1.GetNodeRecommendationStatusRequest]) (*connect.Response[v1.GetNodeRecommendationStatusResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeRecommendationStatus is not implemented")) } + +func (UnimplementedK8SRecommendationServiceHandler) CreateSnapshotPolicies(context.Context, *connect.Request[v1.CreateSnapshotPoliciesRequest]) (*connect.Response[v1.CreateSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSnapshotPolicies(context.Context, *connect.Request[v1.ListSnapshotPoliciesRequest]) (*connect.Response[v1.ListSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSnapshotPolicy(context.Context, *connect.Request[v1.UpdateSnapshotPolicyRequest]) (*connect.Response[v1.UpdateSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSnapshotPolicy(context.Context, *connect.Request[v1.DeleteSnapshotPolicyRequest]) (*connect.Response[v1.DeleteSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateForensicSnapshotPolicies(context.Context, *connect.Request[v1.CreateForensicSnapshotPoliciesRequest]) (*connect.Response[v1.CreateForensicSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListForensicSnapshotPolicies(context.Context, *connect.Request[v1.ListForensicSnapshotPoliciesRequest]) (*connect.Response[v1.ListForensicSnapshotPoliciesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListForensicSnapshotPolicies is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateForensicSnapshotPolicy(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteForensicSnapshotPolicy(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) CreateForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.CreateForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.CreateForensicSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListForensicSnapshotPolicyTargets(context.Context, *connect.Request[v1.ListForensicSnapshotPolicyTargetsRequest]) (*connect.Response[v1.ListForensicSnapshotPolicyTargetsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) UpdateForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.UpdateForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.UpdateForensicSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) DeleteForensicSnapshotPolicyTarget(context.Context, *connect.Request[v1.DeleteForensicSnapshotPolicyTargetRequest]) (*connect.Response[v1.DeleteForensicSnapshotPolicyTargetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) TriggerForensicSnapshotRun(context.Context, *connect.Request[v1.TriggerForensicSnapshotRunRequest]) (*connect.Response[v1.TriggerForensicSnapshotRunResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.TriggerForensicSnapshotRun is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) ListReferencedAuthentications(context.Context, *connect.Request[v1.ListReferencedAuthenticationsRequest]) (*connect.Response[v1.ListReferencedAuthenticationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.ListReferencedAuthentications is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewSnapshotPolicyTargetMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewForensicSnapshotPolicyTargetMatches(context.Context, *connect.Request[v1.PreviewForensicSnapshotPolicyTargetMatchesRequest]) (*connect.Response[v1.PreviewForensicSnapshotPolicyTargetMatchesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetSnapshotPolicyTargetRenderedScopeResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetForensicSnapshotPolicyTargetRenderedScope(context.Context, *connect.Request[v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest]) (*connect.Response[v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetSnapshotRecommendationStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetForensicSnapshotRecommendationStatus(context.Context, *connect.Request[v1.GetForensicSnapshotRecommendationStatusRequest]) (*connect.Response[v1.GetForensicSnapshotRecommendationStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewSnapshotRecommendationConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) PreviewForensicSnapshotRecommendationConfig(context.Context, *connect.Request[v1.PreviewForensicSnapshotRecommendationConfigRequest]) (*connect.Response[v1.PreviewForensicSnapshotRecommendationConfigResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig is not implemented")) +} diff --git a/internal/gen/api/v1/cluster.pb.go b/internal/gen/api/v1/cluster.pb.go index 8784bd7..35e3366 100644 --- a/internal/gen/api/v1/cluster.pb.go +++ b/internal/gen/api/v1/cluster.pb.go @@ -768,6 +768,8 @@ type GetNetworkDependenciesRequest struct { EndTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` SrcNamespaces []string `protobuf:"bytes,4,rep,name=src_namespaces,json=srcNamespaces,proto3" json:"src_namespaces,omitempty"` // Filter by source namespaces (optional) SrcNodeGroups []string `protobuf:"bytes,5,rep,name=src_node_groups,json=srcNodeGroups,proto3" json:"src_node_groups,omitempty"` // Filter by source node groups (optional) + Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"` // Max edges to return, ordered by rank_by (optional; 0/unset means no limit — all matching edges are returned) + RankBy string `protobuf:"bytes,7,opt,name=rank_by,json=rankBy,proto3" json:"rank_by,omitempty"` // Ordering dimension: "traffic" (default) or "cost" (optional; unset/unrecognized falls back to "traffic") } func (x *GetNetworkDependenciesRequest) Reset() { @@ -837,6 +839,20 @@ func (x *GetNetworkDependenciesRequest) GetSrcNodeGroups() []string { return nil } +func (x *GetNetworkDependenciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetNetworkDependenciesRequest) GetRankBy() string { + if x != nil { + return x.RankBy + } + return "" +} + // A workload node in the dependency graph type WorkloadNode struct { state protoimpl.MessageState @@ -2154,7 +2170,7 @@ var file_api_v1_cluster_proto_rawDesc = []byte{ 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 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, 0xff, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xae, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 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, @@ -2170,283 +2186,286 @@ var file_api_v1_cluster_proto_rawDesc = []byte{ 0x0d, 0x73, 0x72, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x72, 0x63, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x76, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x36, - 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x73, - 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x0b, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, - 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x64, 0x73, 0x74, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x0a, 0x64, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x12, - 0x64, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x10, 0x64, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x4e, 0x0a, - 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2c, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0xce, 0x02, - 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 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, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x72, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8e, - 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x22, - 0xc4, 0x01, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, - 0x6e, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x61, 0x6e, 0x6b, 0x42, 0x79, 0x22, 0x76, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0x36, 0x0a, + 0x0c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x4e, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x73, 0x72, + 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0b, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x37, 0x0a, 0x0c, + 0x64, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x64, 0x73, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x0b, 0x64, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0a, 0x64, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x64, + 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x10, 0x64, 0x73, 0x74, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, + 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, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0x4e, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, + 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0xce, 0x02, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 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, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbd, 0x04, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x72, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x72, + 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, + 0x72, 0x63, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x73, 0x72, 0x63, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x6d, 0x61, 0x78, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8e, 0x01, + 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x12, 0x2c, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x22, 0xc4, + 0x01, 0x0a, 0x0e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5a, 0x6f, 0x6e, + 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x21, 0x0a, 0x0c, - 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, - 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, - 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x14, 0x74, 0x78, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x74, 0x78, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x51, 0x0a, - 0x14, 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x72, 0x78, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x0f, 0x63, 0x6f, 0x73, - 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x73, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, - 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xec, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, - 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbd, 0x04, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 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, - 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2a, - 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6c, 0x69, - 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, - 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, - 0x02, 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2a, 0xcb, - 0x01, 0x0a, 0x19, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, - 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x27, - 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, - 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4c, 0x55, - 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, - 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, - 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, - 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x2c, - 0x0a, 0x28, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, - 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, - 0x51, 0x55, 0x49, 0x52, 0x45, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x03, 0x32, 0x80, 0x08, 0x0a, - 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, - 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x61, 0x73, - 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x2e, 0x61, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x78, 0x5f, 0x70, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x78, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x51, 0x0a, 0x14, 0x74, 0x78, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x74, 0x78, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x14, + 0x72, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x12, 0x72, 0x78, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x4a, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x0f, 0x63, 0x6f, 0x73, 0x74, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x7a, + 0x6f, 0x6e, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x7a, 0x6f, 0x6e, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x73, 0x0a, 0x17, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xec, 0x01, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, + 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, + 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6c, 0x69, 0x76, + 0x65, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, + 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x02, + 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2a, 0xcb, 0x01, + 0x0a, 0x19, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, + 0x73, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x27, 0x43, + 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, + 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4c, 0x55, 0x53, + 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x01, + 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, + 0x4e, 0x45, 0x53, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, + 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x2c, 0x0a, + 0x28, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x4e, 0x45, 0x53, + 0x53, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x51, + 0x55, 0x49, 0x52, 0x45, 0x5f, 0x4c, 0x49, 0x56, 0x45, 0x10, 0x03, 0x32, 0x80, 0x08, 0x0a, 0x0e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x61, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x61, 0x73, 0x69, + 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x42, 0x61, 0x73, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, + 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x8a, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0c, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, - 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x64, 0x61, 0x6b, 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, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x44, + 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x44, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x4e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, + 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8a, + 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, + 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, + 0x61, 0x6b, 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/internal/gen/api/v1/common.pb.go b/internal/gen/api/v1/common.pb.go index b36e899..42cd190 100644 --- a/internal/gen/api/v1/common.pb.go +++ b/internal/gen/api/v1/common.pb.go @@ -65,6 +65,14 @@ const ( K8SObjectKind_K8S_OBJECT_KIND_CNPG_CLUSTER K8SObjectKind = 35 K8SObjectKind_K8S_OBJECT_KIND_SPARK_APPLICATION K8SObjectKind = 36 K8SObjectKind_K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION K8SObjectKind = 37 + // Kyverno Policy and ClusterPolicy (kyverno.io/v1); one kind for both scopes. + K8SObjectKind_K8S_OBJECT_KIND_KYVERNO_POLICY K8SObjectKind = 38 + // Kyverno PolicyReport and ClusterPolicyReport (wgpolicyk8s.io/v1alpha2). + K8SObjectKind_K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT K8SObjectKind = 39 + // Gatekeeper ConstraintTemplate (templates.gatekeeper.sh/v1). + K8SObjectKind_K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE K8SObjectKind = 40 + // Gatekeeper constraint instances (constraints.gatekeeper.sh, dynamic kinds). + K8SObjectKind_K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT K8SObjectKind = 41 ) // Enum value maps for K8SObjectKind. @@ -108,46 +116,54 @@ var ( 35: "K8S_OBJECT_KIND_CNPG_CLUSTER", 36: "K8S_OBJECT_KIND_SPARK_APPLICATION", 37: "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION", + 38: "K8S_OBJECT_KIND_KYVERNO_POLICY", + 39: "K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT", + 40: "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE", + 41: "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT", } K8SObjectKind_value = map[string]int32{ - "K8S_OBJECT_KIND_UNSPECIFIED": 0, - "K8S_OBJECT_KIND_DEPLOYMENT": 1, - "K8S_OBJECT_KIND_REPLICA_SET": 2, - "K8S_OBJECT_KIND_STATEFUL_SET": 3, - "K8S_OBJECT_KIND_DAEMON_SET": 4, - "K8S_OBJECT_KIND_JOB": 5, - "K8S_OBJECT_KIND_CRON_JOB": 6, - "K8S_OBJECT_KIND_REPLICATION_CONTROLLER": 7, - "K8S_OBJECT_KIND_POD": 8, - "K8S_OBJECT_KIND_NAMESPACE": 9, - "K8S_OBJECT_KIND_NODE": 10, - "K8S_OBJECT_KIND_INGRESS": 11, - "K8S_OBJECT_KIND_CONTAINER": 12, - "K8S_OBJECT_KIND_SERVICE": 13, - "K8S_OBJECT_KIND_CONFIG_MAP": 14, - "K8S_OBJECT_KIND_PERSISTENT_VOLUME": 15, - "K8S_OBJECT_KIND_PERSISTENT_VOLUME_CLAIM": 16, - "K8S_OBJECT_KIND_STORAGE_CLASS": 17, - "K8S_OBJECT_KIND_ARGO_ROLLOUT": 18, - "K8S_OBJECT_KIND_HORIZONTAL_POD_AUTOSCALER": 19, - "K8S_OBJECT_KIND_VERTICAL_POD_AUTOSCALER": 20, - "K8S_OBJECT_KIND_LIMIT_RANGE": 21, - "K8S_OBJECT_KIND_SERVICE_ACCOUNT": 22, - "K8S_OBJECT_KIND_ROLE": 23, - "K8S_OBJECT_KIND_ROLE_BINDING": 24, - "K8S_OBJECT_KIND_KEDA_SCALED_OBJECT": 25, - "K8S_OBJECT_KIND_KARPENTER_RESOURCE": 26, - "K8S_OBJECT_KIND_POD_DISRUPTION_BUDGET": 27, - "K8S_OBJECT_KIND_RESOURCE_QUOTA": 28, - "K8S_OBJECT_KIND_KUBEFLOW_NOTEBOOK": 29, - "K8S_OBJECT_KIND_VOLCANO_JOB": 30, - "K8S_OBJECT_KIND_SECRET": 31, - "K8S_OBJECT_KIND_CLUSTER_ROLE": 32, - "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING": 33, - "K8S_OBJECT_KIND_NETWORK_POLICY": 34, - "K8S_OBJECT_KIND_CNPG_CLUSTER": 35, - "K8S_OBJECT_KIND_SPARK_APPLICATION": 36, - "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION": 37, + "K8S_OBJECT_KIND_UNSPECIFIED": 0, + "K8S_OBJECT_KIND_DEPLOYMENT": 1, + "K8S_OBJECT_KIND_REPLICA_SET": 2, + "K8S_OBJECT_KIND_STATEFUL_SET": 3, + "K8S_OBJECT_KIND_DAEMON_SET": 4, + "K8S_OBJECT_KIND_JOB": 5, + "K8S_OBJECT_KIND_CRON_JOB": 6, + "K8S_OBJECT_KIND_REPLICATION_CONTROLLER": 7, + "K8S_OBJECT_KIND_POD": 8, + "K8S_OBJECT_KIND_NAMESPACE": 9, + "K8S_OBJECT_KIND_NODE": 10, + "K8S_OBJECT_KIND_INGRESS": 11, + "K8S_OBJECT_KIND_CONTAINER": 12, + "K8S_OBJECT_KIND_SERVICE": 13, + "K8S_OBJECT_KIND_CONFIG_MAP": 14, + "K8S_OBJECT_KIND_PERSISTENT_VOLUME": 15, + "K8S_OBJECT_KIND_PERSISTENT_VOLUME_CLAIM": 16, + "K8S_OBJECT_KIND_STORAGE_CLASS": 17, + "K8S_OBJECT_KIND_ARGO_ROLLOUT": 18, + "K8S_OBJECT_KIND_HORIZONTAL_POD_AUTOSCALER": 19, + "K8S_OBJECT_KIND_VERTICAL_POD_AUTOSCALER": 20, + "K8S_OBJECT_KIND_LIMIT_RANGE": 21, + "K8S_OBJECT_KIND_SERVICE_ACCOUNT": 22, + "K8S_OBJECT_KIND_ROLE": 23, + "K8S_OBJECT_KIND_ROLE_BINDING": 24, + "K8S_OBJECT_KIND_KEDA_SCALED_OBJECT": 25, + "K8S_OBJECT_KIND_KARPENTER_RESOURCE": 26, + "K8S_OBJECT_KIND_POD_DISRUPTION_BUDGET": 27, + "K8S_OBJECT_KIND_RESOURCE_QUOTA": 28, + "K8S_OBJECT_KIND_KUBEFLOW_NOTEBOOK": 29, + "K8S_OBJECT_KIND_VOLCANO_JOB": 30, + "K8S_OBJECT_KIND_SECRET": 31, + "K8S_OBJECT_KIND_CLUSTER_ROLE": 32, + "K8S_OBJECT_KIND_CLUSTER_ROLE_BINDING": 33, + "K8S_OBJECT_KIND_NETWORK_POLICY": 34, + "K8S_OBJECT_KIND_CNPG_CLUSTER": 35, + "K8S_OBJECT_KIND_SPARK_APPLICATION": 36, + "K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION": 37, + "K8S_OBJECT_KIND_KYVERNO_POLICY": 38, + "K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT": 39, + "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE": 40, + "K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT": 41, } ) @@ -225,13 +241,36 @@ func (OrderByEnum) EnumDescriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{1} } -// LabelSelectorOperator is the set of operators that can be used in a selector requirement. +// LabelSelectorOperator is the set of operators that can be used in a selector +// requirement. +// +// The message shape mirrors Kubernetes metav1.LabelSelector, and matching +// follows Kubernetes for the IN and NOT_IN operators. In particular, a +// workload whose labels lack the key still matches NOT_IN, because a missing +// key is not in the set. This agrees with Kubernetes: in +// k8s.io/apimachinery/pkg/labels, Requirement.Matches returns true for NotIn +// when the key is absent, so it is not a divergence. +// +// Two DevZero-specific caveats apply (PC-1452): +// +// First, the department and workload filter paths implement only IN and +// NOT_IN. EXISTS, DOES_NOT_EXIST, GT, and LT are part of this proto for shape +// compatibility but are not honored by those SQL filters. +// +// Second, a workload whose entire labels or annotations column is SQL NULL +// (an unset column, distinct from an empty map) is EXCLUDED from a NOT_IN +// match by the department query, which ANDs a column IS NOT NULL guard ahead +// of the selector condition (dakr/repositories/departments.go). This is a +// genuine divergence from Kubernetes, which matches a label-less object +// against NotIn. It is also inconsistent with the workload-metrics filter +// path, which matches a NULL column against NOT_IN +// (dakr/repositories/workload_metrics_filters.go). type LabelSelectorOperator int32 const ( LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED LabelSelectorOperator = 0 LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_IN LabelSelectorOperator = 1 // In - LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_NOT_IN LabelSelectorOperator = 2 // NotIn + LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_NOT_IN LabelSelectorOperator = 2 // NotIn (missing key matches; see caveats above and PC-1452) LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_EXISTS LabelSelectorOperator = 3 // Exists LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST LabelSelectorOperator = 4 // DoesNotExist LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT LabelSelectorOperator = 5 // GreaterThan @@ -340,6 +379,136 @@ func (WorkloadStatusFilter) EnumDescriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{3} } +// DisruptionBlockReason is the structured classification of a consolidation / scale-down +// block: why the autoscaler could not remove a node. +// +// Assigned by zxporter at ingest time, because only the collector has the inputs the +// answer needs — the blocked pods' annotations, live PodDisruptionBudget status, the +// NodeClaim's terminationGracePeriod deadline, and (on Cluster Autoscaler) the +// `cluster-autoscaler-status` ConfigMap. dakr has none of those at read time, and the +// event's own message is unversioned free text that has changed shape across releases. +// +// ONE ENUM FOR BOTH AUTOSCALERS. Karpenter's `DisruptionBlocked` events and Cluster +// Autoscaler's synthesized `ScaleDownBlocked` observations share these buckets: two mean +// the same thing under either autoscaler, the rest are specific to one. Which autoscaler +// produced a row is answered by its `reporting_controller`, not by a second enum — that is +// what lets one report cover a Karpenter cluster, a CAS cluster, and a cluster running +// both mid-migration. +// +// The value names map 1:1 to models.DisruptionBlockReason and to the +// k8s_events.disruption_block_reason ClickHouse column's string values. That column is +// LowCardinality(String), not Enum8, so appending a value here costs no migration. +type DisruptionBlockReason int32 + +const ( + // Not a disruption-block event, or an event ingested before classification existed. + // Deliberately distinct from OTHER: this means "never classified", where OTHER means + // "classified, and matched no known pattern". + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_UNSPECIFIED DisruptionBlockReason = 0 + // A PodDisruptionBudget selecting a pod on the node currently allows no disruptions. + // blocking_pdb_name carries which one. Both autoscalers (on Cluster Autoscaler this is + // the BlockedByPod unremovable reason with a NotEnoughPdb blocking pod). + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_PDB_VIOLATION DisruptionBlockReason = 1 + // A pod on the node, or the node itself, is annotated un-evictable. Both autoscalers: + // `karpenter.sh/do-not-disrupt: "true"` on a pod (Karpenter), + // `cluster-autoscaler.kubernetes.io/safe-to-evict: "false"` on a pod, or + // `cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"` on a node (CAS). + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION DisruptionBlockReason = 2 + // The NodeClaim's terminationGracePeriod deadline has already elapsed, so Karpenter + // will force-terminate past both PDBs and do-not-disrupt. Karpenter-only: Cluster + // Autoscaler has no equivalent override. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED DisruptionBlockReason = 3 + // Classified, but the block matched none of the above — e.g. a node-level block + // (uninitialized, already deleting, missing its NodePool label), or any Cluster + // Autoscaler unremovable reason without its own bucket (NodeGroupMinSizeReached, + // NotUnderutilized, CurrentlyBeingDeleted, ...). The verbatim `message` is the only + // remaining detail, which is why it is never dropped. This is the REQUIRED fallback: + // dakr rejects an event carrying a value outside this enum. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_OTHER DisruptionBlockReason = 4 + // Cluster Autoscaler considers the node underutilized but has not yet seen it stay that + // way for --scale-down-unneeded-time. A waiting state rather than a misconfiguration, + // and the most common thing a healthy CAS cluster reports — hence its own bucket rather + // than OTHER. Cluster-Autoscaler-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH DisruptionBlockReason = 5 + // Cluster Autoscaler's scheduling simulation found nowhere to move the node's pods to, + // so the node cannot be drained. Actionable, unlike NOT_UNNEEDED_LONG_ENOUGH. + // Cluster-Autoscaler-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS DisruptionBlockReason = 6 + // The scheduler has provisionally assigned a pending pod to this node + // (pod.Status.NominatedNodeName). The autoscaler will not disrupt a node it is about to + // hand a pod, since that would just make the pod re-pend immediately — a self-resolving, + // expected-waiting state, not a misconfiguration. related_pod_name carries the pod. + // Derived structurally, not from the event message — reachable via the Karpenter path + // today. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_POD_NOMINATED DisruptionBlockReason = 7 + // Karpenter's own `disruption.budgets` allowance for the NodePool is currently spent, so + // it throttled itself. Operationally the opposite of every other value here: a config + // choice the cluster's owner made, not an obstruction to go find, which is why it is not + // folded into OTHER. Reported against the NodePool rather than a node, so it counts as a + // blocking event and never as a blocked node. Karpenter-only. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET DisruptionBlockReason = 8 + // Karpenter's scheduling simulation found nowhere for the node's pods to go, so draining + // it would leave them pending. Same situation as NO_PLACE_TO_MOVE_PODS, which is spelled + // to match Cluster Autoscaler's own unremovable reason verbatim and is therefore kept + // CAS-only; the per-pod sub-reason stays readable in the verbatim `message`. + DisruptionBlockReason_DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE DisruptionBlockReason = 9 +) + +// Enum value maps for DisruptionBlockReason. +var ( + DisruptionBlockReason_name = map[int32]string{ + 0: "DISRUPTION_BLOCK_REASON_UNSPECIFIED", + 1: "DISRUPTION_BLOCK_REASON_PDB_VIOLATION", + 2: "DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION", + 3: "DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED", + 4: "DISRUPTION_BLOCK_REASON_OTHER", + 5: "DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH", + 6: "DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS", + 7: "DISRUPTION_BLOCK_REASON_POD_NOMINATED", + 8: "DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET", + 9: "DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE", + } + DisruptionBlockReason_value = map[string]int32{ + "DISRUPTION_BLOCK_REASON_UNSPECIFIED": 0, + "DISRUPTION_BLOCK_REASON_PDB_VIOLATION": 1, + "DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION": 2, + "DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED": 3, + "DISRUPTION_BLOCK_REASON_OTHER": 4, + "DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH": 5, + "DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS": 6, + "DISRUPTION_BLOCK_REASON_POD_NOMINATED": 7, + "DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET": 8, + "DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE": 9, + } +) + +func (x DisruptionBlockReason) Enum() *DisruptionBlockReason { + p := new(DisruptionBlockReason) + *p = x + return p +} + +func (x DisruptionBlockReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DisruptionBlockReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_common_proto_enumTypes[4].Descriptor() +} + +func (DisruptionBlockReason) Type() protoreflect.EnumType { + return &file_api_v1_common_proto_enumTypes[4] +} + +func (x DisruptionBlockReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DisruptionBlockReason.Descriptor instead. +func (DisruptionBlockReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{4} +} + // Represents a single audit log entry type AuditLogEntry struct { state protoimpl.MessageState @@ -676,6 +845,7 @@ type CostInfo struct { MoneyCpuCostForTimePeriod *money.Money `protobuf:"bytes,110,opt,name=money_cpu_cost_for_time_period,json=moneyCpuCostForTimePeriod,proto3" json:"money_cpu_cost_for_time_period,omitempty"` MoneyMemoryCostForTimePeriod *money.Money `protobuf:"bytes,111,opt,name=money_memory_cost_for_time_period,json=moneyMemoryCostForTimePeriod,proto3" json:"money_memory_cost_for_time_period,omitempty"` MoneyTotalCostForTimePeriod *money.Money `protobuf:"bytes,112,opt,name=money_total_cost_for_time_period,json=moneyTotalCostForTimePeriod,proto3" json:"money_total_cost_for_time_period,omitempty"` + MoneyNetworkCostForTimePeriod *money.Money `protobuf:"bytes,122,opt,name=money_network_cost_for_time_period,json=moneyNetworkCostForTimePeriod,proto3" json:"money_network_cost_for_time_period,omitempty"` MoneyOptimizedCpuCostForTimePeriod *money.Money `protobuf:"bytes,113,opt,name=money_optimized_cpu_cost_for_time_period,json=moneyOptimizedCpuCostForTimePeriod,proto3" json:"money_optimized_cpu_cost_for_time_period,omitempty"` MoneyOptimizedMemoryCostForTimePeriod *money.Money `protobuf:"bytes,114,opt,name=money_optimized_memory_cost_for_time_period,json=moneyOptimizedMemoryCostForTimePeriod,proto3" json:"money_optimized_memory_cost_for_time_period,omitempty"` MoneyOptimizedTotalCostForTimePeriod *money.Money `protobuf:"bytes,115,opt,name=money_optimized_total_cost_for_time_period,json=moneyOptimizedTotalCostForTimePeriod,proto3" json:"money_optimized_total_cost_for_time_period,omitempty"` @@ -986,6 +1156,13 @@ func (x *CostInfo) GetMoneyTotalCostForTimePeriod() *money.Money { return nil } +func (x *CostInfo) GetMoneyNetworkCostForTimePeriod() *money.Money { + if x != nil { + return x.MoneyNetworkCostForTimePeriod + } + return nil +} + func (x *CostInfo) GetMoneyOptimizedCpuCostForTimePeriod() *money.Money { if x != nil { return x.MoneyOptimizedCpuCostForTimePeriod @@ -1112,6 +1289,38 @@ type ResourceMetrics struct { NodeFsWrites float64 `protobuf:"fixed64,104,opt,name=node_fs_writes,json=nodeFsWrites,proto3" json:"node_fs_writes,omitempty"` // number // Pod count PodCount int32 `protobuf:"varint,111,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of distinct pods observed in this time bucket. + // JVM heap metrics (0 for non-Java containers) + JvmHeapUsedBytes int64 `protobuf:"varint,121,opt,name=jvm_heap_used_bytes,json=jvmHeapUsedBytes,proto3" json:"jvm_heap_used_bytes,omitempty"` + JvmHeapMaxBytes int64 `protobuf:"varint,122,opt,name=jvm_heap_max_bytes,json=jvmHeapMaxBytes,proto3" json:"jvm_heap_max_bytes,omitempty"` + // Memory RSS (Resident Set Size) in bytes from kubelet stats/summary (0 for non-RSS-reporting nodes) + ContainerMemoryRssBytes int64 `protobuf:"varint,123,opt,name=container_memory_rss_bytes,json=containerMemoryRssBytes,proto3" json:"container_memory_rss_bytes,omitempty"` + // Memory breakdown components (bytes). Relationship: + // + // usage_bytes = anonymous + file cache + swap cache + kernel (container_memory_usage_bytes / memory.current) + // working_set = usage_bytes - inactive_file (what the kubelet/OOM-killer acts on; stored as container_memory_usage) + // cache = active_file + inactive_file (file-backed, reclaimable) + // inactive_cache = max(0, usage_bytes - working_set) (reclaimable file cache) + // active_cache = max(0, cache - inactive_cache) (recently-used file cache) + // swap = swapped-out (non-resident) pages; tracked separately, NOT part of usage/working_set + ContainerMemoryCacheBytes int64 `protobuf:"varint,124,opt,name=container_memory_cache_bytes,json=containerMemoryCacheBytes,proto3" json:"container_memory_cache_bytes,omitempty"` + ContainerMemorySwapBytes int64 `protobuf:"varint,125,opt,name=container_memory_swap_bytes,json=containerMemorySwapBytes,proto3" json:"container_memory_swap_bytes,omitempty"` + ContainerMemoryActiveCacheBytes int64 `protobuf:"varint,126,opt,name=container_memory_active_cache_bytes,json=containerMemoryActiveCacheBytes,proto3" json:"container_memory_active_cache_bytes,omitempty"` + ContainerMemoryInactiveCacheBytes int64 `protobuf:"varint,127,opt,name=container_memory_inactive_cache_bytes,json=containerMemoryInactiveCacheBytes,proto3" json:"container_memory_inactive_cache_bytes,omitempty"` + // Runtime-aware cgroup signals (Plane 0, ADR-0037). Read directly from + // /sys/fs/cgroup by zxporter-nodemon (v2 primary). All are cumulative kernel + // counters; consumers derive windowed rates as last-first. + // + // cfs_* CPU CFS throttling (cpu.stat): real throttle, not a usage/limit ratio + // memory_events_max memory.events:max — allocations pinned against memory.max, the + // Guaranteed-memory ceiling counter that fires before/without an OOM kill + // *_pressure_*_usec PSI stall time (cpu.pressure/memory.pressure "total="), microseconds + ContainerCfsPeriods int64 `protobuf:"varint,128,opt,name=container_cfs_periods,json=containerCfsPeriods,proto3" json:"container_cfs_periods,omitempty"` + ContainerCfsThrottledPeriods int64 `protobuf:"varint,129,opt,name=container_cfs_throttled_periods,json=containerCfsThrottledPeriods,proto3" json:"container_cfs_throttled_periods,omitempty"` + ContainerCfsThrottledUsec int64 `protobuf:"varint,130,opt,name=container_cfs_throttled_usec,json=containerCfsThrottledUsec,proto3" json:"container_cfs_throttled_usec,omitempty"` + ContainerMemoryEventsMax int64 `protobuf:"varint,131,opt,name=container_memory_events_max,json=containerMemoryEventsMax,proto3" json:"container_memory_events_max,omitempty"` + ContainerCpuPressureSomeUsec int64 `protobuf:"varint,132,opt,name=container_cpu_pressure_some_usec,json=containerCpuPressureSomeUsec,proto3" json:"container_cpu_pressure_some_usec,omitempty"` + ContainerMemoryPressureSomeUsec int64 `protobuf:"varint,133,opt,name=container_memory_pressure_some_usec,json=containerMemoryPressureSomeUsec,proto3" json:"container_memory_pressure_some_usec,omitempty"` + ContainerMemoryPressureFullUsec int64 `protobuf:"varint,134,opt,name=container_memory_pressure_full_usec,json=containerMemoryPressureFullUsec,proto3" json:"container_memory_pressure_full_usec,omitempty"` } func (x *ResourceMetrics) Reset() { @@ -1510,6 +1719,104 @@ func (x *ResourceMetrics) GetPodCount() int32 { return 0 } +func (x *ResourceMetrics) GetJvmHeapUsedBytes() int64 { + if x != nil { + return x.JvmHeapUsedBytes + } + return 0 +} + +func (x *ResourceMetrics) GetJvmHeapMaxBytes() int64 { + if x != nil { + return x.JvmHeapMaxBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryRssBytes() int64 { + if x != nil { + return x.ContainerMemoryRssBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemorySwapBytes() int64 { + if x != nil { + return x.ContainerMemorySwapBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryActiveCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryActiveCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryInactiveCacheBytes() int64 { + if x != nil { + return x.ContainerMemoryInactiveCacheBytes + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsPeriods() int64 { + if x != nil { + return x.ContainerCfsPeriods + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsThrottledPeriods() int64 { + if x != nil { + return x.ContainerCfsThrottledPeriods + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCfsThrottledUsec() int64 { + if x != nil { + return x.ContainerCfsThrottledUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryEventsMax() int64 { + if x != nil { + return x.ContainerMemoryEventsMax + } + return 0 +} + +func (x *ResourceMetrics) GetContainerCpuPressureSomeUsec() int64 { + if x != nil { + return x.ContainerCpuPressureSomeUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryPressureSomeUsec() int64 { + if x != nil { + return x.ContainerMemoryPressureSomeUsec + } + return 0 +} + +func (x *ResourceMetrics) GetContainerMemoryPressureFullUsec() int64 { + if x != nil { + return x.ContainerMemoryPressureFullUsec + } + return 0 +} + // MetricPercentiles contains percentile statistics for a single metric. type MetricPercentiles struct { state protoimpl.MessageState @@ -1970,6 +2277,25 @@ type ContainerRequestLimits struct { CurrentMemoryRequest float64 `protobuf:"fixed64,3,opt,name=current_memory_request,json=currentMemoryRequest,proto3" json:"current_memory_request,omitempty"` CurrentCpuLimit float64 `protobuf:"fixed64,4,opt,name=current_cpu_limit,json=currentCpuLimit,proto3" json:"current_cpu_limit,omitempty"` CurrentMemoryLimit float64 `protobuf:"fixed64,5,opt,name=current_memory_limit,json=currentMemoryLimit,proto3" json:"current_memory_limit,omitempty"` + // JVM metadata (empty/zero for non-Java containers). + // Populated from k8s_containers table when JVM is detected via hsperfdata. + JvmJavaVersion string `protobuf:"bytes,10,opt,name=jvm_java_version,json=jvmJavaVersion,proto3" json:"jvm_java_version,omitempty"` + JvmJavaCommand string `protobuf:"bytes,11,opt,name=jvm_java_command,json=jvmJavaCommand,proto3" json:"jvm_java_command,omitempty"` + // Parsed JVM flags (typed fields instead of raw JSON for type-safe frontend access). + JvmXmxBytes int64 `protobuf:"varint,13,opt,name=jvm_xmx_bytes,json=jvmXmxBytes,proto3" json:"jvm_xmx_bytes,omitempty"` // -Xmx max heap size in bytes + JvmXmsBytes int64 `protobuf:"varint,14,opt,name=jvm_xms_bytes,json=jvmXmsBytes,proto3" json:"jvm_xms_bytes,omitempty"` // -Xms initial heap size in bytes + JvmMaxRamPercentage float64 `protobuf:"fixed64,15,opt,name=jvm_max_ram_percentage,json=jvmMaxRamPercentage,proto3" json:"jvm_max_ram_percentage,omitempty"` // -XX:MaxRAMPercentage + JvmUseContainerSupport *bool `protobuf:"varint,16,opt,name=jvm_use_container_support,json=jvmUseContainerSupport,proto3,oneof" json:"jvm_use_container_support,omitempty"` // -XX:+/-UseContainerSupport + // Source the -Xmx flag was extracted from: "cmdline", "JAVA_TOOL_OPTIONS", + // "JDK_JAVA_OPTIONS", or "JAVA_OPTS". Empty when -Xmx is unset. Matters + // because the `java` launcher ignores JAVA_OPTS — an -Xmx set there is + // inert and the JVM falls back to ergonomic (container-limit) heap sizing. + JvmXmxSource string `protobuf:"bytes,17,opt,name=jvm_xmx_source,json=jvmXmxSource,proto3" json:"jvm_xmx_source,omitempty"` + // Generic runtime detections (Node.js, .NET, Go, Rust, GraalVM native-image, + // Python, Ruby, Deno, Bun) from zxporter-nodemon: existence + best-effort + // version per runtime. Empty for containers with no detected runtime. JVM + // stays on the dedicated fields above (richer hsperfdata payload). + RuntimeProcesses []*RuntimeProcess `protobuf:"bytes,18,rep,name=runtime_processes,json=runtimeProcesses,proto3" json:"runtime_processes,omitempty"` } func (x *ContainerRequestLimits) Reset() { @@ -2039,48 +2365,84 @@ func (x *ContainerRequestLimits) GetCurrentMemoryLimit() float64 { return 0 } -// ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. -type ForecastResourceMetrics struct { +func (x *ContainerRequestLimits) GetJvmJavaVersion() string { + if x != nil { + return x.JvmJavaVersion + } + return "" +} + +func (x *ContainerRequestLimits) GetJvmJavaCommand() string { + if x != nil { + return x.JvmJavaCommand + } + return "" +} + +func (x *ContainerRequestLimits) GetJvmXmxBytes() int64 { + if x != nil { + return x.JvmXmxBytes + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmXmsBytes() int64 { + if x != nil { + return x.JvmXmsBytes + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmMaxRamPercentage() float64 { + if x != nil { + return x.JvmMaxRamPercentage + } + return 0 +} + +func (x *ContainerRequestLimits) GetJvmUseContainerSupport() bool { + if x != nil && x.JvmUseContainerSupport != nil { + return *x.JvmUseContainerSupport + } + return false +} + +func (x *ContainerRequestLimits) GetJvmXmxSource() string { + if x != nil { + return x.JvmXmxSource + } + return "" +} + +func (x *ContainerRequestLimits) GetRuntimeProcesses() []*RuntimeProcess { + if x != nil { + return x.RuntimeProcesses + } + return nil +} + +// GPUMigInstance captures per-instance identity and profiling metrics for a +// single MIG partition. GPU utilization/SM fields are intentionally absent — +// DCGM never populates them on MIG rows. +type GPUMigInstance struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Forecast timestamp. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the container. - ApplicationId string `protobuf:"bytes,3,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` // Application id of the container. - ApplicationKind string `protobuf:"bytes,4,opt,name=application_kind,json=applicationKind,proto3" json:"application_kind,omitempty"` // Application kind of the container. - Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"` // Model used for the forecast - NodeCpuCapacity float64 `protobuf:"fixed64,6,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // Total CPU capacity of nodes. - NodeMemoryCapacity float64 `protobuf:"fixed64,7,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Total memory capacity of nodes. - NodeCpuUsage float64 `protobuf:"fixed64,8,opt,name=node_cpu_usage,json=nodeCpuUsage,proto3" json:"node_cpu_usage,omitempty"` // Current CPU usage of nodes. - NodeMemoryUsage float64 `protobuf:"fixed64,9,opt,name=node_memory_usage,json=nodeMemoryUsage,proto3" json:"node_memory_usage,omitempty"` // Current memory usage of nodes. - NodeCpuUtilization float64 `protobuf:"fixed64,10,opt,name=node_cpu_utilization,json=nodeCpuUtilization,proto3" json:"node_cpu_utilization,omitempty"` // CPU utilization percentage of nodes. - NodeMemoryUtilization float64 `protobuf:"fixed64,11,opt,name=node_memory_utilization,json=nodeMemoryUtilization,proto3" json:"node_memory_utilization,omitempty"` // Memory utilization percentage of nodes. - ContainerCpuUsage float64 `protobuf:"fixed64,12,opt,name=container_cpu_usage,json=containerCpuUsage,proto3" json:"container_cpu_usage,omitempty"` // Current CPU usage of containers. - ContainerMemoryUsage float64 `protobuf:"fixed64,13,opt,name=container_memory_usage,json=containerMemoryUsage,proto3" json:"container_memory_usage,omitempty"` // Current memory usage of containers. - ContainerCpuUtilization float64 `protobuf:"fixed64,14,opt,name=container_cpu_utilization,json=containerCpuUtilization,proto3" json:"container_cpu_utilization,omitempty"` // CPU utilization percentage of containers. - ContainerMemoryUtilization float64 `protobuf:"fixed64,15,opt,name=container_memory_utilization,json=containerMemoryUtilization,proto3" json:"container_memory_utilization,omitempty"` // Memory utilization percentage of containers. - ContainerCpuRequested float64 `protobuf:"fixed64,16,opt,name=container_cpu_requested,json=containerCpuRequested,proto3" json:"container_cpu_requested,omitempty"` // CPU requested by containers. - ContainerMemoryRequested float64 `protobuf:"fixed64,17,opt,name=container_memory_requested,json=containerMemoryRequested,proto3" json:"container_memory_requested,omitempty"` // Memory requested by containers. - ContainerCpuLimits float64 `protobuf:"fixed64,18,opt,name=container_cpu_limits,json=containerCpuLimits,proto3" json:"container_cpu_limits,omitempty"` // CPU limits of containers. - ContainerMemoryLimits float64 `protobuf:"fixed64,19,opt,name=container_memory_limits,json=containerMemoryLimits,proto3" json:"container_memory_limits,omitempty"` // Memory limits of containers. - ContainerGpuUsage float64 `protobuf:"fixed64,20,opt,name=container_gpu_usage,json=containerGpuUsage,proto3" json:"container_gpu_usage,omitempty"` // GPU usage of containers. - ContainerGpuRequested float64 `protobuf:"fixed64,21,opt,name=container_gpu_requested,json=containerGpuRequested,proto3" json:"container_gpu_requested,omitempty"` // GPU requests of containers. - ContainerGpuLimits float64 `protobuf:"fixed64,22,opt,name=container_gpu_limits,json=containerGpuLimits,proto3" json:"container_gpu_limits,omitempty"` // GPU limits of containers. - ContainerGpuUtilization float64 `protobuf:"fixed64,23,opt,name=container_gpu_utilization,json=containerGpuUtilization,proto3" json:"container_gpu_utilization,omitempty"` // GPU utilization of containers. - NodeGpuCapacity float64 `protobuf:"fixed64,24,opt,name=node_gpu_capacity,json=nodeGpuCapacity,proto3" json:"node_gpu_capacity,omitempty"` // GPU capcity of nodes. - NodeGpuUsage float64 `protobuf:"fixed64,25,opt,name=node_gpu_usage,json=nodeGpuUsage,proto3" json:"node_gpu_usage,omitempty"` // GPU usage of nodes. - NodeGpuUtilization float64 `protobuf:"fixed64,26,opt,name=node_gpu_utilization,json=nodeGpuUtilization,proto3" json:"node_gpu_utilization,omitempty"` // GPU utilization of nodes. - NodeGpuVramUsage float64 `protobuf:"fixed64,27,opt,name=node_gpu_vram_usage,json=nodeGpuVramUsage,proto3" json:"node_gpu_vram_usage,omitempty"` // GPU VRAM usage of nodes. - ContainerGpuVramUsage float64 `protobuf:"fixed64,28,opt,name=container_gpu_vram_usage,json=containerGpuVramUsage,proto3" json:"container_gpu_vram_usage,omitempty"` // GPU VRAM usage of containers. - NodeGpuVramCapacity float64 `protobuf:"fixed64,29,opt,name=node_gpu_vram_capacity,json=nodeGpuVramCapacity,proto3" json:"node_gpu_vram_capacity,omitempty"` // GPU VRAM capacity of nodes. - NodeGpuVramUtilization float64 `protobuf:"fixed64,30,opt,name=node_gpu_vram_utilization,json=nodeGpuVramUtilization,proto3" json:"node_gpu_vram_utilization,omitempty"` // GPU VRAM utilization of nodes. - NormalizedNodeMemoryCapacity float64 `protobuf:"fixed64,31,opt,name=normalized_node_memory_capacity,json=normalizedNodeMemoryCapacity,proto3" json:"normalized_node_memory_capacity,omitempty"` // Total memory capacity of nodes, normalized to cover for missing bytes. - NormalizedGpuVramCapacity float64 `protobuf:"fixed64,32,opt,name=normalized_gpu_vram_capacity,json=normalizedGpuVramCapacity,proto3" json:"normalized_gpu_vram_capacity,omitempty"` // Normalized GPU VRAM capacity of nodes. + DeviceUuid string `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"` + DeviceId string `protobuf:"bytes,2,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + MigProfile string `protobuf:"bytes,3,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + MigInstanceId string `protobuf:"bytes,4,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + ModelName string `protobuf:"bytes,5,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + TensorActive float64 `protobuf:"fixed64,6,opt,name=tensor_active,json=tensorActive,proto3" json:"tensor_active,omitempty"` + DramActive float64 `protobuf:"fixed64,7,opt,name=dram_active,json=dramActive,proto3" json:"dram_active,omitempty"` + GraphicsEngineActive float64 `protobuf:"fixed64,8,opt,name=graphics_engine_active,json=graphicsEngineActive,proto3" json:"graphics_engine_active,omitempty"` + FramebufferUsed float64 `protobuf:"fixed64,9,opt,name=framebuffer_used,json=framebufferUsed,proto3" json:"framebuffer_used,omitempty"` + FramebufferTotal float64 `protobuf:"fixed64,10,opt,name=framebuffer_total,json=framebufferTotal,proto3" json:"framebuffer_total,omitempty"` } -func (x *ForecastResourceMetrics) Reset() { - *x = ForecastResourceMetrics{} +func (x *GPUMigInstance) Reset() { + *x = GPUMigInstance{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_common_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2088,13 +2450,13 @@ func (x *ForecastResourceMetrics) Reset() { } } -func (x *ForecastResourceMetrics) String() string { +func (x *GPUMigInstance) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ForecastResourceMetrics) ProtoMessage() {} +func (*GPUMigInstance) ProtoMessage() {} -func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { +func (x *GPUMigInstance) ProtoReflect() protoreflect.Message { mi := &file_api_v1_common_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2106,275 +2468,436 @@ func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ForecastResourceMetrics.ProtoReflect.Descriptor instead. -func (*ForecastResourceMetrics) Descriptor() ([]byte, []int) { +// Deprecated: Use GPUMigInstance.ProtoReflect.Descriptor instead. +func (*GPUMigInstance) Descriptor() ([]byte, []int) { return file_api_v1_common_proto_rawDescGZIP(), []int{7} } -func (x *ForecastResourceMetrics) GetTimestamp() *timestamppb.Timestamp { +func (x *GPUMigInstance) GetDeviceUuid() string { if x != nil { - return x.Timestamp + return x.DeviceUuid } - return nil + return "" } -func (x *ForecastResourceMetrics) GetClusterId() string { +func (x *GPUMigInstance) GetDeviceId() string { if x != nil { - return x.ClusterId + return x.DeviceId } return "" } -func (x *ForecastResourceMetrics) GetApplicationId() string { +func (x *GPUMigInstance) GetMigProfile() string { if x != nil { - return x.ApplicationId + return x.MigProfile } return "" } -func (x *ForecastResourceMetrics) GetApplicationKind() string { +func (x *GPUMigInstance) GetMigInstanceId() string { if x != nil { - return x.ApplicationKind + return x.MigInstanceId } return "" } -func (x *ForecastResourceMetrics) GetModel() string { +func (x *GPUMigInstance) GetModelName() string { if x != nil { - return x.Model + return x.ModelName } return "" } -func (x *ForecastResourceMetrics) GetNodeCpuCapacity() float64 { +func (x *GPUMigInstance) GetTensorActive() float64 { if x != nil { - return x.NodeCpuCapacity + return x.TensorActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryCapacity() float64 { +func (x *GPUMigInstance) GetDramActive() float64 { if x != nil { - return x.NodeMemoryCapacity + return x.DramActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeCpuUsage() float64 { +func (x *GPUMigInstance) GetGraphicsEngineActive() float64 { if x != nil { - return x.NodeCpuUsage + return x.GraphicsEngineActive } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryUsage() float64 { +func (x *GPUMigInstance) GetFramebufferUsed() float64 { if x != nil { - return x.NodeMemoryUsage + return x.FramebufferUsed } return 0 } -func (x *ForecastResourceMetrics) GetNodeCpuUtilization() float64 { +func (x *GPUMigInstance) GetFramebufferTotal() float64 { if x != nil { - return x.NodeCpuUtilization + return x.FramebufferTotal } return 0 } -func (x *ForecastResourceMetrics) GetNodeMemoryUtilization() float64 { - if x != nil { - return x.NodeMemoryUtilization +// IndividualGPUMetric captures point-in-time metrics for a single GPU used +// by a container. +type IndividualGPUMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` + ModelName string `protobuf:"bytes,2,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + DeviceIndex string `protobuf:"bytes,3,opt,name=device_index,json=deviceIndex,proto3" json:"device_index,omitempty"` + MigProfile string `protobuf:"bytes,4,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + MigInstanceId string `protobuf:"bytes,5,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + Utilization float64 `protobuf:"fixed64,6,opt,name=utilization,proto3" json:"utilization,omitempty"` + MemoryUsed float64 `protobuf:"fixed64,7,opt,name=memory_used,json=memoryUsed,proto3" json:"memory_used,omitempty"` + MemoryFree float64 `protobuf:"fixed64,8,opt,name=memory_free,json=memoryFree,proto3" json:"memory_free,omitempty"` + TotalMemory float64 `protobuf:"fixed64,9,opt,name=total_memory,json=totalMemory,proto3" json:"total_memory,omitempty"` + MemoryUtilizationPercentage float64 `protobuf:"fixed64,10,opt,name=memory_utilization_percentage,json=memoryUtilizationPercentage,proto3" json:"memory_utilization_percentage,omitempty"` + PowerUsage float64 `protobuf:"fixed64,11,opt,name=power_usage,json=powerUsage,proto3" json:"power_usage,omitempty"` + Temperature float64 `protobuf:"fixed64,12,opt,name=temperature,proto3" json:"temperature,omitempty"` + SmClock float64 `protobuf:"fixed64,13,opt,name=sm_clock,json=smClock,proto3" json:"sm_clock,omitempty"` + MemClock float64 `protobuf:"fixed64,14,opt,name=mem_clock,json=memClock,proto3" json:"mem_clock,omitempty"` +} + +func (x *IndividualGPUMetric) Reset() { + *x = IndividualGPUMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ForecastResourceMetrics) GetContainerCpuUsage() float64 { +func (x *IndividualGPUMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IndividualGPUMetric) ProtoMessage() {} + +func (x *IndividualGPUMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[8] + 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 IndividualGPUMetric.ProtoReflect.Descriptor instead. +func (*IndividualGPUMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{8} +} + +func (x *IndividualGPUMetric) GetUuid() string { if x != nil { - return x.ContainerCpuUsage + return x.Uuid } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryUsage() float64 { +func (x *IndividualGPUMetric) GetModelName() string { if x != nil { - return x.ContainerMemoryUsage + return x.ModelName } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerCpuUtilization() float64 { +func (x *IndividualGPUMetric) GetDeviceIndex() string { if x != nil { - return x.ContainerCpuUtilization + return x.DeviceIndex } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryUtilization() float64 { +func (x *IndividualGPUMetric) GetMigProfile() string { if x != nil { - return x.ContainerMemoryUtilization + return x.MigProfile } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerCpuRequested() float64 { +func (x *IndividualGPUMetric) GetMigInstanceId() string { if x != nil { - return x.ContainerCpuRequested + return x.MigInstanceId } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetContainerMemoryRequested() float64 { +func (x *IndividualGPUMetric) GetUtilization() float64 { if x != nil { - return x.ContainerMemoryRequested + return x.Utilization } return 0 } -func (x *ForecastResourceMetrics) GetContainerCpuLimits() float64 { +func (x *IndividualGPUMetric) GetMemoryUsed() float64 { if x != nil { - return x.ContainerCpuLimits + return x.MemoryUsed } return 0 } -func (x *ForecastResourceMetrics) GetContainerMemoryLimits() float64 { +func (x *IndividualGPUMetric) GetMemoryFree() float64 { if x != nil { - return x.ContainerMemoryLimits + return x.MemoryFree } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuUsage() float64 { +func (x *IndividualGPUMetric) GetTotalMemory() float64 { if x != nil { - return x.ContainerGpuUsage + return x.TotalMemory } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuRequested() float64 { +func (x *IndividualGPUMetric) GetMemoryUtilizationPercentage() float64 { if x != nil { - return x.ContainerGpuRequested + return x.MemoryUtilizationPercentage } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuLimits() float64 { +func (x *IndividualGPUMetric) GetPowerUsage() float64 { if x != nil { - return x.ContainerGpuLimits + return x.PowerUsage } return 0 } -func (x *ForecastResourceMetrics) GetContainerGpuUtilization() float64 { +func (x *IndividualGPUMetric) GetTemperature() float64 { if x != nil { - return x.ContainerGpuUtilization + return x.Temperature } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuCapacity() float64 { +func (x *IndividualGPUMetric) GetSmClock() float64 { if x != nil { - return x.NodeGpuCapacity + return x.SmClock } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuUsage() float64 { +func (x *IndividualGPUMetric) GetMemClock() float64 { if x != nil { - return x.NodeGpuUsage + return x.MemClock } return 0 } -func (x *ForecastResourceMetrics) GetNodeGpuUtilization() float64 { +// ContainerIndividualGPUMetrics is the most recent per-GPU breakdown for a +// single container. +type ContainerIndividualGPUMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Instances []*IndividualGPUMetric `protobuf:"bytes,2,rep,name=instances,proto3" json:"instances,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=collected_at,json=collectedAt,proto3,oneof" json:"collected_at,omitempty"` +} + +func (x *ContainerIndividualGPUMetrics) Reset() { + *x = ContainerIndividualGPUMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerIndividualGPUMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerIndividualGPUMetrics) ProtoMessage() {} + +func (x *ContainerIndividualGPUMetrics) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[9] + 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 ContainerIndividualGPUMetrics.ProtoReflect.Descriptor instead. +func (*ContainerIndividualGPUMetrics) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{9} +} + +func (x *ContainerIndividualGPUMetrics) GetContainerName() string { if x != nil { - return x.NodeGpuUtilization + return x.ContainerName } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNodeGpuVramUsage() float64 { +func (x *ContainerIndividualGPUMetrics) GetInstances() []*IndividualGPUMetric { if x != nil { - return x.NodeGpuVramUsage + return x.Instances } - return 0 + return nil } -func (x *ForecastResourceMetrics) GetContainerGpuVramUsage() float64 { +func (x *ContainerIndividualGPUMetrics) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.ContainerGpuVramUsage + return x.CollectedAt } - return 0 + return nil } -func (x *ForecastResourceMetrics) GetNodeGpuVramCapacity() float64 { +// RuntimeProcess is one detected language runtime in a container. +type RuntimeProcess struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Runtime name: "nodejs" | "dotnet" | "go" | "rust" | + // "graalvm-native-image" | "python" | "ruby" | "deno" | "bun". + Runtime string `protobuf:"bytes,1,opt,name=runtime,proto3" json:"runtime,omitempty"` + // Best-effort version; may be empty (stripped/custom binaries) — the + // detection itself is still meaningful. + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + // How the version was resolved: "env" | "maps" | "buildinfo" | "elf-comment" + // | "binary-scan" | "exe-path" | "comm". + VersionSource string `protobuf:"bytes,3,opt,name=version_source,json=versionSource,proto3" json:"version_source,omitempty"` + // Raw process cmdline (useful for future flag heuristics, e.g. + // --max-old-space-size). + RawCmdline string `protobuf:"bytes,4,opt,name=raw_cmdline,json=rawCmdline,proto3" json:"raw_cmdline,omitempty"` +} + +func (x *RuntimeProcess) Reset() { + *x = RuntimeProcess{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RuntimeProcess) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RuntimeProcess) ProtoMessage() {} + +func (x *RuntimeProcess) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[10] + 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 RuntimeProcess.ProtoReflect.Descriptor instead. +func (*RuntimeProcess) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{10} +} + +func (x *RuntimeProcess) GetRuntime() string { if x != nil { - return x.NodeGpuVramCapacity + return x.Runtime } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNodeGpuVramUtilization() float64 { +func (x *RuntimeProcess) GetVersion() string { if x != nil { - return x.NodeGpuVramUtilization + return x.Version } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNormalizedNodeMemoryCapacity() float64 { +func (x *RuntimeProcess) GetVersionSource() string { if x != nil { - return x.NormalizedNodeMemoryCapacity + return x.VersionSource } - return 0 + return "" } -func (x *ForecastResourceMetrics) GetNormalizedGpuVramCapacity() float64 { +func (x *RuntimeProcess) GetRawCmdline() string { if x != nil { - return x.NormalizedGpuVramCapacity + return x.RawCmdline } - return 0 + return "" } -// ResourceSummary provides aggregated resource counts and pod status counts for a cluster or workload. -type ResourceSummary struct { +// ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. +type ForecastResourceMetrics struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeploymentCount int32 `protobuf:"varint,1,opt,name=deployment_count,json=deploymentCount,proto3" json:"deployment_count,omitempty"` // Number of Deployments. - StatefulSetCount int32 `protobuf:"varint,2,opt,name=stateful_set_count,json=statefulSetCount,proto3" json:"stateful_set_count,omitempty"` // Number of StatefulSets. - DaemonSetCount int32 `protobuf:"varint,3,opt,name=daemon_set_count,json=daemonSetCount,proto3" json:"daemon_set_count,omitempty"` // Number of DaemonSets. - JobCount int32 `protobuf:"varint,4,opt,name=job_count,json=jobCount,proto3" json:"job_count,omitempty"` // Number of Jobs. - CronJobCount int32 `protobuf:"varint,5,opt,name=cron_job_count,json=cronJobCount,proto3" json:"cron_job_count,omitempty"` // Number of CronJobs. - ReplicaSetCount int32 `protobuf:"varint,6,opt,name=replica_set_count,json=replicaSetCount,proto3" json:"replica_set_count,omitempty"` // Number of ReplicaSets. - PodCount int32 `protobuf:"varint,7,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of Pods. - ContainerCount int32 `protobuf:"varint,8,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of Containers. - PendingPods int32 `protobuf:"varint,9,opt,name=pending_pods,json=pendingPods,proto3" json:"pending_pods,omitempty"` // Number of Pods in Pending state. - RunningPods int32 `protobuf:"varint,10,opt,name=running_pods,json=runningPods,proto3" json:"running_pods,omitempty"` // Number of Pods in Running state. - SucceededPods int32 `protobuf:"varint,11,opt,name=succeeded_pods,json=succeededPods,proto3" json:"succeeded_pods,omitempty"` // Number of Pods in Succeeded state. - FailedPods int32 `protobuf:"varint,12,opt,name=failed_pods,json=failedPods,proto3" json:"failed_pods,omitempty"` // Number of Pods in Failed state. - UnknownPods int32 `protobuf:"varint,13,opt,name=unknown_pods,json=unknownPods,proto3" json:"unknown_pods,omitempty"` // Number of Pods in Unknown state. - UnderProvisionedCount int32 `protobuf:"varint,14,opt,name=under_provisioned_count,json=underProvisionedCount,proto3" json:"under_provisioned_count,omitempty"` // Number of resources under-provisioned. - OverProvisionedCount int32 `protobuf:"varint,15,opt,name=over_provisioned_count,json=overProvisionedCount,proto3" json:"over_provisioned_count,omitempty"` // Number of resources over-provisioned. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Forecast timestamp. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the container. + ApplicationId string `protobuf:"bytes,3,opt,name=application_id,json=applicationId,proto3" json:"application_id,omitempty"` // Application id of the container. + ApplicationKind string `protobuf:"bytes,4,opt,name=application_kind,json=applicationKind,proto3" json:"application_kind,omitempty"` // Application kind of the container. + Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"` // Model used for the forecast + NodeCpuCapacity float64 `protobuf:"fixed64,6,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // Total CPU capacity of nodes. + NodeMemoryCapacity float64 `protobuf:"fixed64,7,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Total memory capacity of nodes. + NodeCpuUsage float64 `protobuf:"fixed64,8,opt,name=node_cpu_usage,json=nodeCpuUsage,proto3" json:"node_cpu_usage,omitempty"` // Current CPU usage of nodes. + NodeMemoryUsage float64 `protobuf:"fixed64,9,opt,name=node_memory_usage,json=nodeMemoryUsage,proto3" json:"node_memory_usage,omitempty"` // Current memory usage of nodes. + NodeCpuUtilization float64 `protobuf:"fixed64,10,opt,name=node_cpu_utilization,json=nodeCpuUtilization,proto3" json:"node_cpu_utilization,omitempty"` // CPU utilization percentage of nodes. + NodeMemoryUtilization float64 `protobuf:"fixed64,11,opt,name=node_memory_utilization,json=nodeMemoryUtilization,proto3" json:"node_memory_utilization,omitempty"` // Memory utilization percentage of nodes. + ContainerCpuUsage float64 `protobuf:"fixed64,12,opt,name=container_cpu_usage,json=containerCpuUsage,proto3" json:"container_cpu_usage,omitempty"` // Current CPU usage of containers. + ContainerMemoryUsage float64 `protobuf:"fixed64,13,opt,name=container_memory_usage,json=containerMemoryUsage,proto3" json:"container_memory_usage,omitempty"` // Current memory usage of containers. + ContainerCpuUtilization float64 `protobuf:"fixed64,14,opt,name=container_cpu_utilization,json=containerCpuUtilization,proto3" json:"container_cpu_utilization,omitempty"` // CPU utilization percentage of containers. + ContainerMemoryUtilization float64 `protobuf:"fixed64,15,opt,name=container_memory_utilization,json=containerMemoryUtilization,proto3" json:"container_memory_utilization,omitempty"` // Memory utilization percentage of containers. + ContainerCpuRequested float64 `protobuf:"fixed64,16,opt,name=container_cpu_requested,json=containerCpuRequested,proto3" json:"container_cpu_requested,omitempty"` // CPU requested by containers. + ContainerMemoryRequested float64 `protobuf:"fixed64,17,opt,name=container_memory_requested,json=containerMemoryRequested,proto3" json:"container_memory_requested,omitempty"` // Memory requested by containers. + ContainerCpuLimits float64 `protobuf:"fixed64,18,opt,name=container_cpu_limits,json=containerCpuLimits,proto3" json:"container_cpu_limits,omitempty"` // CPU limits of containers. + ContainerMemoryLimits float64 `protobuf:"fixed64,19,opt,name=container_memory_limits,json=containerMemoryLimits,proto3" json:"container_memory_limits,omitempty"` // Memory limits of containers. + ContainerGpuUsage float64 `protobuf:"fixed64,20,opt,name=container_gpu_usage,json=containerGpuUsage,proto3" json:"container_gpu_usage,omitempty"` // GPU usage of containers. + ContainerGpuRequested float64 `protobuf:"fixed64,21,opt,name=container_gpu_requested,json=containerGpuRequested,proto3" json:"container_gpu_requested,omitempty"` // GPU requests of containers. + ContainerGpuLimits float64 `protobuf:"fixed64,22,opt,name=container_gpu_limits,json=containerGpuLimits,proto3" json:"container_gpu_limits,omitempty"` // GPU limits of containers. + ContainerGpuUtilization float64 `protobuf:"fixed64,23,opt,name=container_gpu_utilization,json=containerGpuUtilization,proto3" json:"container_gpu_utilization,omitempty"` // GPU utilization of containers. + NodeGpuCapacity float64 `protobuf:"fixed64,24,opt,name=node_gpu_capacity,json=nodeGpuCapacity,proto3" json:"node_gpu_capacity,omitempty"` // GPU capcity of nodes. + NodeGpuUsage float64 `protobuf:"fixed64,25,opt,name=node_gpu_usage,json=nodeGpuUsage,proto3" json:"node_gpu_usage,omitempty"` // GPU usage of nodes. + NodeGpuUtilization float64 `protobuf:"fixed64,26,opt,name=node_gpu_utilization,json=nodeGpuUtilization,proto3" json:"node_gpu_utilization,omitempty"` // GPU utilization of nodes. + NodeGpuVramUsage float64 `protobuf:"fixed64,27,opt,name=node_gpu_vram_usage,json=nodeGpuVramUsage,proto3" json:"node_gpu_vram_usage,omitempty"` // GPU VRAM usage of nodes. + ContainerGpuVramUsage float64 `protobuf:"fixed64,28,opt,name=container_gpu_vram_usage,json=containerGpuVramUsage,proto3" json:"container_gpu_vram_usage,omitempty"` // GPU VRAM usage of containers. + NodeGpuVramCapacity float64 `protobuf:"fixed64,29,opt,name=node_gpu_vram_capacity,json=nodeGpuVramCapacity,proto3" json:"node_gpu_vram_capacity,omitempty"` // GPU VRAM capacity of nodes. + NodeGpuVramUtilization float64 `protobuf:"fixed64,30,opt,name=node_gpu_vram_utilization,json=nodeGpuVramUtilization,proto3" json:"node_gpu_vram_utilization,omitempty"` // GPU VRAM utilization of nodes. + NormalizedNodeMemoryCapacity float64 `protobuf:"fixed64,31,opt,name=normalized_node_memory_capacity,json=normalizedNodeMemoryCapacity,proto3" json:"normalized_node_memory_capacity,omitempty"` // Total memory capacity of nodes, normalized to cover for missing bytes. + NormalizedGpuVramCapacity float64 `protobuf:"fixed64,32,opt,name=normalized_gpu_vram_capacity,json=normalizedGpuVramCapacity,proto3" json:"normalized_gpu_vram_capacity,omitempty"` // Normalized GPU VRAM capacity of nodes. } -func (x *ResourceSummary) Reset() { - *x = ResourceSummary{} +func (x *ForecastResourceMetrics) Reset() { + *x = ForecastResourceMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[8] + mi := &file_api_v1_common_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceSummary) String() string { +func (x *ForecastResourceMetrics) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceSummary) ProtoMessage() {} +func (*ForecastResourceMetrics) ProtoMessage() {} -func (x *ResourceSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[8] +func (x *ForecastResourceMetrics) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2385,400 +2908,423 @@ func (x *ResourceSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceSummary.ProtoReflect.Descriptor instead. -func (*ResourceSummary) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{8} +// Deprecated: Use ForecastResourceMetrics.ProtoReflect.Descriptor instead. +func (*ForecastResourceMetrics) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{11} } -func (x *ResourceSummary) GetDeploymentCount() int32 { +func (x *ForecastResourceMetrics) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.DeploymentCount + return x.Timestamp } - return 0 + return nil } -func (x *ResourceSummary) GetStatefulSetCount() int32 { +func (x *ForecastResourceMetrics) GetClusterId() string { if x != nil { - return x.StatefulSetCount + return x.ClusterId } - return 0 + return "" } -func (x *ResourceSummary) GetDaemonSetCount() int32 { +func (x *ForecastResourceMetrics) GetApplicationId() string { if x != nil { - return x.DaemonSetCount + return x.ApplicationId } - return 0 + return "" } -func (x *ResourceSummary) GetJobCount() int32 { +func (x *ForecastResourceMetrics) GetApplicationKind() string { if x != nil { - return x.JobCount + return x.ApplicationKind } - return 0 + return "" } -func (x *ResourceSummary) GetCronJobCount() int32 { +func (x *ForecastResourceMetrics) GetModel() string { if x != nil { - return x.CronJobCount + return x.Model + } + return "" +} + +func (x *ForecastResourceMetrics) GetNodeCpuCapacity() float64 { + if x != nil { + return x.NodeCpuCapacity } return 0 } -func (x *ResourceSummary) GetReplicaSetCount() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryCapacity() float64 { if x != nil { - return x.ReplicaSetCount + return x.NodeMemoryCapacity } return 0 } -func (x *ResourceSummary) GetPodCount() int32 { +func (x *ForecastResourceMetrics) GetNodeCpuUsage() float64 { if x != nil { - return x.PodCount + return x.NodeCpuUsage } return 0 } -func (x *ResourceSummary) GetContainerCount() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryUsage() float64 { if x != nil { - return x.ContainerCount + return x.NodeMemoryUsage } return 0 } -func (x *ResourceSummary) GetPendingPods() int32 { +func (x *ForecastResourceMetrics) GetNodeCpuUtilization() float64 { if x != nil { - return x.PendingPods + return x.NodeCpuUtilization } return 0 } -func (x *ResourceSummary) GetRunningPods() int32 { +func (x *ForecastResourceMetrics) GetNodeMemoryUtilization() float64 { if x != nil { - return x.RunningPods + return x.NodeMemoryUtilization } return 0 } -func (x *ResourceSummary) GetSucceededPods() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuUsage() float64 { if x != nil { - return x.SucceededPods + return x.ContainerCpuUsage } return 0 } -func (x *ResourceSummary) GetFailedPods() int32 { +func (x *ForecastResourceMetrics) GetContainerMemoryUsage() float64 { if x != nil { - return x.FailedPods + return x.ContainerMemoryUsage } return 0 } -func (x *ResourceSummary) GetUnknownPods() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuUtilization() float64 { if x != nil { - return x.UnknownPods + return x.ContainerCpuUtilization } return 0 } -func (x *ResourceSummary) GetUnderProvisionedCount() int32 { +func (x *ForecastResourceMetrics) GetContainerMemoryUtilization() float64 { if x != nil { - return x.UnderProvisionedCount + return x.ContainerMemoryUtilization } return 0 } -func (x *ResourceSummary) GetOverProvisionedCount() int32 { +func (x *ForecastResourceMetrics) GetContainerCpuRequested() float64 { if x != nil { - return x.OverProvisionedCount + return x.ContainerCpuRequested } return 0 } -// WorkloadItem represents a Kubernetes resource and its hierarchical children. -type WorkloadItem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the resource (e.g., Pod, Container, Deployment). - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the resource. - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the resource. - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Namespace of the resource. - OwnerKind string `protobuf:"bytes,5,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. - OwnerUid string `protobuf:"bytes,6,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. - Children []*WorkloadItem `protobuf:"bytes,7,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. - Labels map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. - Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. - CreationTimestamp int64 `protobuf:"varint,10,opt,name=creation_timestamp,json=creationTimestamp,proto3" json:"creation_timestamp,omitempty"` // Creation time as a Unix timestamp. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,11,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the workload item. - CostInfo *CostInfo `protobuf:"bytes,12,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the workload item. - CostDataPoints []*CostDataPoint `protobuf:"bytes,13,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,14,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. - ImpactScore float64 `protobuf:"fixed64,15,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` // Optimization impact score for workload - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // Creation time of the workload item. - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` // Last update time of the workload item. - ClusterId string `protobuf:"bytes,18,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the workload - Id string `protobuf:"bytes,19,opt,name=id,proto3" json:"id,omitempty"` // DevZero unique identifier - // Resource-specific details for different K8s resource types - IsKarpenterResource bool `protobuf:"varint,20,opt,name=is_karpenter_resource,json=isKarpenterResource,proto3" json:"is_karpenter_resource,omitempty"` - ResourceDetails *ResourceDetails `protobuf:"bytes,30,opt,name=resource_details,json=resourceDetails,proto3,oneof" json:"resource_details,omitempty"` - PolicyIds []string `protobuf:"bytes,56,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this workload - ReplicasFromStatus int32 `protobuf:"varint,76,opt,name=replicas_from_status,json=replicasFromStatus,proto3" json:"replicas_from_status,omitempty"` - ReplicasFromSpec int32 `protobuf:"varint,77,opt,name=replicas_from_spec,json=replicasFromSpec,proto3" json:"replicas_from_spec,omitempty"` - ReplicasFromMetrics int32 `protobuf:"varint,78,opt,name=replicas_from_metrics,json=replicasFromMetrics,proto3" json:"replicas_from_metrics,omitempty"` - RootOwnerKind string `protobuf:"bytes,91,opt,name=root_owner_kind,json=rootOwnerKind,proto3" json:"root_owner_kind,omitempty"` // Kind of the root owning resource, if any. - RootOwnerUid string `protobuf:"bytes,92,opt,name=root_owner_uid,json=rootOwnerUid,proto3" json:"root_owner_uid,omitempty"` // UID of the root owning resource, if any. -} - -func (x *WorkloadItem) Reset() { - *x = WorkloadItem{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ForecastResourceMetrics) GetContainerMemoryRequested() float64 { + if x != nil { + return x.ContainerMemoryRequested } + return 0 } -func (x *WorkloadItem) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ForecastResourceMetrics) GetContainerCpuLimits() float64 { + if x != nil { + return x.ContainerCpuLimits + } + return 0 } -func (*WorkloadItem) ProtoMessage() {} - -func (x *WorkloadItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ForecastResourceMetrics) GetContainerMemoryLimits() float64 { + if x != nil { + return x.ContainerMemoryLimits } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use WorkloadItem.ProtoReflect.Descriptor instead. -func (*WorkloadItem) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{9} +func (x *ForecastResourceMetrics) GetContainerGpuUsage() float64 { + if x != nil { + return x.ContainerGpuUsage + } + return 0 } -func (x *WorkloadItem) GetKind() string { +func (x *ForecastResourceMetrics) GetContainerGpuRequested() float64 { if x != nil { - return x.Kind + return x.ContainerGpuRequested } - return "" + return 0 } -func (x *WorkloadItem) GetName() string { +func (x *ForecastResourceMetrics) GetContainerGpuLimits() float64 { if x != nil { - return x.Name + return x.ContainerGpuLimits } - return "" + return 0 } -func (x *WorkloadItem) GetUid() string { +func (x *ForecastResourceMetrics) GetContainerGpuUtilization() float64 { if x != nil { - return x.Uid + return x.ContainerGpuUtilization } - return "" + return 0 } -func (x *WorkloadItem) GetNamespace() string { +func (x *ForecastResourceMetrics) GetNodeGpuCapacity() float64 { if x != nil { - return x.Namespace + return x.NodeGpuCapacity } - return "" + return 0 } -func (x *WorkloadItem) GetOwnerKind() string { +func (x *ForecastResourceMetrics) GetNodeGpuUsage() float64 { if x != nil { - return x.OwnerKind + return x.NodeGpuUsage } - return "" + return 0 } -func (x *WorkloadItem) GetOwnerUid() string { +func (x *ForecastResourceMetrics) GetNodeGpuUtilization() float64 { if x != nil { - return x.OwnerUid + return x.NodeGpuUtilization } - return "" + return 0 } -func (x *WorkloadItem) GetChildren() []*WorkloadItem { +func (x *ForecastResourceMetrics) GetNodeGpuVramUsage() float64 { if x != nil { - return x.Children + return x.NodeGpuVramUsage } - return nil + return 0 } -func (x *WorkloadItem) GetLabels() map[string]string { +func (x *ForecastResourceMetrics) GetContainerGpuVramUsage() float64 { if x != nil { - return x.Labels + return x.ContainerGpuVramUsage } - return nil + return 0 } -func (x *WorkloadItem) GetAnnotations() map[string]string { +func (x *ForecastResourceMetrics) GetNodeGpuVramCapacity() float64 { if x != nil { - return x.Annotations + return x.NodeGpuVramCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCreationTimestamp() int64 { +func (x *ForecastResourceMetrics) GetNodeGpuVramUtilization() float64 { if x != nil { - return x.CreationTimestamp + return x.NodeGpuVramUtilization } return 0 } -func (x *WorkloadItem) GetResourceMetrics() *ResourceMetrics { +func (x *ForecastResourceMetrics) GetNormalizedNodeMemoryCapacity() float64 { if x != nil { - return x.ResourceMetrics + return x.NormalizedNodeMemoryCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCostInfo() *CostInfo { +func (x *ForecastResourceMetrics) GetNormalizedGpuVramCapacity() float64 { if x != nil { - return x.CostInfo + return x.NormalizedGpuVramCapacity } - return nil + return 0 } -func (x *WorkloadItem) GetCostDataPoints() []*CostDataPoint { - if x != nil { - return x.CostDataPoints +// ResourceSummary provides aggregated resource counts and pod status counts for a cluster or workload. +type ResourceSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeploymentCount int32 `protobuf:"varint,1,opt,name=deployment_count,json=deploymentCount,proto3" json:"deployment_count,omitempty"` // Number of Deployments. + StatefulSetCount int32 `protobuf:"varint,2,opt,name=stateful_set_count,json=statefulSetCount,proto3" json:"stateful_set_count,omitempty"` // Number of StatefulSets. + DaemonSetCount int32 `protobuf:"varint,3,opt,name=daemon_set_count,json=daemonSetCount,proto3" json:"daemon_set_count,omitempty"` // Number of DaemonSets. + JobCount int32 `protobuf:"varint,4,opt,name=job_count,json=jobCount,proto3" json:"job_count,omitempty"` // Number of Jobs. + CronJobCount int32 `protobuf:"varint,5,opt,name=cron_job_count,json=cronJobCount,proto3" json:"cron_job_count,omitempty"` // Number of CronJobs. + ReplicaSetCount int32 `protobuf:"varint,6,opt,name=replica_set_count,json=replicaSetCount,proto3" json:"replica_set_count,omitempty"` // Number of ReplicaSets. + PodCount int32 `protobuf:"varint,7,opt,name=pod_count,json=podCount,proto3" json:"pod_count,omitempty"` // Number of Pods. + ContainerCount int32 `protobuf:"varint,8,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of Containers. + PendingPods int32 `protobuf:"varint,9,opt,name=pending_pods,json=pendingPods,proto3" json:"pending_pods,omitempty"` // Number of Pods in Pending state. + RunningPods int32 `protobuf:"varint,10,opt,name=running_pods,json=runningPods,proto3" json:"running_pods,omitempty"` // Number of Pods in Running state. + SucceededPods int32 `protobuf:"varint,11,opt,name=succeeded_pods,json=succeededPods,proto3" json:"succeeded_pods,omitempty"` // Number of Pods in Succeeded state. + FailedPods int32 `protobuf:"varint,12,opt,name=failed_pods,json=failedPods,proto3" json:"failed_pods,omitempty"` // Number of Pods in Failed state. + UnknownPods int32 `protobuf:"varint,13,opt,name=unknown_pods,json=unknownPods,proto3" json:"unknown_pods,omitempty"` // Number of Pods in Unknown state. + UnderProvisionedCount int32 `protobuf:"varint,14,opt,name=under_provisioned_count,json=underProvisionedCount,proto3" json:"under_provisioned_count,omitempty"` // Number of resources under-provisioned. + OverProvisionedCount int32 `protobuf:"varint,15,opt,name=over_provisioned_count,json=overProvisionedCount,proto3" json:"over_provisioned_count,omitempty"` // Number of resources over-provisioned. +} + +func (x *ResourceSummary) Reset() { + *x = ResourceSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *WorkloadItem) GetResourceDataPoints() []*ResourceDataPoint { - if x != nil { - return x.ResourceDataPoints +func (x *ResourceSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceSummary) ProtoMessage() {} + +func (x *ResourceSummary) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *WorkloadItem) GetImpactScore() float64 { +// Deprecated: Use ResourceSummary.ProtoReflect.Descriptor instead. +func (*ResourceSummary) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{12} +} + +func (x *ResourceSummary) GetDeploymentCount() int32 { if x != nil { - return x.ImpactScore + return x.DeploymentCount } return 0 } -func (x *WorkloadItem) GetCreatedAt() *timestamppb.Timestamp { +func (x *ResourceSummary) GetStatefulSetCount() int32 { if x != nil { - return x.CreatedAt + return x.StatefulSetCount } - return nil + return 0 } -func (x *WorkloadItem) GetDeletedAt() *timestamppb.Timestamp { +func (x *ResourceSummary) GetDaemonSetCount() int32 { if x != nil { - return x.DeletedAt + return x.DaemonSetCount } - return nil + return 0 } -func (x *WorkloadItem) GetClusterId() string { +func (x *ResourceSummary) GetJobCount() int32 { if x != nil { - return x.ClusterId + return x.JobCount } - return "" + return 0 } -func (x *WorkloadItem) GetId() string { +func (x *ResourceSummary) GetCronJobCount() int32 { if x != nil { - return x.Id + return x.CronJobCount } - return "" + return 0 } -func (x *WorkloadItem) GetIsKarpenterResource() bool { +func (x *ResourceSummary) GetReplicaSetCount() int32 { if x != nil { - return x.IsKarpenterResource + return x.ReplicaSetCount } - return false + return 0 } -func (x *WorkloadItem) GetResourceDetails() *ResourceDetails { +func (x *ResourceSummary) GetPodCount() int32 { if x != nil { - return x.ResourceDetails + return x.PodCount } - return nil + return 0 } -func (x *WorkloadItem) GetPolicyIds() []string { +func (x *ResourceSummary) GetContainerCount() int32 { if x != nil { - return x.PolicyIds + return x.ContainerCount } - return nil + return 0 } -func (x *WorkloadItem) GetReplicasFromStatus() int32 { +func (x *ResourceSummary) GetPendingPods() int32 { if x != nil { - return x.ReplicasFromStatus + return x.PendingPods } return 0 } -func (x *WorkloadItem) GetReplicasFromSpec() int32 { +func (x *ResourceSummary) GetRunningPods() int32 { if x != nil { - return x.ReplicasFromSpec + return x.RunningPods } return 0 } -func (x *WorkloadItem) GetReplicasFromMetrics() int32 { +func (x *ResourceSummary) GetSucceededPods() int32 { if x != nil { - return x.ReplicasFromMetrics + return x.SucceededPods } return 0 } -func (x *WorkloadItem) GetRootOwnerKind() string { +func (x *ResourceSummary) GetFailedPods() int32 { if x != nil { - return x.RootOwnerKind + return x.FailedPods } - return "" + return 0 } -func (x *WorkloadItem) GetRootOwnerUid() string { +func (x *ResourceSummary) GetUnknownPods() int32 { if x != nil { - return x.RootOwnerUid + return x.UnknownPods } - return "" + return 0 } -// ContainerRuntimeInfo containes information about container runtime info -type ContainerRuntimeInfo struct { +func (x *ResourceSummary) GetUnderProvisionedCount() int32 { + if x != nil { + return x.UnderProvisionedCount + } + return 0 +} + +func (x *ResourceSummary) GetOverProvisionedCount() int32 { + if x != nil { + return x.OverProvisionedCount + } + return 0 +} + +// WorkloadItem represents a Kubernetes resource and its hierarchical children. +// LegacyPolicyRef identifies a legacy WorkloadPolicy whose target matches a workload. +type LegacyPolicyRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuntimeName string `protobuf:"bytes,1,opt,name=runtime_name,json=runtimeName,proto3" json:"runtime_name,omitempty"` - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` } -func (x *ContainerRuntimeInfo) Reset() { - *x = ContainerRuntimeInfo{} +func (x *LegacyPolicyRef) Reset() { + *x = LegacyPolicyRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[10] + mi := &file_api_v1_common_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerRuntimeInfo) String() string { +func (x *LegacyPolicyRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerRuntimeInfo) ProtoMessage() {} +func (*LegacyPolicyRef) ProtoMessage() {} -func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[10] +func (x *LegacyPolicyRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2789,56 +3335,61 @@ func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerRuntimeInfo.ProtoReflect.Descriptor instead. -func (*ContainerRuntimeInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{10} +// Deprecated: Use LegacyPolicyRef.ProtoReflect.Descriptor instead. +func (*LegacyPolicyRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{13} } -func (x *ContainerRuntimeInfo) GetRuntimeName() string { +func (x *LegacyPolicyRef) GetPolicyId() string { if x != nil { - return x.RuntimeName + return x.PolicyId } return "" } -func (x *ContainerRuntimeInfo) GetVersion() string { +func (x *LegacyPolicyRef) GetPolicyName() string { if x != nil { - return x.Version + return x.PolicyName } return "" } -// NodeInfo contains information about nodes in a cluster. -type NodeInfo struct { +// OptimizationStatus reports whether a workload is optimized under either the +// legacy (WorkloadPolicy/WorkloadPolicyTarget) or MPA v2 (WorkloadRule) system. +// Only populated on WorkloadItem when at least one of +// GetWorkloadsRequest.include_legacy_optimization_status or +// GetWorkloadsRequest.include_v2_optimization_status is true. +type OptimizationStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` // Total number of nodes. - OnDemandCount int32 `protobuf:"varint,2,opt,name=on_demand_count,json=onDemandCount,proto3" json:"on_demand_count,omitempty"` // Number of on-demand nodes. - ReservedCount int32 `protobuf:"varint,3,opt,name=reserved_count,json=reservedCount,proto3" json:"reserved_count,omitempty"` // Number of reserved nodes. - SpotCount int32 `protobuf:"varint,4,opt,name=spot_count,json=spotCount,proto3" json:"spot_count,omitempty"` // Number of spot nodes. - UnknownCount int32 `protobuf:"varint,5,opt,name=unknown_count,json=unknownCount,proto3" json:"unknown_count,omitempty"` // Number of nodes with unknown type. - PriceSourceCounts map[string]int32 `protobuf:"bytes,6,rep,name=price_source_counts,json=priceSourceCounts,proto3" json:"price_source_counts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Node count by price_source (e.g. {"ri_exact": 2, "sp_api_rate": 1, "on_demand": 5}). + IsOptimized bool `protobuf:"varint,1,opt,name=is_optimized,json=isOptimized,proto3" json:"is_optimized,omitempty"` // is_optimized_legacy || is_optimized_v2 + IsOptimizedLegacy bool `protobuf:"varint,2,opt,name=is_optimized_legacy,json=isOptimizedLegacy,proto3" json:"is_optimized_legacy,omitempty"` + IsOptimizedV2 bool `protobuf:"varint,3,opt,name=is_optimized_v2,json=isOptimizedV2,proto3" json:"is_optimized_v2,omitempty"` + LegacyPolicies []*LegacyPolicyRef `protobuf:"bytes,4,rep,name=legacy_policies,json=legacyPolicies,proto3" json:"legacy_policies,omitempty"` // legacy policies whose targets match this workload + WorkloadRuleId string `protobuf:"bytes,5,opt,name=workload_rule_id,json=workloadRuleId,proto3" json:"workload_rule_id,omitempty"` // v2: empty if no active WorkloadRule + WorkloadRulePolicyName string `protobuf:"bytes,6,opt,name=workload_rule_policy_name,json=workloadRulePolicyName,proto3" json:"workload_rule_policy_name,omitempty"` // v2: display name of the policy behind the active rule, empty if unresolved + Disabled bool `protobuf:"varint,7,opt,name=disabled,proto3" json:"disabled,omitempty"` // v2: whether the active WorkloadRule (workload_rule_id) is currently disabled. Always false when workload_rule_id is empty. } -func (x *NodeInfo) Reset() { - *x = NodeInfo{} +func (x *OptimizationStatus) Reset() { + *x = OptimizationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[11] + mi := &file_api_v1_common_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeInfo) String() string { +func (x *OptimizationStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeInfo) ProtoMessage() {} +func (*OptimizationStatus) ProtoMessage() {} -func (x *NodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[11] +func (x *OptimizationStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2849,82 +3400,113 @@ func (x *NodeInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeInfo.ProtoReflect.Descriptor instead. -func (*NodeInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{11} +// Deprecated: Use OptimizationStatus.ProtoReflect.Descriptor instead. +func (*OptimizationStatus) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{14} } -func (x *NodeInfo) GetNodeCount() int32 { +func (x *OptimizationStatus) GetIsOptimized() bool { if x != nil { - return x.NodeCount + return x.IsOptimized } - return 0 + return false } -func (x *NodeInfo) GetOnDemandCount() int32 { +func (x *OptimizationStatus) GetIsOptimizedLegacy() bool { if x != nil { - return x.OnDemandCount + return x.IsOptimizedLegacy } - return 0 + return false } -func (x *NodeInfo) GetReservedCount() int32 { +func (x *OptimizationStatus) GetIsOptimizedV2() bool { if x != nil { - return x.ReservedCount + return x.IsOptimizedV2 } - return 0 + return false } -func (x *NodeInfo) GetSpotCount() int32 { +func (x *OptimizationStatus) GetLegacyPolicies() []*LegacyPolicyRef { if x != nil { - return x.SpotCount + return x.LegacyPolicies } - return 0 + return nil } -func (x *NodeInfo) GetUnknownCount() int32 { +func (x *OptimizationStatus) GetWorkloadRuleId() string { if x != nil { - return x.UnknownCount + return x.WorkloadRuleId } - return 0 + return "" } -func (x *NodeInfo) GetPriceSourceCounts() map[string]int32 { +func (x *OptimizationStatus) GetWorkloadRulePolicyName() string { if x != nil { - return x.PriceSourceCounts + return x.WorkloadRulePolicyName } - return nil + return "" } -// ResourceInfo provides counts of resources and their scheduling states. -type ResourceInfo struct { +func (x *OptimizationStatus) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type WorkloadItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourcesCount int32 `protobuf:"varint,1,opt,name=resources_count,json=resourcesCount,proto3" json:"resources_count,omitempty"` // Total number of resources. - ScheduledResourceCount int32 `protobuf:"varint,2,opt,name=scheduled_resource_count,json=scheduledResourceCount,proto3" json:"scheduled_resource_count,omitempty"` // Number of scheduled resources. - UnscheduledResourceCount int32 `protobuf:"varint,3,opt,name=unscheduled_resource_count,json=unscheduledResourceCount,proto3" json:"unscheduled_resource_count,omitempty"` // Number of unscheduled resources. - UnknownResourceCount int32 `protobuf:"varint,4,opt,name=unknown_resource_count,json=unknownResourceCount,proto3" json:"unknown_resource_count,omitempty"` // Number of resources in unknown state. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the resource (e.g., Pod, Container, Deployment). + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the resource. + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the resource. + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Namespace of the resource. + OwnerKind string `protobuf:"bytes,5,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. + OwnerUid string `protobuf:"bytes,6,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. + Children []*WorkloadItem `protobuf:"bytes,7,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. + Labels map[string]string `protobuf:"bytes,8,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. + Annotations map[string]string `protobuf:"bytes,9,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. + CreationTimestamp int64 `protobuf:"varint,10,opt,name=creation_timestamp,json=creationTimestamp,proto3" json:"creation_timestamp,omitempty"` // Creation time as a Unix timestamp. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,11,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the workload item. + CostInfo *CostInfo `protobuf:"bytes,12,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the workload item. + CostDataPoints []*CostDataPoint `protobuf:"bytes,13,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,14,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. + ImpactScore float64 `protobuf:"fixed64,15,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` // Optimization impact score for workload + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // Creation time of the workload item. + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` // Last update time of the workload item. + ClusterId string `protobuf:"bytes,18,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster id of the workload + Id string `protobuf:"bytes,19,opt,name=id,proto3" json:"id,omitempty"` // DevZero unique identifier + // Resource-specific details for different K8s resource types + IsKarpenterResource bool `protobuf:"varint,20,opt,name=is_karpenter_resource,json=isKarpenterResource,proto3" json:"is_karpenter_resource,omitempty"` + ResourceDetails *ResourceDetails `protobuf:"bytes,30,opt,name=resource_details,json=resourceDetails,proto3,oneof" json:"resource_details,omitempty"` + PolicyIds []string `protobuf:"bytes,56,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this workload + ReplicasFromStatus int32 `protobuf:"varint,76,opt,name=replicas_from_status,json=replicasFromStatus,proto3" json:"replicas_from_status,omitempty"` + ReplicasFromSpec int32 `protobuf:"varint,77,opt,name=replicas_from_spec,json=replicasFromSpec,proto3" json:"replicas_from_spec,omitempty"` + ReplicasFromMetrics int32 `protobuf:"varint,78,opt,name=replicas_from_metrics,json=replicasFromMetrics,proto3" json:"replicas_from_metrics,omitempty"` + RootOwnerKind string `protobuf:"bytes,91,opt,name=root_owner_kind,json=rootOwnerKind,proto3" json:"root_owner_kind,omitempty"` // Kind of the root owning resource, if any. + RootOwnerUid string `protobuf:"bytes,92,opt,name=root_owner_uid,json=rootOwnerUid,proto3" json:"root_owner_uid,omitempty"` // UID of the root owning resource, if any. + OptimizationStatus *OptimizationStatus `protobuf:"bytes,93,opt,name=optimization_status,json=optimizationStatus,proto3,oneof" json:"optimization_status,omitempty"` // Populated only when GetWorkloadsRequest.include_legacy_optimization_status and/or GetWorkloadsRequest.include_v2_optimization_status is true } -func (x *ResourceInfo) Reset() { - *x = ResourceInfo{} +func (x *WorkloadItem) Reset() { + *x = WorkloadItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[12] + mi := &file_api_v1_common_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceInfo) String() string { +func (x *WorkloadItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceInfo) ProtoMessage() {} +func (*WorkloadItem) ProtoMessage() {} -func (x *ResourceInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[12] +func (x *WorkloadItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2935,491 +3517,380 @@ func (x *ResourceInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceInfo.ProtoReflect.Descriptor instead. -func (*ResourceInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{12} +// Deprecated: Use WorkloadItem.ProtoReflect.Descriptor instead. +func (*WorkloadItem) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{15} } -func (x *ResourceInfo) GetResourcesCount() int32 { +func (x *WorkloadItem) GetKind() string { if x != nil { - return x.ResourcesCount + return x.Kind } - return 0 + return "" } -func (x *ResourceInfo) GetScheduledResourceCount() int32 { +func (x *WorkloadItem) GetName() string { if x != nil { - return x.ScheduledResourceCount + return x.Name } - return 0 + return "" } -func (x *ResourceInfo) GetUnscheduledResourceCount() int32 { +func (x *WorkloadItem) GetUid() string { if x != nil { - return x.UnscheduledResourceCount + return x.Uid } - return 0 + return "" } -func (x *ResourceInfo) GetUnknownResourceCount() int32 { +func (x *WorkloadItem) GetNamespace() string { if x != nil { - return x.UnknownResourceCount + return x.Namespace } - return 0 + return "" } -// Node represents a Kubernetes node with metadata, metrics, and cost information. -type Node struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the node. - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the node. - InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` // Instance type of the node. - Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` // Type/category of the node. - Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` // Region where the node is deployed. - Zone string `protobuf:"bytes,6,opt,name=zone,proto3" json:"zone,omitempty"` // Zone where the node is deployed. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,7,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource utilization metrics for the node. - CostInfo *CostInfo `protobuf:"bytes,8,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the node. - NodeCreatedAt int64 `protobuf:"varint,9,opt,name=node_created_at,json=nodeCreatedAt,proto3" json:"node_created_at,omitempty"` // Node creation time as a Unix timestamp. - IsReady bool `protobuf:"varint,10,opt,name=is_ready,json=isReady,proto3" json:"is_ready,omitempty"` // Indicates whether the node is ready. - ContainerRuntime *ContainerRuntimeInfo `protobuf:"bytes,20,opt,name=container_runtime,json=containerRuntime,proto3,oneof" json:"container_runtime,omitempty"` - NodeGroupName string `protobuf:"bytes,30,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` // it is what the variable says it is - ResourceDetails *ResourceDetails `protobuf:"bytes,40,opt,name=resource_details,json=resourceDetails,proto3" json:"resource_details,omitempty"` // if withDetails is true - // metadata if withMetadata is true - OwnerKind string `protobuf:"bytes,41,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. - OwnerUid string `protobuf:"bytes,42,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. - Children []*WorkloadItem `protobuf:"bytes,43,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. - Labels map[string]string `protobuf:"bytes,44,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. - Annotations map[string]string `protobuf:"bytes,45,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. - // Pricing information (legacy float fields - deprecated) - // - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerHour float64 `protobuf:"fixed64,50,opt,name=price_per_hour,json=pricePerHour,proto3" json:"price_per_hour,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerVcpu float64 `protobuf:"fixed64,51,opt,name=price_per_vcpu,json=pricePerVcpu,proto3" json:"price_per_vcpu,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerGib float64 `protobuf:"fixed64,52,opt,name=price_per_gib,json=pricePerGib,proto3" json:"price_per_gib,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - PricePerGpu float64 `protobuf:"fixed64,53,opt,name=price_per_gpu,json=pricePerGpu,proto3" json:"price_per_gpu,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - CpuPrice float64 `protobuf:"fixed64,54,opt,name=cpu_price,json=cpuPrice,proto3" json:"cpu_price,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - MemoryPrice float64 `protobuf:"fixed64,55,opt,name=memory_price,json=memoryPrice,proto3" json:"memory_price,omitempty"` - // Deprecated: Marked as deprecated in api/v1/common.proto. - GpuPrice float64 `protobuf:"fixed64,56,opt,name=gpu_price,json=gpuPrice,proto3" json:"gpu_price,omitempty"` - // Pricing information (using Money type for currency flexibility) - MoneyPricePerHour *money.Money `protobuf:"bytes,57,opt,name=money_price_per_hour,json=moneyPricePerHour,proto3" json:"money_price_per_hour,omitempty"` - MoneyEffPeriodTotalCost *money.Money `protobuf:"bytes,58,opt,name=money_eff_period_total_cost,json=moneyEffPeriodTotalCost,proto3" json:"money_eff_period_total_cost,omitempty"` - MoneyPricePerVcpu *money.Money `protobuf:"bytes,59,opt,name=money_price_per_vcpu,json=moneyPricePerVcpu,proto3" json:"money_price_per_vcpu,omitempty"` - MoneyPricePerGib *money.Money `protobuf:"bytes,80,opt,name=money_price_per_gib,json=moneyPricePerGib,proto3" json:"money_price_per_gib,omitempty"` - MoneyPricePerGpu *money.Money `protobuf:"bytes,81,opt,name=money_price_per_gpu,json=moneyPricePerGpu,proto3" json:"money_price_per_gpu,omitempty"` - MoneyCpuPrice *money.Money `protobuf:"bytes,82,opt,name=money_cpu_price,json=moneyCpuPrice,proto3" json:"money_cpu_price,omitempty"` - MoneyMemoryPrice *money.Money `protobuf:"bytes,83,opt,name=money_memory_price,json=moneyMemoryPrice,proto3" json:"money_memory_price,omitempty"` - MoneyGpuPrice *money.Money `protobuf:"bytes,84,opt,name=money_gpu_price,json=moneyGpuPrice,proto3" json:"money_gpu_price,omitempty"` - // Commitment pricing: original on-demand list price and billing source. - // money_price_per_hour holds the effective (RI/SP-adjusted) price. - // money_on_demand_price_per_hour holds the baseline list price before any discount. - // For on-demand and spot nodes both fields are equal. - MoneyOnDemandPricePerHour *money.Money `protobuf:"bytes,85,opt,name=money_on_demand_price_per_hour,json=moneyOnDemandPricePerHour,proto3" json:"money_on_demand_price_per_hour,omitempty"` - PriceSource string `protobuf:"bytes,86,opt,name=price_source,json=priceSource,proto3" json:"price_source,omitempty"` // "ri_exact", "ri_flexible", "sp_api_rate", "sp_estimated", "mixed", "spot", "on_demand", "unknown" - PricingAccuracy string `protobuf:"bytes,87,opt,name=pricing_accuracy,json=pricingAccuracy,proto3" json:"pricing_accuracy,omitempty"` // "accurate", "estimated", "fallback", "unknown" - // Enhanced node classification - ExtractedNodeType string `protobuf:"bytes,60,opt,name=extracted_node_type,json=extractedNodeType,proto3" json:"extracted_node_type,omitempty"` // "spot", "on-demand", "reserved" - AvailabilityZone string `protobuf:"bytes,61,opt,name=availability_zone,json=availabilityZone,proto3" json:"availability_zone,omitempty"` // Multi-cloud AZ extraction - // Kubernetes metadata - KubernetesUid string `protobuf:"bytes,62,opt,name=kubernetes_uid,json=kubernetesUid,proto3" json:"kubernetes_uid,omitempty"` - ResourceVersion string `protobuf:"bytes,63,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - // Volume and storage information - VolumesInUse []string `protobuf:"bytes,65,rep,name=volumes_in_use,json=volumesInUse,proto3" json:"volumes_in_use,omitempty"` - VolumesAttached []*AttachedVolume `protobuf:"bytes,66,rep,name=volumes_attached,json=volumesAttached,proto3" json:"volumes_attached,omitempty"` - // Timing information - LastSeen *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` - CollectedAt *timestamppb.Timestamp `protobuf:"bytes,71,opt,name=collected_at,json=collectedAt,proto3" json:"collected_at,omitempty"` - DeletionTimestamp *timestamppb.Timestamp `protobuf:"bytes,72,opt,name=deletion_timestamp,json=deletionTimestamp,proto3" json:"deletion_timestamp,omitempty"` +func (x *WorkloadItem) GetOwnerKind() string { + if x != nil { + return x.OwnerKind + } + return "" } -func (x *Node) Reset() { - *x = Node{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *WorkloadItem) GetOwnerUid() string { + if x != nil { + return x.OwnerUid } + return "" } -func (x *Node) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *WorkloadItem) GetChildren() []*WorkloadItem { + if x != nil { + return x.Children + } + return nil } -func (*Node) ProtoMessage() {} - -func (x *Node) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[13] - 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 Node.ProtoReflect.Descriptor instead. -func (*Node) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{13} -} - -func (x *Node) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Node) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Node) GetInstanceType() string { - if x != nil { - return x.InstanceType - } - return "" -} - -func (x *Node) GetType() string { +func (x *WorkloadItem) GetLabels() map[string]string { if x != nil { - return x.Type + return x.Labels } - return "" + return nil } -func (x *Node) GetRegion() string { +func (x *WorkloadItem) GetAnnotations() map[string]string { if x != nil { - return x.Region + return x.Annotations } - return "" + return nil } -func (x *Node) GetZone() string { +func (x *WorkloadItem) GetCreationTimestamp() int64 { if x != nil { - return x.Zone + return x.CreationTimestamp } - return "" + return 0 } -func (x *Node) GetResourceMetrics() *ResourceMetrics { +func (x *WorkloadItem) GetResourceMetrics() *ResourceMetrics { if x != nil { return x.ResourceMetrics } return nil } -func (x *Node) GetCostInfo() *CostInfo { +func (x *WorkloadItem) GetCostInfo() *CostInfo { if x != nil { return x.CostInfo } return nil } -func (x *Node) GetNodeCreatedAt() int64 { +func (x *WorkloadItem) GetCostDataPoints() []*CostDataPoint { if x != nil { - return x.NodeCreatedAt + return x.CostDataPoints } - return 0 + return nil } -func (x *Node) GetIsReady() bool { +func (x *WorkloadItem) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.IsReady + return x.ResourceDataPoints } - return false + return nil } -func (x *Node) GetContainerRuntime() *ContainerRuntimeInfo { +func (x *WorkloadItem) GetImpactScore() float64 { if x != nil { - return x.ContainerRuntime + return x.ImpactScore } - return nil + return 0 } -func (x *Node) GetNodeGroupName() string { +func (x *WorkloadItem) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.NodeGroupName + return x.CreatedAt } - return "" + return nil } -func (x *Node) GetResourceDetails() *ResourceDetails { +func (x *WorkloadItem) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.ResourceDetails + return x.DeletedAt } return nil } -func (x *Node) GetOwnerKind() string { +func (x *WorkloadItem) GetClusterId() string { if x != nil { - return x.OwnerKind + return x.ClusterId } return "" } -func (x *Node) GetOwnerUid() string { +func (x *WorkloadItem) GetId() string { if x != nil { - return x.OwnerUid + return x.Id } return "" } -func (x *Node) GetChildren() []*WorkloadItem { +func (x *WorkloadItem) GetIsKarpenterResource() bool { if x != nil { - return x.Children + return x.IsKarpenterResource } - return nil + return false } -func (x *Node) GetLabels() map[string]string { +func (x *WorkloadItem) GetResourceDetails() *ResourceDetails { if x != nil { - return x.Labels + return x.ResourceDetails } return nil } -func (x *Node) GetAnnotations() map[string]string { +func (x *WorkloadItem) GetPolicyIds() []string { if x != nil { - return x.Annotations + return x.PolicyIds } return nil } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerHour() float64 { +func (x *WorkloadItem) GetReplicasFromStatus() int32 { if x != nil { - return x.PricePerHour + return x.ReplicasFromStatus } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerVcpu() float64 { +func (x *WorkloadItem) GetReplicasFromSpec() int32 { if x != nil { - return x.PricePerVcpu + return x.ReplicasFromSpec } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerGib() float64 { +func (x *WorkloadItem) GetReplicasFromMetrics() int32 { if x != nil { - return x.PricePerGib + return x.ReplicasFromMetrics } return 0 } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetPricePerGpu() float64 { +func (x *WorkloadItem) GetRootOwnerKind() string { if x != nil { - return x.PricePerGpu + return x.RootOwnerKind } - return 0 + return "" } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetCpuPrice() float64 { +func (x *WorkloadItem) GetRootOwnerUid() string { if x != nil { - return x.CpuPrice + return x.RootOwnerUid } - return 0 + return "" } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetMemoryPrice() float64 { +func (x *WorkloadItem) GetOptimizationStatus() *OptimizationStatus { if x != nil { - return x.MemoryPrice + return x.OptimizationStatus } - return 0 + return nil } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *Node) GetGpuPrice() float64 { - if x != nil { - return x.GpuPrice - } - return 0 -} +// ContainerRuntimeInfo containes information about container runtime info +type ContainerRuntimeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *Node) GetMoneyPricePerHour() *money.Money { - if x != nil { - return x.MoneyPricePerHour - } - return nil + RuntimeName string `protobuf:"bytes,1,opt,name=runtime_name,json=runtimeName,proto3" json:"runtime_name,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` } -func (x *Node) GetMoneyEffPeriodTotalCost() *money.Money { - if x != nil { - return x.MoneyEffPeriodTotalCost +func (x *ContainerRuntimeInfo) Reset() { + *x = ContainerRuntimeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *Node) GetMoneyPricePerVcpu() *money.Money { - if x != nil { - return x.MoneyPricePerVcpu - } - return nil +func (x *ContainerRuntimeInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Node) GetMoneyPricePerGib() *money.Money { - if x != nil { - return x.MoneyPricePerGib - } - return nil -} +func (*ContainerRuntimeInfo) ProtoMessage() {} -func (x *Node) GetMoneyPricePerGpu() *money.Money { - if x != nil { - return x.MoneyPricePerGpu +func (x *ContainerRuntimeInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Node) GetMoneyCpuPrice() *money.Money { - if x != nil { - return x.MoneyCpuPrice - } - return nil +// Deprecated: Use ContainerRuntimeInfo.ProtoReflect.Descriptor instead. +func (*ContainerRuntimeInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{16} } -func (x *Node) GetMoneyMemoryPrice() *money.Money { +func (x *ContainerRuntimeInfo) GetRuntimeName() string { if x != nil { - return x.MoneyMemoryPrice + return x.RuntimeName } - return nil + return "" } -func (x *Node) GetMoneyGpuPrice() *money.Money { +func (x *ContainerRuntimeInfo) GetVersion() string { if x != nil { - return x.MoneyGpuPrice + return x.Version } - return nil + return "" } -func (x *Node) GetMoneyOnDemandPricePerHour() *money.Money { - if x != nil { - return x.MoneyOnDemandPricePerHour - } - return nil +// NodeInfo contains information about nodes in a cluster. +type NodeInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` // Total number of nodes. + OnDemandCount int32 `protobuf:"varint,2,opt,name=on_demand_count,json=onDemandCount,proto3" json:"on_demand_count,omitempty"` // Number of on-demand nodes. + ReservedCount int32 `protobuf:"varint,3,opt,name=reserved_count,json=reservedCount,proto3" json:"reserved_count,omitempty"` // Number of reserved nodes. + SpotCount int32 `protobuf:"varint,4,opt,name=spot_count,json=spotCount,proto3" json:"spot_count,omitempty"` // Number of spot nodes. + UnknownCount int32 `protobuf:"varint,5,opt,name=unknown_count,json=unknownCount,proto3" json:"unknown_count,omitempty"` // Number of nodes with unknown type. + PriceSourceCounts map[string]int32 `protobuf:"bytes,6,rep,name=price_source_counts,json=priceSourceCounts,proto3" json:"price_source_counts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` // Node count by price_source (e.g. {"ri_exact": 2, "sp_api_rate": 1, "on_demand": 5}). } -func (x *Node) GetPriceSource() string { - if x != nil { - return x.PriceSource +func (x *NodeInfo) Reset() { + *x = NodeInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *Node) GetPricingAccuracy() string { - if x != nil { - return x.PricingAccuracy - } - return "" +func (x *NodeInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *Node) GetExtractedNodeType() string { - if x != nil { - return x.ExtractedNodeType - } - return "" -} +func (*NodeInfo) ProtoMessage() {} -func (x *Node) GetAvailabilityZone() string { - if x != nil { - return x.AvailabilityZone +func (x *NodeInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *Node) GetKubernetesUid() string { - if x != nil { - return x.KubernetesUid - } - return "" +// Deprecated: Use NodeInfo.ProtoReflect.Descriptor instead. +func (*NodeInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{17} } -func (x *Node) GetResourceVersion() string { +func (x *NodeInfo) GetNodeCount() int32 { if x != nil { - return x.ResourceVersion + return x.NodeCount } - return "" + return 0 } -func (x *Node) GetVolumesInUse() []string { +func (x *NodeInfo) GetOnDemandCount() int32 { if x != nil { - return x.VolumesInUse + return x.OnDemandCount } - return nil + return 0 } -func (x *Node) GetVolumesAttached() []*AttachedVolume { +func (x *NodeInfo) GetReservedCount() int32 { if x != nil { - return x.VolumesAttached + return x.ReservedCount } - return nil + return 0 } -func (x *Node) GetLastSeen() *timestamppb.Timestamp { +func (x *NodeInfo) GetSpotCount() int32 { if x != nil { - return x.LastSeen + return x.SpotCount } - return nil + return 0 } -func (x *Node) GetCollectedAt() *timestamppb.Timestamp { +func (x *NodeInfo) GetUnknownCount() int32 { if x != nil { - return x.CollectedAt + return x.UnknownCount } - return nil + return 0 } -func (x *Node) GetDeletionTimestamp() *timestamppb.Timestamp { +func (x *NodeInfo) GetPriceSourceCounts() map[string]int32 { if x != nil { - return x.DeletionTimestamp + return x.PriceSourceCounts } return nil } -type AttachedVolume struct { +// ResourceInfo provides counts of resources and their scheduling states. +type ResourceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DevicePath string `protobuf:"bytes,2,opt,name=device_path,json=devicePath,proto3" json:"device_path,omitempty"` + ResourcesCount int32 `protobuf:"varint,1,opt,name=resources_count,json=resourcesCount,proto3" json:"resources_count,omitempty"` // Total number of resources. + ScheduledResourceCount int32 `protobuf:"varint,2,opt,name=scheduled_resource_count,json=scheduledResourceCount,proto3" json:"scheduled_resource_count,omitempty"` // Number of scheduled resources. + UnscheduledResourceCount int32 `protobuf:"varint,3,opt,name=unscheduled_resource_count,json=unscheduledResourceCount,proto3" json:"unscheduled_resource_count,omitempty"` // Number of unscheduled resources. + UnknownResourceCount int32 `protobuf:"varint,4,opt,name=unknown_resource_count,json=unknownResourceCount,proto3" json:"unknown_resource_count,omitempty"` // Number of resources in unknown state. } -func (x *AttachedVolume) Reset() { - *x = AttachedVolume{} +func (x *ResourceInfo) Reset() { + *x = ResourceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[14] + mi := &file_api_v1_common_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AttachedVolume) String() string { +func (x *ResourceInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AttachedVolume) ProtoMessage() {} +func (*ResourceInfo) ProtoMessage() {} -func (x *AttachedVolume) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[14] +func (x *ResourceInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3430,58 +3901,128 @@ func (x *AttachedVolume) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AttachedVolume.ProtoReflect.Descriptor instead. -func (*AttachedVolume) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{14} +// Deprecated: Use ResourceInfo.ProtoReflect.Descriptor instead. +func (*ResourceInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{18} } -func (x *AttachedVolume) GetName() string { +func (x *ResourceInfo) GetResourcesCount() int32 { if x != nil { - return x.Name + return x.ResourcesCount } - return "" + return 0 } -func (x *AttachedVolume) GetDevicePath() string { +func (x *ResourceInfo) GetScheduledResourceCount() int32 { if x != nil { - return x.DevicePath + return x.ScheduledResourceCount } - return "" + return 0 } -// NodeGroup represents a group of Kubernetes nodes with aggregated metrics. -type NodeGroup struct { +func (x *ResourceInfo) GetUnscheduledResourceCount() int32 { + if x != nil { + return x.UnscheduledResourceCount + } + return 0 +} + +func (x *ResourceInfo) GetUnknownResourceCount() int32 { + if x != nil { + return x.UnknownResourceCount + } + return 0 +} + +// Node represents a Kubernetes node with metadata, metrics, and cost information. +type Node struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. - Nodes []*Node `protobuf:"bytes,2,rep,name=nodes,proto3" json:"nodes,omitempty"` // Nodes in the group. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the node group. - CostInfo *CostInfo `protobuf:"bytes,4,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the node group. - NodeInfo *NodeInfo `protobuf:"bytes,5,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Node count breakdown for the node group. - ResourceInfo *ResourceInfo `protobuf:"bytes,6,opt,name=resource_info,json=resourceInfo,proto3" json:"resource_info,omitempty"` // Resource scheduling information for the node group. - CostDataPoints []*CostDataPoint `protobuf:"bytes,11,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node group. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,12,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node group. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Unique identifier for the node. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Name of the node. + InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` // Instance type of the node. + Type string `protobuf:"bytes,4,opt,name=type,proto3" json:"type,omitempty"` // Type/category of the node. + Region string `protobuf:"bytes,5,opt,name=region,proto3" json:"region,omitempty"` // Region where the node is deployed. + Zone string `protobuf:"bytes,6,opt,name=zone,proto3" json:"zone,omitempty"` // Zone where the node is deployed. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,7,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource utilization metrics for the node. + CostInfo *CostInfo `protobuf:"bytes,8,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the node. + NodeCreatedAt int64 `protobuf:"varint,9,opt,name=node_created_at,json=nodeCreatedAt,proto3" json:"node_created_at,omitempty"` // Node creation time as a Unix timestamp. + IsReady bool `protobuf:"varint,10,opt,name=is_ready,json=isReady,proto3" json:"is_ready,omitempty"` // Indicates whether the node is ready. + ContainerRuntime *ContainerRuntimeInfo `protobuf:"bytes,20,opt,name=container_runtime,json=containerRuntime,proto3,oneof" json:"container_runtime,omitempty"` + NodeGroupName string `protobuf:"bytes,30,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` // it is what the variable says it is + ResourceDetails *ResourceDetails `protobuf:"bytes,40,opt,name=resource_details,json=resourceDetails,proto3" json:"resource_details,omitempty"` // if withDetails is true + // metadata if withMetadata is true + OwnerKind string `protobuf:"bytes,41,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` // Kind of the owning resource, if any. + OwnerUid string `protobuf:"bytes,42,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` // UID of the owning resource, if any. + Children []*WorkloadItem `protobuf:"bytes,43,rep,name=children,proto3" json:"children,omitempty"` // Child resources of this workload item. + Labels map[string]string `protobuf:"bytes,44,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource labels. + Annotations map[string]string `protobuf:"bytes,45,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource annotations. + // Pricing information (legacy float fields - deprecated) + // + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerHour float64 `protobuf:"fixed64,50,opt,name=price_per_hour,json=pricePerHour,proto3" json:"price_per_hour,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerVcpu float64 `protobuf:"fixed64,51,opt,name=price_per_vcpu,json=pricePerVcpu,proto3" json:"price_per_vcpu,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerGib float64 `protobuf:"fixed64,52,opt,name=price_per_gib,json=pricePerGib,proto3" json:"price_per_gib,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + PricePerGpu float64 `protobuf:"fixed64,53,opt,name=price_per_gpu,json=pricePerGpu,proto3" json:"price_per_gpu,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + CpuPrice float64 `protobuf:"fixed64,54,opt,name=cpu_price,json=cpuPrice,proto3" json:"cpu_price,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + MemoryPrice float64 `protobuf:"fixed64,55,opt,name=memory_price,json=memoryPrice,proto3" json:"memory_price,omitempty"` + // Deprecated: Marked as deprecated in api/v1/common.proto. + GpuPrice float64 `protobuf:"fixed64,56,opt,name=gpu_price,json=gpuPrice,proto3" json:"gpu_price,omitempty"` + // Pricing information (using Money type for currency flexibility) + MoneyPricePerHour *money.Money `protobuf:"bytes,57,opt,name=money_price_per_hour,json=moneyPricePerHour,proto3" json:"money_price_per_hour,omitempty"` + MoneyEffPeriodTotalCost *money.Money `protobuf:"bytes,58,opt,name=money_eff_period_total_cost,json=moneyEffPeriodTotalCost,proto3" json:"money_eff_period_total_cost,omitempty"` + MoneyPricePerVcpu *money.Money `protobuf:"bytes,59,opt,name=money_price_per_vcpu,json=moneyPricePerVcpu,proto3" json:"money_price_per_vcpu,omitempty"` + MoneyPricePerGib *money.Money `protobuf:"bytes,80,opt,name=money_price_per_gib,json=moneyPricePerGib,proto3" json:"money_price_per_gib,omitempty"` + MoneyPricePerGpu *money.Money `protobuf:"bytes,81,opt,name=money_price_per_gpu,json=moneyPricePerGpu,proto3" json:"money_price_per_gpu,omitempty"` + MoneyCpuPrice *money.Money `protobuf:"bytes,82,opt,name=money_cpu_price,json=moneyCpuPrice,proto3" json:"money_cpu_price,omitempty"` + MoneyMemoryPrice *money.Money `protobuf:"bytes,83,opt,name=money_memory_price,json=moneyMemoryPrice,proto3" json:"money_memory_price,omitempty"` + MoneyGpuPrice *money.Money `protobuf:"bytes,84,opt,name=money_gpu_price,json=moneyGpuPrice,proto3" json:"money_gpu_price,omitempty"` + // Commitment pricing: original on-demand list price and billing source. + // money_price_per_hour holds the effective (RI/SP-adjusted) price. + // money_on_demand_price_per_hour holds the baseline list price before any discount. + // For on-demand and spot nodes both fields are equal. + MoneyOnDemandPricePerHour *money.Money `protobuf:"bytes,85,opt,name=money_on_demand_price_per_hour,json=moneyOnDemandPricePerHour,proto3" json:"money_on_demand_price_per_hour,omitempty"` + PriceSource string `protobuf:"bytes,86,opt,name=price_source,json=priceSource,proto3" json:"price_source,omitempty"` // "ri_exact", "ri_flexible", "sp_api_rate", "sp_estimated", "mixed", "spot", "on_demand", "unknown" + PricingAccuracy string `protobuf:"bytes,87,opt,name=pricing_accuracy,json=pricingAccuracy,proto3" json:"pricing_accuracy,omitempty"` // "accurate", "estimated", "fallback", "unknown" + // Enhanced node classification + ExtractedNodeType string `protobuf:"bytes,60,opt,name=extracted_node_type,json=extractedNodeType,proto3" json:"extracted_node_type,omitempty"` // "spot", "on-demand", "reserved" + AvailabilityZone string `protobuf:"bytes,61,opt,name=availability_zone,json=availabilityZone,proto3" json:"availability_zone,omitempty"` // Multi-cloud AZ extraction + // Kubernetes metadata + KubernetesUid string `protobuf:"bytes,62,opt,name=kubernetes_uid,json=kubernetesUid,proto3" json:"kubernetes_uid,omitempty"` + ResourceVersion string `protobuf:"bytes,63,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + // Volume and storage information + VolumesInUse []string `protobuf:"bytes,65,rep,name=volumes_in_use,json=volumesInUse,proto3" json:"volumes_in_use,omitempty"` + VolumesAttached []*AttachedVolume `protobuf:"bytes,66,rep,name=volumes_attached,json=volumesAttached,proto3" json:"volumes_attached,omitempty"` + // Timing information + LastSeen *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,71,opt,name=collected_at,json=collectedAt,proto3" json:"collected_at,omitempty"` + DeletionTimestamp *timestamppb.Timestamp `protobuf:"bytes,72,opt,name=deletion_timestamp,json=deletionTimestamp,proto3" json:"deletion_timestamp,omitempty"` } -func (x *NodeGroup) Reset() { - *x = NodeGroup{} +func (x *Node) Reset() { + *x = Node{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[15] + mi := &file_api_v1_common_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroup) String() string { +func (x *Node) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroup) ProtoMessage() {} +func (*Node) ProtoMessage() {} -func (x *NodeGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[15] +func (x *Node) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3492,508 +4033,359 @@ func (x *NodeGroup) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroup.ProtoReflect.Descriptor instead. -func (*NodeGroup) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{15} +// Deprecated: Use Node.ProtoReflect.Descriptor instead. +func (*Node) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{19} } -func (x *NodeGroup) GetName() string { +func (x *Node) GetId() string { if x != nil { - return x.Name + return x.Id } return "" } -func (x *NodeGroup) GetNodes() []*Node { +func (x *Node) GetName() string { if x != nil { - return x.Nodes + return x.Name } - return nil + return "" } -func (x *NodeGroup) GetResourceMetrics() *ResourceMetrics { +func (x *Node) GetInstanceType() string { if x != nil { - return x.ResourceMetrics + return x.InstanceType } - return nil + return "" } -func (x *NodeGroup) GetCostInfo() *CostInfo { +func (x *Node) GetType() string { if x != nil { - return x.CostInfo + return x.Type } - return nil + return "" } -func (x *NodeGroup) GetNodeInfo() *NodeInfo { +func (x *Node) GetRegion() string { if x != nil { - return x.NodeInfo + return x.Region } - return nil + return "" } -func (x *NodeGroup) GetResourceInfo() *ResourceInfo { +func (x *Node) GetZone() string { if x != nil { - return x.ResourceInfo + return x.Zone } - return nil + return "" } -func (x *NodeGroup) GetCostDataPoints() []*CostDataPoint { +func (x *Node) GetResourceMetrics() *ResourceMetrics { if x != nil { - return x.CostDataPoints + return x.ResourceMetrics } return nil } -func (x *NodeGroup) GetResourceDataPoints() []*ResourceDataPoint { +func (x *Node) GetCostInfo() *CostInfo { if x != nil { - return x.ResourceDataPoints + return x.CostInfo } return nil } -// CostDataPoint represents cost information at a specific time. -type CostDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the data point. -} - -func (x *CostDataPoint) Reset() { - *x = CostDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CostDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CostDataPoint) ProtoMessage() {} - -func (x *CostDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[16] - 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 CostDataPoint.ProtoReflect.Descriptor instead. -func (*CostDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{16} -} - -func (x *CostDataPoint) GetTimestamp() int64 { +func (x *Node) GetNodeCreatedAt() int64 { if x != nil { - return x.Timestamp + return x.NodeCreatedAt } return 0 } -func (x *CostDataPoint) GetCostInfo() *CostInfo { +func (x *Node) GetIsReady() bool { if x != nil { - return x.CostInfo - } - return nil -} - -// ResourceDataPoint represents resource utilization at a specific time. -type ResourceDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the data point. -} - -func (x *ResourceDataPoint) Reset() { - *x = ResourceDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + return x.IsReady } + return false } -func (x *ResourceDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResourceDataPoint) ProtoMessage() {} - -func (x *ResourceDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetContainerRuntime() *ContainerRuntimeInfo { + if x != nil { + return x.ContainerRuntime } - return mi.MessageOf(x) -} - -// Deprecated: Use ResourceDataPoint.ProtoReflect.Descriptor instead. -func (*ResourceDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{17} + return nil } -func (x *ResourceDataPoint) GetTimestamp() int64 { +func (x *Node) GetNodeGroupName() string { if x != nil { - return x.Timestamp + return x.NodeGroupName } - return 0 + return "" } -func (x *ResourceDataPoint) GetResourceMetrics() *ResourceMetrics { +func (x *Node) GetResourceDetails() *ResourceDetails { if x != nil { - return x.ResourceMetrics + return x.ResourceDetails } return nil } -// ContainerTimeSeries contains time-series resource metrics for a single container. -type ContainerTimeSeries struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,2,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` -} - -func (x *ContainerTimeSeries) Reset() { - *x = ContainerTimeSeries{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ContainerTimeSeries) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ContainerTimeSeries) ProtoMessage() {} - -func (x *ContainerTimeSeries) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetOwnerKind() string { + if x != nil { + return x.OwnerKind } - return mi.MessageOf(x) -} - -// Deprecated: Use ContainerTimeSeries.ProtoReflect.Descriptor instead. -func (*ContainerTimeSeries) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{18} + return "" } -func (x *ContainerTimeSeries) GetContainerName() string { +func (x *Node) GetOwnerUid() string { if x != nil { - return x.ContainerName + return x.OwnerUid } return "" } -func (x *ContainerTimeSeries) GetResourceDataPoints() []*ResourceDataPoint { +func (x *Node) GetChildren() []*WorkloadItem { if x != nil { - return x.ResourceDataPoints + return x.Children } return nil } -type SavingsData struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CpuSavingsMillicores float64 `protobuf:"fixed64,1,opt,name=cpu_savings_millicores,json=cpuSavingsMillicores,proto3" json:"cpu_savings_millicores,omitempty"` - CpuHighWaterMark float64 `protobuf:"fixed64,2,opt,name=cpu_high_water_mark,json=cpuHighWaterMark,proto3" json:"cpu_high_water_mark,omitempty"` - ActualCpuRequest float64 `protobuf:"fixed64,3,opt,name=actual_cpu_request,json=actualCpuRequest,proto3" json:"actual_cpu_request,omitempty"` - CumulativeCpuSavingsMillicores float64 `protobuf:"fixed64,4,opt,name=cumulative_cpu_savings_millicores,json=cumulativeCpuSavingsMillicores,proto3" json:"cumulative_cpu_savings_millicores,omitempty"` - CpuCostWithoutAutoscaler float64 `protobuf:"fixed64,5,opt,name=cpu_cost_without_autoscaler,json=cpuCostWithoutAutoscaler,proto3" json:"cpu_cost_without_autoscaler,omitempty"` // hypothetical cost w/ chart-level request - ActualCpuCost float64 `protobuf:"fixed64,6,opt,name=actual_cpu_cost,json=actualCpuCost,proto3" json:"actual_cpu_cost,omitempty"` // what you paid - CpuCostSavings float64 `protobuf:"fixed64,7,opt,name=cpu_cost_savings,json=cpuCostSavings,proto3" json:"cpu_cost_savings,omitempty"` // autoscaler impact (5 - 6) - CpuUsageCost float64 `protobuf:"fixed64,8,opt,name=cpu_usage_cost,json=cpuUsageCost,proto3" json:"cpu_usage_cost,omitempty"` // based on actual usage - CpuCostWaste float64 `protobuf:"fixed64,9,opt,name=cpu_cost_waste,json=cpuCostWaste,proto3" json:"cpu_cost_waste,omitempty"` // 6 - 8 -} - -func (x *SavingsData) Reset() { - *x = SavingsData{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetLabels() map[string]string { + if x != nil { + return x.Labels } + return nil } -func (x *SavingsData) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SavingsData) ProtoMessage() {} - -func (x *SavingsData) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations } - return mi.MessageOf(x) + return nil } -// Deprecated: Use SavingsData.ProtoReflect.Descriptor instead. -func (*SavingsData) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{19} +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerHour() float64 { + if x != nil { + return x.PricePerHour + } + return 0 } -func (x *SavingsData) GetCpuSavingsMillicores() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerVcpu() float64 { if x != nil { - return x.CpuSavingsMillicores + return x.PricePerVcpu } return 0 } -func (x *SavingsData) GetCpuHighWaterMark() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerGib() float64 { if x != nil { - return x.CpuHighWaterMark + return x.PricePerGib } return 0 } -func (x *SavingsData) GetActualCpuRequest() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetPricePerGpu() float64 { if x != nil { - return x.ActualCpuRequest + return x.PricePerGpu } return 0 } -func (x *SavingsData) GetCumulativeCpuSavingsMillicores() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetCpuPrice() float64 { if x != nil { - return x.CumulativeCpuSavingsMillicores + return x.CpuPrice } return 0 } -func (x *SavingsData) GetCpuCostWithoutAutoscaler() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetMemoryPrice() float64 { if x != nil { - return x.CpuCostWithoutAutoscaler + return x.MemoryPrice } return 0 } -func (x *SavingsData) GetActualCpuCost() float64 { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *Node) GetGpuPrice() float64 { if x != nil { - return x.ActualCpuCost + return x.GpuPrice } return 0 } -func (x *SavingsData) GetCpuCostSavings() float64 { +func (x *Node) GetMoneyPricePerHour() *money.Money { if x != nil { - return x.CpuCostSavings + return x.MoneyPricePerHour } - return 0 + return nil } -func (x *SavingsData) GetCpuUsageCost() float64 { +func (x *Node) GetMoneyEffPeriodTotalCost() *money.Money { if x != nil { - return x.CpuUsageCost + return x.MoneyEffPeriodTotalCost } - return 0 + return nil } -func (x *SavingsData) GetCpuCostWaste() float64 { +func (x *Node) GetMoneyPricePerVcpu() *money.Money { if x != nil { - return x.CpuCostWaste + return x.MoneyPricePerVcpu } - return 0 + return nil } -type SavingsDataPoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - SavingsData *SavingsData `protobuf:"bytes,2,opt,name=savings_data,json=savingsData,proto3" json:"savings_data,omitempty"` -} - -func (x *SavingsDataPoint) Reset() { - *x = SavingsDataPoint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetMoneyPricePerGib() *money.Money { + if x != nil { + return x.MoneyPricePerGib } + return nil } -func (x *SavingsDataPoint) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Node) GetMoneyPricePerGpu() *money.Money { + if x != nil { + return x.MoneyPricePerGpu + } + return nil } -func (*SavingsDataPoint) ProtoMessage() {} - -func (x *SavingsDataPoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetMoneyCpuPrice() *money.Money { + if x != nil { + return x.MoneyCpuPrice } - return mi.MessageOf(x) + return nil } -// Deprecated: Use SavingsDataPoint.ProtoReflect.Descriptor instead. -func (*SavingsDataPoint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{20} +func (x *Node) GetMoneyMemoryPrice() *money.Money { + if x != nil { + return x.MoneyMemoryPrice + } + return nil } -func (x *SavingsDataPoint) GetTimestamp() int64 { +func (x *Node) GetMoneyGpuPrice() *money.Money { if x != nil { - return x.Timestamp + return x.MoneyGpuPrice } - return 0 + return nil } -func (x *SavingsDataPoint) GetSavingsData() *SavingsData { +func (x *Node) GetMoneyOnDemandPricePerHour() *money.Money { if x != nil { - return x.SavingsData + return x.MoneyOnDemandPricePerHour } return nil } -type SavingsTimeSeries struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *Node) GetPriceSource() string { + if x != nil { + return x.PriceSource + } + return "" +} - SavingsDatapoints []*SavingsDataPoint `protobuf:"bytes,1,rep,name=savings_datapoints,json=savingsDatapoints,proto3" json:"savings_datapoints,omitempty"` - TotalCpuSavingsMillicores float64 `protobuf:"fixed64,2,opt,name=total_cpu_savings_millicores,json=totalCpuSavingsMillicores,proto3" json:"total_cpu_savings_millicores,omitempty"` - TotalCpuCostSavings float64 `protobuf:"fixed64,3,opt,name=total_cpu_cost_savings,json=totalCpuCostSavings,proto3" json:"total_cpu_cost_savings,omitempty"` - TotalCpuCostWaste float64 `protobuf:"fixed64,4,opt,name=total_cpu_cost_waste,json=totalCpuCostWaste,proto3" json:"total_cpu_cost_waste,omitempty"` +func (x *Node) GetPricingAccuracy() string { + if x != nil { + return x.PricingAccuracy + } + return "" } -func (x *SavingsTimeSeries) Reset() { - *x = SavingsTimeSeries{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Node) GetExtractedNodeType() string { + if x != nil { + return x.ExtractedNodeType } + return "" } -func (x *SavingsTimeSeries) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Node) GetAvailabilityZone() string { + if x != nil { + return x.AvailabilityZone + } + return "" } -func (*SavingsTimeSeries) ProtoMessage() {} +func (x *Node) GetKubernetesUid() string { + if x != nil { + return x.KubernetesUid + } + return "" +} -func (x *SavingsTimeSeries) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Node) GetResourceVersion() string { + if x != nil { + return x.ResourceVersion } - return mi.MessageOf(x) + return "" } -// Deprecated: Use SavingsTimeSeries.ProtoReflect.Descriptor instead. -func (*SavingsTimeSeries) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{21} +func (x *Node) GetVolumesInUse() []string { + if x != nil { + return x.VolumesInUse + } + return nil } -func (x *SavingsTimeSeries) GetSavingsDatapoints() []*SavingsDataPoint { +func (x *Node) GetVolumesAttached() []*AttachedVolume { if x != nil { - return x.SavingsDatapoints + return x.VolumesAttached } return nil } -func (x *SavingsTimeSeries) GetTotalCpuSavingsMillicores() float64 { +func (x *Node) GetLastSeen() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuSavingsMillicores + return x.LastSeen } - return 0 + return nil } -func (x *SavingsTimeSeries) GetTotalCpuCostSavings() float64 { +func (x *Node) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuCostSavings + return x.CollectedAt } - return 0 + return nil } -func (x *SavingsTimeSeries) GetTotalCpuCostWaste() float64 { +func (x *Node) GetDeletionTimestamp() *timestamppb.Timestamp { if x != nil { - return x.TotalCpuCostWaste + return x.DeletionTimestamp } - return 0 + return nil } -// LabelSelectorRequirement is a selector that contains values, a key, and an operator that -// relates the key and values. -type LabelSelectorRequirement struct { +type AttachedVolume struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // key is the label key that the selector applies to. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // operator represents a key's relationship to a set of values. - // Valid operators are In, NotIn, Exists and DoesNotExist. - Operator LabelSelectorOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=api.v1.LabelSelectorOperator" json:"operator,omitempty"` - // values is an array of string values. If the operator is In or NotIn, - // the values array must be non-empty. If the operator is Exists or DoesNotExist, - // the values array must be empty. This array is replaced during a strategic - // merge patch. - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DevicePath string `protobuf:"bytes,2,opt,name=device_path,json=devicePath,proto3" json:"device_path,omitempty"` } -func (x *LabelSelectorRequirement) Reset() { - *x = LabelSelectorRequirement{} +func (x *AttachedVolume) Reset() { + *x = AttachedVolume{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[22] + mi := &file_api_v1_common_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSelectorRequirement) String() string { +func (x *AttachedVolume) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSelectorRequirement) ProtoMessage() {} +func (*AttachedVolume) ProtoMessage() {} -func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[22] +func (x *AttachedVolume) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4004,58 +4396,58 @@ func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSelectorRequirement.ProtoReflect.Descriptor instead. -func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{22} +// Deprecated: Use AttachedVolume.ProtoReflect.Descriptor instead. +func (*AttachedVolume) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{20} } -func (x *LabelSelectorRequirement) GetKey() string { +func (x *AttachedVolume) GetName() string { if x != nil { - return x.Key + return x.Name } return "" } -func (x *LabelSelectorRequirement) GetOperator() LabelSelectorOperator { - if x != nil { - return x.Operator - } - return LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED -} - -func (x *LabelSelectorRequirement) GetValues() []string { +func (x *AttachedVolume) GetDevicePath() string { if x != nil { - return x.Values + return x.DevicePath } - return nil + return "" } -type Label struct { +// NodeGroup represents a group of Kubernetes nodes with aggregated metrics. +type NodeGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. + Nodes []*Node `protobuf:"bytes,2,rep,name=nodes,proto3" json:"nodes,omitempty"` // Nodes in the group. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the node group. + CostInfo *CostInfo `protobuf:"bytes,4,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the node group. + NodeInfo *NodeInfo `protobuf:"bytes,5,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Node count breakdown for the node group. + ResourceInfo *ResourceInfo `protobuf:"bytes,6,opt,name=resource_info,json=resourceInfo,proto3" json:"resource_info,omitempty"` // Resource scheduling information for the node group. + CostDataPoints []*CostDataPoint `protobuf:"bytes,11,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node group. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,12,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node group. } -func (x *Label) Reset() { - *x = Label{} +func (x *NodeGroup) Reset() { + *x = NodeGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[23] + mi := &file_api_v1_common_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Label) String() string { +func (x *NodeGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Label) ProtoMessage() {} +func (*NodeGroup) ProtoMessage() {} -func (x *Label) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[23] +func (x *NodeGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,62 +4458,94 @@ func (x *Label) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Label.ProtoReflect.Descriptor instead. -func (*Label) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{23} +// Deprecated: Use NodeGroup.ProtoReflect.Descriptor instead. +func (*NodeGroup) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{21} } -func (x *Label) GetKey() string { +func (x *NodeGroup) GetName() string { if x != nil { - return x.Key + return x.Name } return "" } -func (x *Label) GetValue() string { +func (x *NodeGroup) GetNodes() []*Node { if x != nil { - return x.Value + return x.Nodes } - return "" + return nil } -// LabelSelector is a label query over a set of resources. The result of matchLabels and -// matchExpressions are ANDed. An empty label selector matches all objects. A null -// label selector matches no objects. -type LabelSelector struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodeGroup) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} - // Department-style labels for backwards compatibility - // - // Deprecated: Marked as deprecated in api/v1/common.proto. - Labels []*Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` // Deprecated: Label is still used for departments but we will soon migrate to match_label and match_expressions - // matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels - // map is equivalent to an element of matchExpressions, whose key field is "key", the - // operator is "In", and the values array contains only "value". The requirements are ANDed. - MatchLabels map[string]string `protobuf:"bytes,2,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // matchExpressions is a list of label selector requirements. The requirements are ANDed. - MatchExpressions []*LabelSelectorRequirement `protobuf:"bytes,3,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` +func (x *NodeGroup) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil } -func (x *LabelSelector) Reset() { - *x = LabelSelector{} +func (x *NodeGroup) GetNodeInfo() *NodeInfo { + if x != nil { + return x.NodeInfo + } + return nil +} + +func (x *NodeGroup) GetResourceInfo() *ResourceInfo { + if x != nil { + return x.ResourceInfo + } + return nil +} + +func (x *NodeGroup) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *NodeGroup) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// CostDataPoint represents cost information at a specific time. +type CostDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost information for the data point. +} + +func (x *CostDataPoint) Reset() { + *x = CostDataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[24] + mi := &file_api_v1_common_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSelector) String() string { +func (x *CostDataPoint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSelector) ProtoMessage() {} +func (*CostDataPoint) ProtoMessage() {} -func (x *LabelSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[24] +func (x *CostDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4132,60 +4556,108 @@ func (x *LabelSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSelector.ProtoReflect.Descriptor instead. -func (*LabelSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{24} +// Deprecated: Use CostDataPoint.ProtoReflect.Descriptor instead. +func (*CostDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{22} } -// Deprecated: Marked as deprecated in api/v1/common.proto. -func (x *LabelSelector) GetLabels() []*Label { +func (x *CostDataPoint) GetTimestamp() int64 { if x != nil { - return x.Labels + return x.Timestamp } - return nil + return 0 } -func (x *LabelSelector) GetMatchLabels() map[string]string { +func (x *CostDataPoint) GetCostInfo() *CostInfo { if x != nil { - return x.MatchLabels + return x.CostInfo } return nil } -func (x *LabelSelector) GetMatchExpressions() []*LabelSelectorRequirement { +// ResourceDataPoint represents resource utilization at a specific time. +type ResourceDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Unix timestamp (seconds since epoch). + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the data point. +} + +func (x *ResourceDataPoint) Reset() { + *x = ResourceDataPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceDataPoint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDataPoint) ProtoMessage() {} + +func (x *ResourceDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[23] + 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 ResourceDataPoint.ProtoReflect.Descriptor instead. +func (*ResourceDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{23} +} + +func (x *ResourceDataPoint) GetTimestamp() int64 { if x != nil { - return x.MatchExpressions + return x.Timestamp + } + return 0 +} + +func (x *ResourceDataPoint) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics } return nil } -// RegexPattern represents a regex pattern with optional flags -type RegexPattern struct { +// ContainerTimeSeries contains time-series resource metrics for a single container. +type ContainerTimeSeries struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` - Flags string `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"` // case-insensitive, etc. (optional) + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,2,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` } -func (x *RegexPattern) Reset() { - *x = RegexPattern{} +func (x *ContainerTimeSeries) Reset() { + *x = ContainerTimeSeries{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[25] + mi := &file_api_v1_common_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RegexPattern) String() string { +func (x *ContainerTimeSeries) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RegexPattern) ProtoMessage() {} +func (*ContainerTimeSeries) ProtoMessage() {} -func (x *RegexPattern) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[25] +func (x *ContainerTimeSeries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4196,249 +4668,58 @@ func (x *RegexPattern) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RegexPattern.ProtoReflect.Descriptor instead. -func (*RegexPattern) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{25} +// Deprecated: Use ContainerTimeSeries.ProtoReflect.Descriptor instead. +func (*ContainerTimeSeries) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{24} } -func (x *RegexPattern) GetPattern() string { +func (x *ContainerTimeSeries) GetContainerName() string { if x != nil { - return x.Pattern + return x.ContainerName } return "" } -func (x *RegexPattern) GetFlags() string { +func (x *ContainerTimeSeries) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.Flags + return x.ResourceDataPoints } - return "" + return nil } -// ResourceDetails contains resource-specific information flattened for easy frontend access -type ResourceDetails struct { +type SavingsData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Types that are assignable to Details: - // - // *ResourceDetails_PodDetails - // *ResourceDetails_DeploymentDetails - // *ResourceDetails_StatefulSetDetails - // *ResourceDetails_DaemonSetDetails - // *ResourceDetails_ReplicaSetDetails - // *ResourceDetails_JobDetails - // *ResourceDetails_CronJobDetails - // *ResourceDetails_ServiceDetails - // *ResourceDetails_IngressDetails - // *ResourceDetails_PvcDetails - // *ResourceDetails_PvDetails - // *ResourceDetails_ScDetails - // *ResourceDetails_NsDetails - // *ResourceDetails_NodeDetails - // *ResourceDetails_HpaDetails - // *ResourceDetails_VpaDetails - // *ResourceDetails_LimitRangeDetails - // *ResourceDetails_ServiceAccountDetails - // *ResourceDetails_RoleDetails - // *ResourceDetails_RoleBindingDetails - // *ResourceDetails_KedaScaledObjectDetails - // *ResourceDetails_KarpenterResourceDetails - // *ResourceDetails_PodDisruptionBudgetDetails - // *ResourceDetails_ResourceQuotaDetails - // *ResourceDetails_VolcanoJobDetails - // *ResourceDetails_SparkApplicationDetails - // *ResourceDetails_ScheduledSparkApplicationDetails - 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 - Phase string `protobuf:"bytes,10,opt,name=phase,proto3" json:"phase,omitempty"` // Pod phase: "Running", "Pending", "Succeeded", "Failed", "Unknown" - PodIp string `protobuf:"bytes,11,opt,name=pod_ip,json=podIp,proto3" json:"pod_ip,omitempty"` // Pod IP from status.podIP - HostIp string `protobuf:"bytes,12,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` // Host IP from status.hostIP - NodeName string `protobuf:"bytes,13,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Node name where pod is scheduled - Ready bool `protobuf:"varint,14,opt,name=ready,proto3" json:"ready,omitempty"` // Pod ready status from conditions - QosClass string `protobuf:"bytes,15,opt,name=qos_class,json=qosClass,proto3" json:"qos_class,omitempty"` // Pod QoS class: "Guaranteed", "Burstable", "BestEffort" - ContainerCount int32 `protobuf:"varint,16,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of containers in the pod - RestartCount int32 `protobuf:"varint,17,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Sum of all container restart counts - // Resource requests/limits from Pod spec (static declarations) - CpuRequestsMillicores int64 `protobuf:"varint,20,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // Sum of all container CPU requests in millicores - MemoryRequestsBytes int64 `protobuf:"varint,21,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Sum of all container memory requests in bytes - CpuLimitsMillicores int64 `protobuf:"varint,22,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // Sum of all container CPU limits in millicores - MemoryLimitsBytes int64 `protobuf:"varint,23,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Sum of all container memory limits in bytes - StatusReason string `protobuf:"bytes,30,opt,name=status_reason,json=statusReason,proto3" json:"status_reason,omitempty"` // Reason for current status (e.g., "ImagePullBackOff", "Completed") - ControlledBy string `protobuf:"bytes,31,opt,name=controlled_by,json=controlledBy,proto3" json:"controlled_by,omitempty"` // Friendly owner name (e.g., "deployment/my-app", "daemonset/logs") - Age string `protobuf:"bytes,32,opt,name=age,proto3" json:"age,omitempty"` // Human-readable age since creation (e.g., "2h", "5m", "10d") - // Deployment-specific fields (flattened for easy access) - ReplicasDesired int32 `protobuf:"varint,40,opt,name=replicas_desired,json=replicasDesired,proto3" json:"replicas_desired,omitempty"` // Desired replicas from spec.replicas - ReplicasReady int32 `protobuf:"varint,41,opt,name=replicas_ready,json=replicasReady,proto3" json:"replicas_ready,omitempty"` // Ready replicas from status.readyReplicas - ReplicasAvailable int32 `protobuf:"varint,42,opt,name=replicas_available,json=replicasAvailable,proto3" json:"replicas_available,omitempty"` // Available replicas from status.availableReplicas - ReplicasUpdated int32 `protobuf:"varint,43,opt,name=replicas_updated,json=replicasUpdated,proto3" json:"replicas_updated,omitempty"` // Updated replicas from status.updatedReplicas - StrategyType string `protobuf:"bytes,44,opt,name=strategy_type,json=strategyType,proto3" json:"strategy_type,omitempty"` // Deployment strategy: "RollingUpdate", "Recreate" - Available bool `protobuf:"varint,45,opt,name=available,proto3" json:"available,omitempty"` // Deployment Available condition status - Progressing bool `protobuf:"varint,46,opt,name=progressing,proto3" json:"progressing,omitempty"` // Deployment Progressing condition status - DeploymentStatus string `protobuf:"bytes,47,opt,name=deployment_status,json=deploymentStatus,proto3" json:"deployment_status,omitempty"` // Overall status: "Available", "Progressing", "Failed" - Images []string `protobuf:"bytes,48,rep,name=images,proto3" json:"images,omitempty"` // Unique container images used - // StatefulSet-specific fields (reuses deployment replica fields 40-43) - ServiceName string `protobuf:"bytes,60,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Headless service name for StatefulSet - PodManagementPolicy string `protobuf:"bytes,61,opt,name=pod_management_policy,json=podManagementPolicy,proto3" json:"pod_management_policy,omitempty"` // "OrderedReady" or "Parallel" - UpdateStrategyType string `protobuf:"bytes,62,opt,name=update_strategy_type,json=updateStrategyType,proto3" json:"update_strategy_type,omitempty"` // "RollingUpdate" (StatefulSet strategy) - VolumeClaimTemplateCount int32 `protobuf:"varint,63,opt,name=volume_claim_template_count,json=volumeClaimTemplateCount,proto3" json:"volume_claim_template_count,omitempty"` // Number of persistent volume claim templates - PvcRetentionPolicy string `protobuf:"bytes,64,opt,name=pvc_retention_policy,json=pvcRetentionPolicy,proto3" json:"pvc_retention_policy,omitempty"` // "Retain" or "Delete" for PVC retention - CurrentRevision string `protobuf:"bytes,65,opt,name=current_revision,json=currentRevision,proto3" json:"current_revision,omitempty"` // Current StatefulSet revision - UpdateRevision string `protobuf:"bytes,66,opt,name=update_revision,json=updateRevision,proto3" json:"update_revision,omitempty"` // Update StatefulSet revision - // DaemonSet-specific fields (nodes instead of replicas) - NodesDesired int32 `protobuf:"varint,70,opt,name=nodes_desired,json=nodesDesired,proto3" json:"nodes_desired,omitempty"` // Desired nodes to schedule on (desiredNumberScheduled) - NodesReady int32 `protobuf:"varint,71,opt,name=nodes_ready,json=nodesReady,proto3" json:"nodes_ready,omitempty"` // Ready nodes (numberReady) - NodesAvailable int32 `protobuf:"varint,72,opt,name=nodes_available,json=nodesAvailable,proto3" json:"nodes_available,omitempty"` // Available nodes (numberAvailable) - NodesCurrent int32 `protobuf:"varint,73,opt,name=nodes_current,json=nodesCurrent,proto3" json:"nodes_current,omitempty"` // Currently scheduled nodes (currentNumberScheduled) - NodesUpdated int32 `protobuf:"varint,74,opt,name=nodes_updated,json=nodesUpdated,proto3" json:"nodes_updated,omitempty"` // Updated nodes (updatedNumberScheduled) - NodesMisscheduled int32 `protobuf:"varint,75,opt,name=nodes_misscheduled,json=nodesMisscheduled,proto3" json:"nodes_misscheduled,omitempty"` // Misscheduled nodes (numberMisscheduled) - MaxUnavailable string `protobuf:"bytes,76,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // RollingUpdate maxUnavailable setting - PriorityClass string `protobuf:"bytes,77,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name - // Job-specific fields - JobCompletionsDesired int32 `protobuf:"varint,80,opt,name=job_completions_desired,json=jobCompletionsDesired,proto3" json:"job_completions_desired,omitempty"` // Desired number of completions from spec.completions - JobCompletionsSucceeded int32 `protobuf:"varint,81,opt,name=job_completions_succeeded,json=jobCompletionsSucceeded,proto3" json:"job_completions_succeeded,omitempty"` // Number of succeeded pods from status.succeeded - JobParallelism int32 `protobuf:"varint,82,opt,name=job_parallelism,json=jobParallelism,proto3" json:"job_parallelism,omitempty"` // Maximum number of pods that can run in parallel - JobBackoffLimit int32 `protobuf:"varint,83,opt,name=job_backoff_limit,json=jobBackoffLimit,proto3" json:"job_backoff_limit,omitempty"` // Number of retries before marking job as failed - JobCompletionMode string `protobuf:"bytes,84,opt,name=job_completion_mode,json=jobCompletionMode,proto3" json:"job_completion_mode,omitempty"` // "NonIndexed" or "Indexed" - JobSuspended bool `protobuf:"varint,85,opt,name=job_suspended,json=jobSuspended,proto3" json:"job_suspended,omitempty"` // Whether the job is suspended - JobDuration string `protobuf:"bytes,86,opt,name=job_duration,json=jobDuration,proto3" json:"job_duration,omitempty"` // Duration from start to completion (or current time) - JobStatus string `protobuf:"bytes,87,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` // Overall job status: "Complete", "Failed", "Running", "Suspended" - JobActivePods int32 `protobuf:"varint,88,opt,name=job_active_pods,json=jobActivePods,proto3" json:"job_active_pods,omitempty"` // Number of actively running pods - JobFailedPods int32 `protobuf:"varint,89,opt,name=job_failed_pods,json=jobFailedPods,proto3" json:"job_failed_pods,omitempty"` // Number of failed pods - // CronJob-specific fields - CronSchedule string `protobuf:"bytes,90,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"` // Cron schedule expression (e.g., "0 */6 * * *") - CronSuspended bool `protobuf:"varint,91,opt,name=cron_suspended,json=cronSuspended,proto3" json:"cron_suspended,omitempty"` // Whether the cron job is suspended - CronActiveJobs int32 `protobuf:"varint,92,opt,name=cron_active_jobs,json=cronActiveJobs,proto3" json:"cron_active_jobs,omitempty"` // Number of currently active jobs - CronLastScheduleTime string `protobuf:"bytes,93,opt,name=cron_last_schedule_time,json=cronLastScheduleTime,proto3" json:"cron_last_schedule_time,omitempty"` // Last time the job was scheduled (RFC3339 format) - CronNextScheduleTime string `protobuf:"bytes,94,opt,name=cron_next_schedule_time,json=cronNextScheduleTime,proto3" json:"cron_next_schedule_time,omitempty"` // Next scheduled time (calculated, RFC3339 format) - CronConcurrencyPolicy string `protobuf:"bytes,95,opt,name=cron_concurrency_policy,json=cronConcurrencyPolicy,proto3" json:"cron_concurrency_policy,omitempty"` // "Allow", "Forbid", "Replace" - CronSuccessfulJobsLimit int32 `protobuf:"varint,96,opt,name=cron_successful_jobs_limit,json=cronSuccessfulJobsLimit,proto3" json:"cron_successful_jobs_limit,omitempty"` // Number of successful job history to retain - CronFailedJobsLimit int32 `protobuf:"varint,97,opt,name=cron_failed_jobs_limit,json=cronFailedJobsLimit,proto3" json:"cron_failed_jobs_limit,omitempty"` // Number of failed job history to retain - CronStartingDeadlineSeconds int32 `protobuf:"varint,98,opt,name=cron_starting_deadline_seconds,json=cronStartingDeadlineSeconds,proto3" json:"cron_starting_deadline_seconds,omitempty"` // Optional deadline in seconds for starting the job - // Service-specific fields - ServiceType string `protobuf:"bytes,100,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"` // Service type: "ClusterIP", "NodePort", "LoadBalancer", "ExternalName" - ServiceClusterIp string `protobuf:"bytes,101,opt,name=service_cluster_ip,json=serviceClusterIp,proto3" json:"service_cluster_ip,omitempty"` // Cluster IP address - ServiceExternalIps []string `protobuf:"bytes,102,rep,name=service_external_ips,json=serviceExternalIps,proto3" json:"service_external_ips,omitempty"` // External IP addresses (from spec or loadbalancer status) - ServicePorts []*ServicePort `protobuf:"bytes,103,rep,name=service_ports,json=servicePorts,proto3" json:"service_ports,omitempty"` // Service ports information - ServiceSelector map[string]string `protobuf:"bytes,104,rep,name=service_selector,json=serviceSelector,proto3" json:"service_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector labels - ServiceSessionAffinity string `protobuf:"bytes,105,opt,name=service_session_affinity,json=serviceSessionAffinity,proto3" json:"service_session_affinity,omitempty"` // Session affinity: "None" or "ClientIP" - ServiceExternalTrafficPolicy string `protobuf:"bytes,106,opt,name=service_external_traffic_policy,json=serviceExternalTrafficPolicy,proto3" json:"service_external_traffic_policy,omitempty"` // "Cluster" or "Local" - ServiceInternalTrafficPolicy string `protobuf:"bytes,107,opt,name=service_internal_traffic_policy,json=serviceInternalTrafficPolicy,proto3" json:"service_internal_traffic_policy,omitempty"` // "Cluster" or "Local" - ServiceLoadBalancerSourceRanges []string `protobuf:"bytes,108,rep,name=service_load_balancer_source_ranges,json=serviceLoadBalancerSourceRanges,proto3" json:"service_load_balancer_source_ranges,omitempty"` // LoadBalancer source ranges - ServiceLoadBalancerClass string `protobuf:"bytes,109,opt,name=service_load_balancer_class,json=serviceLoadBalancerClass,proto3" json:"service_load_balancer_class,omitempty"` // LoadBalancer class - ServiceIpFamilies []string `protobuf:"bytes,110,rep,name=service_ip_families,json=serviceIpFamilies,proto3" json:"service_ip_families,omitempty"` // IP families: ["IPv4"], ["IPv6"], or ["IPv4", "IPv6"] - ServiceIpFamilyPolicy string `protobuf:"bytes,111,opt,name=service_ip_family_policy,json=serviceIpFamilyPolicy,proto3" json:"service_ip_family_policy,omitempty"` // "SingleStack", "PreferDualStack", "RequireDualStack" - // Ingress-specific fields - IngressClassName string `protobuf:"bytes,120,opt,name=ingress_class_name,json=ingressClassName,proto3" json:"ingress_class_name,omitempty"` // Ingress class name (e.g., "nginx", "traefik") - IngressHosts []string `protobuf:"bytes,121,rep,name=ingress_hosts,json=ingressHosts,proto3" json:"ingress_hosts,omitempty"` // List of hosts served by this ingress - IngressPaths []string `protobuf:"bytes,122,rep,name=ingress_paths,json=ingressPaths,proto3" json:"ingress_paths,omitempty"` // List of paths served by this ingress - IngressBackends []string `protobuf:"bytes,123,rep,name=ingress_backends,json=ingressBackends,proto3" json:"ingress_backends,omitempty"` // List of backend services - IngressTlsHosts []string `protobuf:"bytes,124,rep,name=ingress_tls_hosts,json=ingressTlsHosts,proto3" json:"ingress_tls_hosts,omitempty"` // Hosts covered by TLS - IngressTlsSecrets []string `protobuf:"bytes,125,rep,name=ingress_tls_secrets,json=ingressTlsSecrets,proto3" json:"ingress_tls_secrets,omitempty"` // TLS secret names - IngressLoadBalancerIps []string `protobuf:"bytes,126,rep,name=ingress_load_balancer_ips,json=ingressLoadBalancerIps,proto3" json:"ingress_load_balancer_ips,omitempty"` // Load balancer IPs/hostnames from status - IngressRulesCount int32 `protobuf:"varint,127,opt,name=ingress_rules_count,json=ingressRulesCount,proto3" json:"ingress_rules_count,omitempty"` // Number of ingress rules - IngressTlsCount int32 `protobuf:"varint,128,opt,name=ingress_tls_count,json=ingressTlsCount,proto3" json:"ingress_tls_count,omitempty"` // Number of TLS configurations - IngressHasDefaultBackend bool `protobuf:"varint,129,opt,name=ingress_has_default_backend,json=ingressHasDefaultBackend,proto3" json:"ingress_has_default_backend,omitempty"` // Whether ingress has a default backend - // PersistentVolumeClaim-specific fields - PvcStorageClassName string `protobuf:"bytes,130,opt,name=pvc_storage_class_name,json=pvcStorageClassName,proto3" json:"pvc_storage_class_name,omitempty"` // Storage class name (e.g., "gp2", "fast-ssd") - PvcRequestedCapacity string `protobuf:"bytes,131,opt,name=pvc_requested_capacity,json=pvcRequestedCapacity,proto3" json:"pvc_requested_capacity,omitempty"` // Requested storage capacity (e.g., "50Gi") - PvcActualCapacity string `protobuf:"bytes,132,opt,name=pvc_actual_capacity,json=pvcActualCapacity,proto3" json:"pvc_actual_capacity,omitempty"` // Actual allocated capacity from status (e.g., "100Gi") - PvcAccessModes []string `protobuf:"bytes,133,rep,name=pvc_access_modes,json=pvcAccessModes,proto3" json:"pvc_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] - PvcVolumeMode string `protobuf:"bytes,134,opt,name=pvc_volume_mode,json=pvcVolumeMode,proto3" json:"pvc_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" - PvcVolumeName string `protobuf:"bytes,135,opt,name=pvc_volume_name,json=pvcVolumeName,proto3" json:"pvc_volume_name,omitempty"` // Bound persistent volume name - PvcStatus string `protobuf:"bytes,136,opt,name=pvc_status,json=pvcStatus,proto3" json:"pvc_status,omitempty"` // PVC status: "Pending", "Bound", "Lost" - PvcIsBound bool `protobuf:"varint,137,opt,name=pvc_is_bound,json=pvcIsBound,proto3" json:"pvc_is_bound,omitempty"` // Whether PVC is bound to a PV - PvcSelectorMatchLabels string `protobuf:"bytes,138,opt,name=pvc_selector_match_labels,json=pvcSelectorMatchLabels,proto3" json:"pvc_selector_match_labels,omitempty"` // Selector labels for PV binding (JSON string) - PvcAllowedTopologies []string `protobuf:"bytes,139,rep,name=pvc_allowed_topologies,json=pvcAllowedTopologies,proto3" json:"pvc_allowed_topologies,omitempty"` // Allowed node topologies - // PersistentVolume-specific fields - PvStorageClassName string `protobuf:"bytes,150,opt,name=pv_storage_class_name,json=pvStorageClassName,proto3" json:"pv_storage_class_name,omitempty"` // Storage class name (e.g., "standard-rwo", "fast-ssd") - PvCapacity string `protobuf:"bytes,151,opt,name=pv_capacity,json=pvCapacity,proto3" json:"pv_capacity,omitempty"` // Storage capacity (e.g., "5Gi") - PvAccessModes []string `protobuf:"bytes,152,rep,name=pv_access_modes,json=pvAccessModes,proto3" json:"pv_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] - PvReclaimPolicy string `protobuf:"bytes,153,opt,name=pv_reclaim_policy,json=pvReclaimPolicy,proto3" json:"pv_reclaim_policy,omitempty"` // Reclaim policy: "Retain", "Delete", "Recycle" - PvClaimRefName string `protobuf:"bytes,154,opt,name=pv_claim_ref_name,json=pvClaimRefName,proto3" json:"pv_claim_ref_name,omitempty"` // Referenced PVC name - PvClaimRefNamespace string `protobuf:"bytes,155,opt,name=pv_claim_ref_namespace,json=pvClaimRefNamespace,proto3" json:"pv_claim_ref_namespace,omitempty"` // Referenced PVC namespace - PvStatus string `protobuf:"bytes,156,opt,name=pv_status,json=pvStatus,proto3" json:"pv_status,omitempty"` // PV status: "Available", "Bound", "Released", "Failed" - PvIsBound bool `protobuf:"varint,157,opt,name=pv_is_bound,json=pvIsBound,proto3" json:"pv_is_bound,omitempty"` // Whether PV is bound to a PVC - PvVolumeMode string `protobuf:"bytes,158,opt,name=pv_volume_mode,json=pvVolumeMode,proto3" json:"pv_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" - PvCsiDriver string `protobuf:"bytes,159,opt,name=pv_csi_driver,json=pvCsiDriver,proto3" json:"pv_csi_driver,omitempty"` // CSI driver name (if using CSI) - PvVolumeSourceType string `protobuf:"bytes,160,opt,name=pv_volume_source_type,json=pvVolumeSourceType,proto3" json:"pv_volume_source_type,omitempty"` // Volume source type: "CSI", "HostPath", "NFS", "AWS EBS", etc. - PvNodeAffinityZones []string `protobuf:"bytes,161,rep,name=pv_node_affinity_zones,json=pvNodeAffinityZones,proto3" json:"pv_node_affinity_zones,omitempty"` // Node affinity zones/regions - // StorageClass-specific fields - ScProvisioner string `protobuf:"bytes,170,opt,name=sc_provisioner,json=scProvisioner,proto3" json:"sc_provisioner,omitempty"` // Storage provisioner (e.g., "kubernetes.io/aws-ebs", "pd.csi.storage.gke.io") - ScReclaimPolicy string `protobuf:"bytes,171,opt,name=sc_reclaim_policy,json=scReclaimPolicy,proto3" json:"sc_reclaim_policy,omitempty"` // Default reclaim policy: "Retain", "Delete" - ScVolumeBindingMode string `protobuf:"bytes,172,opt,name=sc_volume_binding_mode,json=scVolumeBindingMode,proto3" json:"sc_volume_binding_mode,omitempty"` // Volume binding mode: "Immediate", "WaitForFirstConsumer" - ScAllowVolumeExpansion bool `protobuf:"varint,173,opt,name=sc_allow_volume_expansion,json=scAllowVolumeExpansion,proto3" json:"sc_allow_volume_expansion,omitempty"` // Whether volume expansion is allowed - ScParameters map[string]string `protobuf:"bytes,174,rep,name=sc_parameters,json=scParameters,proto3" json:"sc_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters (type, encrypted, etc.) - ScAllowedTopologies []string `protobuf:"bytes,175,rep,name=sc_allowed_topologies,json=scAllowedTopologies,proto3" json:"sc_allowed_topologies,omitempty"` // Allowed topologies for volumes - ScMountOptions []string `protobuf:"bytes,176,rep,name=sc_mount_options,json=scMountOptions,proto3" json:"sc_mount_options,omitempty"` // Default mount options - // Namespace fields (name|status|age + additional) - NsStatus string `protobuf:"bytes,177,opt,name=ns_status,json=nsStatus,proto3" json:"ns_status,omitempty"` // Namespace status/phase: "Active", "Terminating" - NsFinalizers []string `protobuf:"bytes,178,rep,name=ns_finalizers,json=nsFinalizers,proto3" json:"ns_finalizers,omitempty"` // Finalizers preventing deletion - // Node fields (name|cpu|memory|ready|taints|roles|internal IP|external IP|version|age + additional) - NodeCpuCapacity string `protobuf:"bytes,179,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // CPU capacity (e.g., "16", "15890m") - NodeMemoryCapacity string `protobuf:"bytes,180,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Memory capacity (e.g., "64422188Ki") - NodeReady bool `protobuf:"varint,181,opt,name=node_ready,json=nodeReady,proto3" json:"node_ready,omitempty"` // Node ready status - NodeTaints []*NodeTaint `protobuf:"bytes,182,rep,name=node_taints,json=nodeTaints,proto3" json:"node_taints,omitempty"` // Node taints affecting scheduling - NodeRoles []string `protobuf:"bytes,183,rep,name=node_roles,json=nodeRoles,proto3" json:"node_roles,omitempty"` // Node roles (master, worker, etc.) - NodeInternalIp string `protobuf:"bytes,184,opt,name=node_internal_ip,json=nodeInternalIp,proto3" json:"node_internal_ip,omitempty"` // Internal IP address - NodeExternalIp string `protobuf:"bytes,185,opt,name=node_external_ip,json=nodeExternalIp,proto3" json:"node_external_ip,omitempty"` // External IP address (if any) - NodeVersion string `protobuf:"bytes,186,opt,name=node_version,json=nodeVersion,proto3" json:"node_version,omitempty"` // Kubelet version - NodeInstanceType string `protobuf:"bytes,187,opt,name=node_instance_type,json=nodeInstanceType,proto3" json:"node_instance_type,omitempty"` // Cloud instance type (e.g., "m5.xlarge") - NodeOs string `protobuf:"bytes,188,opt,name=node_os,json=nodeOs,proto3" json:"node_os,omitempty"` // Operating system - NodeContainerRuntime string `protobuf:"bytes,189,opt,name=node_container_runtime,json=nodeContainerRuntime,proto3" json:"node_container_runtime,omitempty"` // Container runtime version - NodeImageCount int32 `protobuf:"varint,190,opt,name=node_image_count,json=nodeImageCount,proto3" json:"node_image_count,omitempty"` // Number of container images - // HorizontalPodAutoscaler-specific fields - HpaMinReplicas int32 `protobuf:"varint,200,opt,name=hpa_min_replicas,json=hpaMinReplicas,proto3" json:"hpa_min_replicas,omitempty"` // Minimum replicas from spec.minReplicas - HpaMaxReplicas int32 `protobuf:"varint,201,opt,name=hpa_max_replicas,json=hpaMaxReplicas,proto3" json:"hpa_max_replicas,omitempty"` // Maximum replicas from spec.maxReplicas - HpaCurrentReplicas int32 `protobuf:"varint,202,opt,name=hpa_current_replicas,json=hpaCurrentReplicas,proto3" json:"hpa_current_replicas,omitempty"` // Current replicas from status.currentReplicas - HpaDesiredReplicas int32 `protobuf:"varint,203,opt,name=hpa_desired_replicas,json=hpaDesiredReplicas,proto3" json:"hpa_desired_replicas,omitempty"` // Desired replicas from status.desiredReplicas - HpaMetricsCount int32 `protobuf:"varint,204,opt,name=hpa_metrics_count,json=hpaMetricsCount,proto3" json:"hpa_metrics_count,omitempty"` // Number of metrics configured - HpaStatus string `protobuf:"bytes,205,opt,name=hpa_status,json=hpaStatus,proto3" json:"hpa_status,omitempty"` // HPA status: "Active", "Inactive", "Unknown" - HpaScaleUpStabilization int32 `protobuf:"varint,206,opt,name=hpa_scale_up_stabilization,json=hpaScaleUpStabilization,proto3" json:"hpa_scale_up_stabilization,omitempty"` // Scale up stabilization window seconds - HpaScaleDownStabilization int32 `protobuf:"varint,207,opt,name=hpa_scale_down_stabilization,json=hpaScaleDownStabilization,proto3" json:"hpa_scale_down_stabilization,omitempty"` // Scale down stabilization window seconds - // VerticalPodAutoscaler-specific fields - VpaUpdateMode string `protobuf:"bytes,210,opt,name=vpa_update_mode,json=vpaUpdateMode,proto3" json:"vpa_update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" - VpaPoliciesCount int32 `protobuf:"varint,211,opt,name=vpa_policies_count,json=vpaPoliciesCount,proto3" json:"vpa_policies_count,omitempty"` // Number of container policies configured - VpaRecommendationsCount int32 `protobuf:"varint,212,opt,name=vpa_recommendations_count,json=vpaRecommendationsCount,proto3" json:"vpa_recommendations_count,omitempty"` // Number of container recommendations available - VpaCpuTarget string `protobuf:"bytes,213,opt,name=vpa_cpu_target,json=vpaCpuTarget,proto3" json:"vpa_cpu_target,omitempty"` // CPU target recommendation (e.g., "100m") - VpaMemoryTarget string `protobuf:"bytes,214,opt,name=vpa_memory_target,json=vpaMemoryTarget,proto3" json:"vpa_memory_target,omitempty"` // Memory target recommendation (e.g., "128Mi") - VpaStatus string `protobuf:"bytes,215,opt,name=vpa_status,json=vpaStatus,proto3" json:"vpa_status,omitempty"` // VPA status: "Active", "No Recommendations" - // LimitRange-specific fields - LimitRangeItemsCount int32 `protobuf:"varint,220,opt,name=limit_range_items_count,json=limitRangeItemsCount,proto3" json:"limit_range_items_count,omitempty"` // Number of limit items configured - LimitRangeTypes []string `protobuf:"bytes,221,rep,name=limit_range_types,json=limitRangeTypes,proto3" json:"limit_range_types,omitempty"` // Types of limits: ["Container", "Pod", "PersistentVolumeClaim"] - LimitRangeHasDefaults bool `protobuf:"varint,222,opt,name=limit_range_has_defaults,json=limitRangeHasDefaults,proto3" json:"limit_range_has_defaults,omitempty"` // Whether default limits/requests are set - LimitRangeMaxCpu string `protobuf:"bytes,223,opt,name=limit_range_max_cpu,json=limitRangeMaxCpu,proto3" json:"limit_range_max_cpu,omitempty"` // Maximum CPU limit (e.g., "2") - LimitRangeMaxMemory string `protobuf:"bytes,224,opt,name=limit_range_max_memory,json=limitRangeMaxMemory,proto3" json:"limit_range_max_memory,omitempty"` // Maximum memory limit (e.g., "2Gi") - LimitRangeMinCpu string `protobuf:"bytes,225,opt,name=limit_range_min_cpu,json=limitRangeMinCpu,proto3" json:"limit_range_min_cpu,omitempty"` // Minimum CPU limit (e.g., "100m") - LimitRangeMinMemory string `protobuf:"bytes,226,opt,name=limit_range_min_memory,json=limitRangeMinMemory,proto3" json:"limit_range_min_memory,omitempty"` // Minimum memory limit (e.g., "64Mi") - LimitRangeDefaultCpuLimit string `protobuf:"bytes,227,opt,name=limit_range_default_cpu_limit,json=limitRangeDefaultCpuLimit,proto3" json:"limit_range_default_cpu_limit,omitempty"` // Default CPU limit (e.g., "500m") - LimitRangeDefaultMemoryLimit string `protobuf:"bytes,228,opt,name=limit_range_default_memory_limit,json=limitRangeDefaultMemoryLimit,proto3" json:"limit_range_default_memory_limit,omitempty"` // Default memory limit (e.g., "512Mi") - LimitRangeDefaultCpuRequest string `protobuf:"bytes,229,opt,name=limit_range_default_cpu_request,json=limitRangeDefaultCpuRequest,proto3" json:"limit_range_default_cpu_request,omitempty"` // Default CPU request (e.g., "200m") - LimitRangeDefaultMemoryRequest string `protobuf:"bytes,230,opt,name=limit_range_default_memory_request,json=limitRangeDefaultMemoryRequest,proto3" json:"limit_range_default_memory_request,omitempty"` // Default memory request (e.g., "256Mi") - LimitRangeStatus string `protobuf:"bytes,231,opt,name=limit_range_status,json=limitRangeStatus,proto3" json:"limit_range_status,omitempty"` // LimitRange status (always "Active") - ResourceVersion string `protobuf:"bytes,240,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Service account resource version - ApiVersion string `protobuf:"bytes,241,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + CpuSavingsMillicores float64 `protobuf:"fixed64,1,opt,name=cpu_savings_millicores,json=cpuSavingsMillicores,proto3" json:"cpu_savings_millicores,omitempty"` + CpuHighWaterMark float64 `protobuf:"fixed64,2,opt,name=cpu_high_water_mark,json=cpuHighWaterMark,proto3" json:"cpu_high_water_mark,omitempty"` + ActualCpuRequest float64 `protobuf:"fixed64,3,opt,name=actual_cpu_request,json=actualCpuRequest,proto3" json:"actual_cpu_request,omitempty"` + CumulativeCpuSavingsMillicores float64 `protobuf:"fixed64,4,opt,name=cumulative_cpu_savings_millicores,json=cumulativeCpuSavingsMillicores,proto3" json:"cumulative_cpu_savings_millicores,omitempty"` + CpuCostWithoutAutoscaler float64 `protobuf:"fixed64,5,opt,name=cpu_cost_without_autoscaler,json=cpuCostWithoutAutoscaler,proto3" json:"cpu_cost_without_autoscaler,omitempty"` // hypothetical cost w/ chart-level request + ActualCpuCost float64 `protobuf:"fixed64,6,opt,name=actual_cpu_cost,json=actualCpuCost,proto3" json:"actual_cpu_cost,omitempty"` // what you paid + CpuCostSavings float64 `protobuf:"fixed64,7,opt,name=cpu_cost_savings,json=cpuCostSavings,proto3" json:"cpu_cost_savings,omitempty"` // autoscaler impact (5 - 6) + CpuUsageCost float64 `protobuf:"fixed64,8,opt,name=cpu_usage_cost,json=cpuUsageCost,proto3" json:"cpu_usage_cost,omitempty"` // based on actual usage + CpuCostWaste float64 `protobuf:"fixed64,9,opt,name=cpu_cost_waste,json=cpuCostWaste,proto3" json:"cpu_cost_waste,omitempty"` // 6 - 8 } -func (x *ResourceDetails) Reset() { - *x = ResourceDetails{} +func (x *SavingsData) Reset() { + *x = SavingsData{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[26] + mi := &file_api_v1_common_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceDetails) String() string { +func (x *SavingsData) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceDetails) ProtoMessage() {} +func (*SavingsData) ProtoMessage() {} -func (x *ResourceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[26] +func (x *SavingsData) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4449,1483 +4730,2592 @@ func (x *ResourceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceDetails.ProtoReflect.Descriptor instead. -func (*ResourceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{26} +// Deprecated: Use SavingsData.ProtoReflect.Descriptor instead. +func (*SavingsData) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{25} } -func (m *ResourceDetails) GetDetails() isResourceDetails_Details { - if m != nil { - return m.Details +func (x *SavingsData) GetCpuSavingsMillicores() float64 { + if x != nil { + return x.CpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetPodDetails() *PodDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PodDetails); ok { - return x.PodDetails +func (x *SavingsData) GetCpuHighWaterMark() float64 { + if x != nil { + return x.CpuHighWaterMark } - return nil + return 0 } -func (x *ResourceDetails) GetDeploymentDetails() *DeploymentDetails { - if x, ok := x.GetDetails().(*ResourceDetails_DeploymentDetails); ok { - return x.DeploymentDetails +func (x *SavingsData) GetActualCpuRequest() float64 { + if x != nil { + return x.ActualCpuRequest } - return nil + return 0 } -func (x *ResourceDetails) GetStatefulSetDetails() *StatefulSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_StatefulSetDetails); ok { - return x.StatefulSetDetails +func (x *SavingsData) GetCumulativeCpuSavingsMillicores() float64 { + if x != nil { + return x.CumulativeCpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetDaemonSetDetails() *DaemonSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_DaemonSetDetails); ok { - return x.DaemonSetDetails +func (x *SavingsData) GetCpuCostWithoutAutoscaler() float64 { + if x != nil { + return x.CpuCostWithoutAutoscaler } - return nil + return 0 } -func (x *ResourceDetails) GetReplicaSetDetails() *ReplicaSetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ReplicaSetDetails); ok { - return x.ReplicaSetDetails +func (x *SavingsData) GetActualCpuCost() float64 { + if x != nil { + return x.ActualCpuCost } - return nil + return 0 } -func (x *ResourceDetails) GetJobDetails() *JobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_JobDetails); ok { - return x.JobDetails +func (x *SavingsData) GetCpuCostSavings() float64 { + if x != nil { + return x.CpuCostSavings } - return nil + return 0 } -func (x *ResourceDetails) GetCronJobDetails() *CronJobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_CronJobDetails); ok { - return x.CronJobDetails +func (x *SavingsData) GetCpuUsageCost() float64 { + if x != nil { + return x.CpuUsageCost } - return nil + return 0 } -func (x *ResourceDetails) GetServiceDetails() *ServiceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ServiceDetails); ok { - return x.ServiceDetails +func (x *SavingsData) GetCpuCostWaste() float64 { + if x != nil { + return x.CpuCostWaste } - return nil + return 0 } -func (x *ResourceDetails) GetIngressDetails() *IngressDetails { - if x, ok := x.GetDetails().(*ResourceDetails_IngressDetails); ok { - return x.IngressDetails - } - return nil -} +type SavingsDataPoint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetPvcDetails() *PersistentVolumeClaimDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PvcDetails); ok { - return x.PvcDetails - } - return nil + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + SavingsData *SavingsData `protobuf:"bytes,2,opt,name=savings_data,json=savingsData,proto3" json:"savings_data,omitempty"` } -func (x *ResourceDetails) GetPvDetails() *PersistentVolumeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PvDetails); ok { - return x.PvDetails +func (x *SavingsDataPoint) Reset() { + *x = SavingsDataPoint{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetScDetails() *StorageClassDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ScDetails); ok { - return x.ScDetails - } - return nil +func (x *SavingsDataPoint) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetNsDetails() *NamespaceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_NsDetails); ok { - return x.NsDetails +func (*SavingsDataPoint) ProtoMessage() {} + +func (x *SavingsDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ResourceDetails) GetNodeDetails() *NodeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_NodeDetails); ok { - return x.NodeDetails - } - return nil +// Deprecated: Use SavingsDataPoint.ProtoReflect.Descriptor instead. +func (*SavingsDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{26} } -func (x *ResourceDetails) GetHpaDetails() *HPADetails { - if x, ok := x.GetDetails().(*ResourceDetails_HpaDetails); ok { - return x.HpaDetails +func (x *SavingsDataPoint) GetTimestamp() int64 { + if x != nil { + return x.Timestamp } - return nil + return 0 } -func (x *ResourceDetails) GetVpaDetails() *VPADetails { - if x, ok := x.GetDetails().(*ResourceDetails_VpaDetails); ok { - return x.VpaDetails +func (x *SavingsDataPoint) GetSavingsData() *SavingsData { + if x != nil { + return x.SavingsData } return nil } -func (x *ResourceDetails) GetLimitRangeDetails() *LimitRangeDetails { - if x, ok := x.GetDetails().(*ResourceDetails_LimitRangeDetails); ok { - return x.LimitRangeDetails - } - return nil +type SavingsTimeSeries struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SavingsDatapoints []*SavingsDataPoint `protobuf:"bytes,1,rep,name=savings_datapoints,json=savingsDatapoints,proto3" json:"savings_datapoints,omitempty"` + TotalCpuSavingsMillicores float64 `protobuf:"fixed64,2,opt,name=total_cpu_savings_millicores,json=totalCpuSavingsMillicores,proto3" json:"total_cpu_savings_millicores,omitempty"` + TotalCpuCostSavings float64 `protobuf:"fixed64,3,opt,name=total_cpu_cost_savings,json=totalCpuCostSavings,proto3" json:"total_cpu_cost_savings,omitempty"` + TotalCpuCostWaste float64 `protobuf:"fixed64,4,opt,name=total_cpu_cost_waste,json=totalCpuCostWaste,proto3" json:"total_cpu_cost_waste,omitempty"` } -func (x *ResourceDetails) GetServiceAccountDetails() *ServiceAccountDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ServiceAccountDetails); ok { - return x.ServiceAccountDetails +func (x *SavingsTimeSeries) Reset() { + *x = SavingsTimeSeries{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetRoleDetails() *RoleDetails { - if x, ok := x.GetDetails().(*ResourceDetails_RoleDetails); ok { - return x.RoleDetails - } - return nil +func (x *SavingsTimeSeries) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetRoleBindingDetails() *RoleBindingDetails { - if x, ok := x.GetDetails().(*ResourceDetails_RoleBindingDetails); ok { - return x.RoleBindingDetails +func (*SavingsTimeSeries) ProtoMessage() {} + +func (x *SavingsTimeSeries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ResourceDetails) GetKedaScaledObjectDetails() *KedaScaledObjectDetails { - if x, ok := x.GetDetails().(*ResourceDetails_KedaScaledObjectDetails); ok { - return x.KedaScaledObjectDetails - } - return nil +// Deprecated: Use SavingsTimeSeries.ProtoReflect.Descriptor instead. +func (*SavingsTimeSeries) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{27} } -func (x *ResourceDetails) GetKarpenterResourceDetails() *KarpenterResourceDetails { - if x, ok := x.GetDetails().(*ResourceDetails_KarpenterResourceDetails); ok { - return x.KarpenterResourceDetails +func (x *SavingsTimeSeries) GetSavingsDatapoints() []*SavingsDataPoint { + if x != nil { + return x.SavingsDatapoints } return nil } -func (x *ResourceDetails) GetPodDisruptionBudgetDetails() *PodDisruptionBudgetDetails { - if x, ok := x.GetDetails().(*ResourceDetails_PodDisruptionBudgetDetails); ok { - return x.PodDisruptionBudgetDetails +func (x *SavingsTimeSeries) GetTotalCpuSavingsMillicores() float64 { + if x != nil { + return x.TotalCpuSavingsMillicores } - return nil + return 0 } -func (x *ResourceDetails) GetResourceQuotaDetails() *ResourceQuotaDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ResourceQuotaDetails); ok { - return x.ResourceQuotaDetails +func (x *SavingsTimeSeries) GetTotalCpuCostSavings() float64 { + if x != nil { + return x.TotalCpuCostSavings } - return nil + return 0 } -func (x *ResourceDetails) GetVolcanoJobDetails() *VolcanoJobDetails { - if x, ok := x.GetDetails().(*ResourceDetails_VolcanoJobDetails); ok { - return x.VolcanoJobDetails +func (x *SavingsTimeSeries) GetTotalCpuCostWaste() float64 { + if x != nil { + return x.TotalCpuCostWaste } - return nil + return 0 } -func (x *ResourceDetails) GetSparkApplicationDetails() *SparkApplicationDetails { - if x, ok := x.GetDetails().(*ResourceDetails_SparkApplicationDetails); ok { - return x.SparkApplicationDetails - } - return nil +// LabelSelectorRequirement is a selector that contains values, a key, and an operator that +// relates the key and values. +type LabelSelectorRequirement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // key is the label key that the selector applies to. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // operator represents a key's relationship to a set of values. + // Valid operators are In, NotIn, Exists and DoesNotExist, but the DevZero + // department and workload filter paths honor only In and NotIn (see the + // LabelSelectorOperator caveats above, PC-1452). + Operator LabelSelectorOperator `protobuf:"varint,2,opt,name=operator,proto3,enum=api.v1.LabelSelectorOperator" json:"operator,omitempty"` + // values is an array of string values. If the operator is In or NotIn, + // the values array must be non-empty. If the operator is Exists or DoesNotExist, + // the values array must be empty. This array is replaced during a strategic + // merge patch. + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` } -func (x *ResourceDetails) GetScheduledSparkApplicationDetails() *ScheduledSparkApplicationDetails { - if x, ok := x.GetDetails().(*ResourceDetails_ScheduledSparkApplicationDetails); ok { - return x.ScheduledSparkApplicationDetails +func (x *LabelSelectorRequirement) Reset() { + *x = LabelSelectorRequirement{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ResourceDetails) GetPhase() string { - if x != nil { - return x.Phase - } - return "" +func (x *LabelSelectorRequirement) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetPodIp() string { - if x != nil { - return x.PodIp +func (*LabelSelectorRequirement) ProtoMessage() {} + +func (x *LabelSelectorRequirement) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetHostIp() string { - if x != nil { - return x.HostIp - } - return "" +// Deprecated: Use LabelSelectorRequirement.ProtoReflect.Descriptor instead. +func (*LabelSelectorRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{28} } -func (x *ResourceDetails) GetNodeName() string { +func (x *LabelSelectorRequirement) GetKey() string { if x != nil { - return x.NodeName + return x.Key } return "" } -func (x *ResourceDetails) GetReady() bool { +func (x *LabelSelectorRequirement) GetOperator() LabelSelectorOperator { if x != nil { - return x.Ready + return x.Operator } - return false + return LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED } -func (x *ResourceDetails) GetQosClass() string { +func (x *LabelSelectorRequirement) GetValues() []string { if x != nil { - return x.QosClass + return x.Values } - return "" + return nil } -func (x *ResourceDetails) GetContainerCount() int32 { - if x != nil { - return x.ContainerCount - } - return 0 -} +type Label struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetRestartCount() int32 { - if x != nil { - return x.RestartCount - } - return 0 + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (x *ResourceDetails) GetCpuRequestsMillicores() int64 { - if x != nil { - return x.CpuRequestsMillicores +func (x *Label) Reset() { + *x = Label{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetMemoryRequestsBytes() int64 { - if x != nil { - return x.MemoryRequestsBytes - } - return 0 +func (x *Label) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetCpuLimitsMillicores() int64 { - if x != nil { - return x.CpuLimitsMillicores +func (*Label) ProtoMessage() {} + +func (x *Label) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *ResourceDetails) GetMemoryLimitsBytes() int64 { - if x != nil { - return x.MemoryLimitsBytes - } - return 0 +// Deprecated: Use Label.ProtoReflect.Descriptor instead. +func (*Label) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{29} } -func (x *ResourceDetails) GetStatusReason() string { +func (x *Label) GetKey() string { if x != nil { - return x.StatusReason + return x.Key } return "" } -func (x *ResourceDetails) GetControlledBy() string { - if x != nil { - return x.ControlledBy - } - return "" -} - -func (x *ResourceDetails) GetAge() string { +func (x *Label) GetValue() string { if x != nil { - return x.Age + return x.Value } return "" } -func (x *ResourceDetails) GetReplicasDesired() int32 { - if x != nil { - return x.ReplicasDesired - } - return 0 -} - -func (x *ResourceDetails) GetReplicasReady() int32 { - if x != nil { - return x.ReplicasReady - } - return 0 -} +// LabelSelector is a label query over a set of resources. The result of matchLabels and +// matchExpressions are ANDed. An empty label selector matches all objects. A null +// label selector matches no objects. +type LabelSelector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetReplicasAvailable() int32 { - if x != nil { - return x.ReplicasAvailable - } - return 0 + // Department-style labels for backwards compatibility + // + // Deprecated: Marked as deprecated in api/v1/common.proto. + Labels []*Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` // Deprecated: Label is still used for departments but we will soon migrate to match_label and match_expressions + // matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels + // map is equivalent to an element of matchExpressions, whose key field is "key", the + // operator is "In", and the values array contains only "value". The requirements are ANDed. + MatchLabels map[string]string `protobuf:"bytes,2,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // matchExpressions is a list of label selector requirements. The requirements are ANDed. + MatchExpressions []*LabelSelectorRequirement `protobuf:"bytes,3,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` } -func (x *ResourceDetails) GetReplicasUpdated() int32 { - if x != nil { - return x.ReplicasUpdated +func (x *LabelSelector) Reset() { + *x = LabelSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetStrategyType() string { - if x != nil { - return x.StrategyType - } - return "" +func (x *LabelSelector) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetAvailable() bool { - if x != nil { - return x.Available - } - return false -} +func (*LabelSelector) ProtoMessage() {} -func (x *ResourceDetails) GetProgressing() bool { - if x != nil { - return x.Progressing +func (x *LabelSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *ResourceDetails) GetDeploymentStatus() string { - if x != nil { - return x.DeploymentStatus - } - return "" +// Deprecated: Use LabelSelector.ProtoReflect.Descriptor instead. +func (*LabelSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{30} } -func (x *ResourceDetails) GetImages() []string { +// Deprecated: Marked as deprecated in api/v1/common.proto. +func (x *LabelSelector) GetLabels() []*Label { if x != nil { - return x.Images + return x.Labels } return nil } -func (x *ResourceDetails) GetServiceName() string { - if x != nil { - return x.ServiceName - } - return "" -} - -func (x *ResourceDetails) GetPodManagementPolicy() string { - if x != nil { - return x.PodManagementPolicy - } - return "" -} - -func (x *ResourceDetails) GetUpdateStrategyType() string { - if x != nil { - return x.UpdateStrategyType - } - return "" -} - -func (x *ResourceDetails) GetVolumeClaimTemplateCount() int32 { - if x != nil { - return x.VolumeClaimTemplateCount - } - return 0 -} - -func (x *ResourceDetails) GetPvcRetentionPolicy() string { - if x != nil { - return x.PvcRetentionPolicy - } - return "" -} - -func (x *ResourceDetails) GetCurrentRevision() string { +func (x *LabelSelector) GetMatchLabels() map[string]string { if x != nil { - return x.CurrentRevision + return x.MatchLabels } - return "" + return nil } -func (x *ResourceDetails) GetUpdateRevision() string { +func (x *LabelSelector) GetMatchExpressions() []*LabelSelectorRequirement { if x != nil { - return x.UpdateRevision + return x.MatchExpressions } - return "" + return nil } -func (x *ResourceDetails) GetNodesDesired() int32 { - if x != nil { - return x.NodesDesired - } - return 0 -} +// RegexPattern represents a regex pattern with optional flags +type RegexPattern struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetNodesReady() int32 { - if x != nil { - return x.NodesReady - } - return 0 + Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` + Flags string `protobuf:"bytes,2,opt,name=flags,proto3" json:"flags,omitempty"` // case-insensitive, etc. (optional) } -func (x *ResourceDetails) GetNodesAvailable() int32 { - if x != nil { - return x.NodesAvailable +func (x *RegexPattern) Reset() { + *x = RegexPattern{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ResourceDetails) GetNodesCurrent() int32 { - if x != nil { - return x.NodesCurrent - } - return 0 +func (x *RegexPattern) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetNodesUpdated() int32 { - if x != nil { - return x.NodesUpdated - } - return 0 -} +func (*RegexPattern) ProtoMessage() {} -func (x *ResourceDetails) GetNodesMisscheduled() int32 { - if x != nil { - return x.NodesMisscheduled +func (x *RegexPattern) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *ResourceDetails) GetMaxUnavailable() string { - if x != nil { - return x.MaxUnavailable - } - return "" +// Deprecated: Use RegexPattern.ProtoReflect.Descriptor instead. +func (*RegexPattern) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{31} } -func (x *ResourceDetails) GetPriorityClass() string { +func (x *RegexPattern) GetPattern() string { if x != nil { - return x.PriorityClass + return x.Pattern } return "" } -func (x *ResourceDetails) GetJobCompletionsDesired() int32 { - if x != nil { - return x.JobCompletionsDesired - } - return 0 -} - -func (x *ResourceDetails) GetJobCompletionsSucceeded() int32 { - if x != nil { - return x.JobCompletionsSucceeded - } - return 0 -} - -func (x *ResourceDetails) GetJobParallelism() int32 { - if x != nil { - return x.JobParallelism - } - return 0 -} - -func (x *ResourceDetails) GetJobBackoffLimit() int32 { - if x != nil { - return x.JobBackoffLimit - } - return 0 -} - -func (x *ResourceDetails) GetJobCompletionMode() string { +func (x *RegexPattern) GetFlags() string { if x != nil { - return x.JobCompletionMode + return x.Flags } return "" } -func (x *ResourceDetails) GetJobSuspended() bool { - if x != nil { - return x.JobSuspended - } - return false -} +// ResourceDetails contains resource-specific information flattened for easy frontend access +type ResourceDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetJobDuration() string { - if x != nil { - return x.JobDuration + // Types that are assignable to Details: + // + // *ResourceDetails_PodDetails + // *ResourceDetails_DeploymentDetails + // *ResourceDetails_StatefulSetDetails + // *ResourceDetails_DaemonSetDetails + // *ResourceDetails_ReplicaSetDetails + // *ResourceDetails_JobDetails + // *ResourceDetails_CronJobDetails + // *ResourceDetails_ServiceDetails + // *ResourceDetails_IngressDetails + // *ResourceDetails_PvcDetails + // *ResourceDetails_PvDetails + // *ResourceDetails_ScDetails + // *ResourceDetails_NsDetails + // *ResourceDetails_NodeDetails + // *ResourceDetails_HpaDetails + // *ResourceDetails_VpaDetails + // *ResourceDetails_LimitRangeDetails + // *ResourceDetails_ServiceAccountDetails + // *ResourceDetails_RoleDetails + // *ResourceDetails_RoleBindingDetails + // *ResourceDetails_KedaScaledObjectDetails + // *ResourceDetails_KarpenterResourceDetails + // *ResourceDetails_PodDisruptionBudgetDetails + // *ResourceDetails_ResourceQuotaDetails + // *ResourceDetails_VolcanoJobDetails + // *ResourceDetails_SparkApplicationDetails + // *ResourceDetails_ScheduledSparkApplicationDetails + // *ResourceDetails_KyvernoPolicyDetails + // *ResourceDetails_KyvernoPolicyReportDetails + // *ResourceDetails_GatekeeperConstraintTemplateDetails + // *ResourceDetails_GatekeeperConstraintDetails + 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 + Phase string `protobuf:"bytes,10,opt,name=phase,proto3" json:"phase,omitempty"` // Pod phase: "Running", "Pending", "Succeeded", "Failed", "Unknown" + PodIp string `protobuf:"bytes,11,opt,name=pod_ip,json=podIp,proto3" json:"pod_ip,omitempty"` // Pod IP from status.podIP + HostIp string `protobuf:"bytes,12,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` // Host IP from status.hostIP + NodeName string `protobuf:"bytes,13,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Node name where pod is scheduled + Ready bool `protobuf:"varint,14,opt,name=ready,proto3" json:"ready,omitempty"` // Pod ready status from conditions + QosClass string `protobuf:"bytes,15,opt,name=qos_class,json=qosClass,proto3" json:"qos_class,omitempty"` // Pod QoS class: "Guaranteed", "Burstable", "BestEffort" + ContainerCount int32 `protobuf:"varint,16,opt,name=container_count,json=containerCount,proto3" json:"container_count,omitempty"` // Number of containers in the pod + RestartCount int32 `protobuf:"varint,17,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Sum of all container restart counts + // Resource requests/limits from Pod spec (static declarations) + CpuRequestsMillicores int64 `protobuf:"varint,20,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // Sum of all container CPU requests in millicores + MemoryRequestsBytes int64 `protobuf:"varint,21,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Sum of all container memory requests in bytes + CpuLimitsMillicores int64 `protobuf:"varint,22,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // Sum of all container CPU limits in millicores + MemoryLimitsBytes int64 `protobuf:"varint,23,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Sum of all container memory limits in bytes + StatusReason string `protobuf:"bytes,30,opt,name=status_reason,json=statusReason,proto3" json:"status_reason,omitempty"` // Reason for current status (e.g., "ImagePullBackOff", "Completed") + ControlledBy string `protobuf:"bytes,31,opt,name=controlled_by,json=controlledBy,proto3" json:"controlled_by,omitempty"` // Friendly owner name (e.g., "deployment/my-app", "daemonset/logs") + Age string `protobuf:"bytes,32,opt,name=age,proto3" json:"age,omitempty"` // Human-readable age since creation (e.g., "2h", "5m", "10d") + // Deployment-specific fields (flattened for easy access) + ReplicasDesired int32 `protobuf:"varint,40,opt,name=replicas_desired,json=replicasDesired,proto3" json:"replicas_desired,omitempty"` // Desired replicas from spec.replicas + ReplicasReady int32 `protobuf:"varint,41,opt,name=replicas_ready,json=replicasReady,proto3" json:"replicas_ready,omitempty"` // Ready replicas from status.readyReplicas + ReplicasAvailable int32 `protobuf:"varint,42,opt,name=replicas_available,json=replicasAvailable,proto3" json:"replicas_available,omitempty"` // Available replicas from status.availableReplicas + ReplicasUpdated int32 `protobuf:"varint,43,opt,name=replicas_updated,json=replicasUpdated,proto3" json:"replicas_updated,omitempty"` // Updated replicas from status.updatedReplicas + StrategyType string `protobuf:"bytes,44,opt,name=strategy_type,json=strategyType,proto3" json:"strategy_type,omitempty"` // Deployment strategy: "RollingUpdate", "Recreate" + Available bool `protobuf:"varint,45,opt,name=available,proto3" json:"available,omitempty"` // Deployment Available condition status + Progressing bool `protobuf:"varint,46,opt,name=progressing,proto3" json:"progressing,omitempty"` // Deployment Progressing condition status + DeploymentStatus string `protobuf:"bytes,47,opt,name=deployment_status,json=deploymentStatus,proto3" json:"deployment_status,omitempty"` // Overall status: "Available", "Progressing", "Failed" + Images []string `protobuf:"bytes,48,rep,name=images,proto3" json:"images,omitempty"` // Unique container images used + // StatefulSet-specific fields (reuses deployment replica fields 40-43) + ServiceName string `protobuf:"bytes,60,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Headless service name for StatefulSet + PodManagementPolicy string `protobuf:"bytes,61,opt,name=pod_management_policy,json=podManagementPolicy,proto3" json:"pod_management_policy,omitempty"` // "OrderedReady" or "Parallel" + UpdateStrategyType string `protobuf:"bytes,62,opt,name=update_strategy_type,json=updateStrategyType,proto3" json:"update_strategy_type,omitempty"` // "RollingUpdate" (StatefulSet strategy) + VolumeClaimTemplateCount int32 `protobuf:"varint,63,opt,name=volume_claim_template_count,json=volumeClaimTemplateCount,proto3" json:"volume_claim_template_count,omitempty"` // Number of persistent volume claim templates + PvcRetentionPolicy string `protobuf:"bytes,64,opt,name=pvc_retention_policy,json=pvcRetentionPolicy,proto3" json:"pvc_retention_policy,omitempty"` // "Retain" or "Delete" for PVC retention + CurrentRevision string `protobuf:"bytes,65,opt,name=current_revision,json=currentRevision,proto3" json:"current_revision,omitempty"` // Current StatefulSet revision + UpdateRevision string `protobuf:"bytes,66,opt,name=update_revision,json=updateRevision,proto3" json:"update_revision,omitempty"` // Update StatefulSet revision + // DaemonSet-specific fields (nodes instead of replicas) + NodesDesired int32 `protobuf:"varint,70,opt,name=nodes_desired,json=nodesDesired,proto3" json:"nodes_desired,omitempty"` // Desired nodes to schedule on (desiredNumberScheduled) + NodesReady int32 `protobuf:"varint,71,opt,name=nodes_ready,json=nodesReady,proto3" json:"nodes_ready,omitempty"` // Ready nodes (numberReady) + NodesAvailable int32 `protobuf:"varint,72,opt,name=nodes_available,json=nodesAvailable,proto3" json:"nodes_available,omitempty"` // Available nodes (numberAvailable) + NodesCurrent int32 `protobuf:"varint,73,opt,name=nodes_current,json=nodesCurrent,proto3" json:"nodes_current,omitempty"` // Currently scheduled nodes (currentNumberScheduled) + NodesUpdated int32 `protobuf:"varint,74,opt,name=nodes_updated,json=nodesUpdated,proto3" json:"nodes_updated,omitempty"` // Updated nodes (updatedNumberScheduled) + NodesMisscheduled int32 `protobuf:"varint,75,opt,name=nodes_misscheduled,json=nodesMisscheduled,proto3" json:"nodes_misscheduled,omitempty"` // Misscheduled nodes (numberMisscheduled) + MaxUnavailable string `protobuf:"bytes,76,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // RollingUpdate maxUnavailable setting + PriorityClass string `protobuf:"bytes,77,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name + // Job-specific fields + JobCompletionsDesired int32 `protobuf:"varint,80,opt,name=job_completions_desired,json=jobCompletionsDesired,proto3" json:"job_completions_desired,omitempty"` // Desired number of completions from spec.completions + JobCompletionsSucceeded int32 `protobuf:"varint,81,opt,name=job_completions_succeeded,json=jobCompletionsSucceeded,proto3" json:"job_completions_succeeded,omitempty"` // Number of succeeded pods from status.succeeded + JobParallelism int32 `protobuf:"varint,82,opt,name=job_parallelism,json=jobParallelism,proto3" json:"job_parallelism,omitempty"` // Maximum number of pods that can run in parallel + JobBackoffLimit int32 `protobuf:"varint,83,opt,name=job_backoff_limit,json=jobBackoffLimit,proto3" json:"job_backoff_limit,omitempty"` // Number of retries before marking job as failed + JobCompletionMode string `protobuf:"bytes,84,opt,name=job_completion_mode,json=jobCompletionMode,proto3" json:"job_completion_mode,omitempty"` // "NonIndexed" or "Indexed" + JobSuspended bool `protobuf:"varint,85,opt,name=job_suspended,json=jobSuspended,proto3" json:"job_suspended,omitempty"` // Whether the job is suspended + JobDuration string `protobuf:"bytes,86,opt,name=job_duration,json=jobDuration,proto3" json:"job_duration,omitempty"` // Duration from start to completion (or current time) + JobStatus string `protobuf:"bytes,87,opt,name=job_status,json=jobStatus,proto3" json:"job_status,omitempty"` // Overall job status: "Complete", "Failed", "Running", "Suspended" + JobActivePods int32 `protobuf:"varint,88,opt,name=job_active_pods,json=jobActivePods,proto3" json:"job_active_pods,omitempty"` // Number of actively running pods + JobFailedPods int32 `protobuf:"varint,89,opt,name=job_failed_pods,json=jobFailedPods,proto3" json:"job_failed_pods,omitempty"` // Number of failed pods + // CronJob-specific fields + CronSchedule string `protobuf:"bytes,90,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"` // Cron schedule expression (e.g., "0 */6 * * *") + CronSuspended bool `protobuf:"varint,91,opt,name=cron_suspended,json=cronSuspended,proto3" json:"cron_suspended,omitempty"` // Whether the cron job is suspended + CronActiveJobs int32 `protobuf:"varint,92,opt,name=cron_active_jobs,json=cronActiveJobs,proto3" json:"cron_active_jobs,omitempty"` // Number of currently active jobs + CronLastScheduleTime string `protobuf:"bytes,93,opt,name=cron_last_schedule_time,json=cronLastScheduleTime,proto3" json:"cron_last_schedule_time,omitempty"` // Last time the job was scheduled (RFC3339 format) + CronNextScheduleTime string `protobuf:"bytes,94,opt,name=cron_next_schedule_time,json=cronNextScheduleTime,proto3" json:"cron_next_schedule_time,omitempty"` // Next scheduled time (calculated, RFC3339 format) + CronConcurrencyPolicy string `protobuf:"bytes,95,opt,name=cron_concurrency_policy,json=cronConcurrencyPolicy,proto3" json:"cron_concurrency_policy,omitempty"` // "Allow", "Forbid", "Replace" + CronSuccessfulJobsLimit int32 `protobuf:"varint,96,opt,name=cron_successful_jobs_limit,json=cronSuccessfulJobsLimit,proto3" json:"cron_successful_jobs_limit,omitempty"` // Number of successful job history to retain + CronFailedJobsLimit int32 `protobuf:"varint,97,opt,name=cron_failed_jobs_limit,json=cronFailedJobsLimit,proto3" json:"cron_failed_jobs_limit,omitempty"` // Number of failed job history to retain + CronStartingDeadlineSeconds int32 `protobuf:"varint,98,opt,name=cron_starting_deadline_seconds,json=cronStartingDeadlineSeconds,proto3" json:"cron_starting_deadline_seconds,omitempty"` // Optional deadline in seconds for starting the job + // Service-specific fields + ServiceType string `protobuf:"bytes,100,opt,name=service_type,json=serviceType,proto3" json:"service_type,omitempty"` // Service type: "ClusterIP", "NodePort", "LoadBalancer", "ExternalName" + ServiceClusterIp string `protobuf:"bytes,101,opt,name=service_cluster_ip,json=serviceClusterIp,proto3" json:"service_cluster_ip,omitempty"` // Cluster IP address + ServiceExternalIps []string `protobuf:"bytes,102,rep,name=service_external_ips,json=serviceExternalIps,proto3" json:"service_external_ips,omitempty"` // External IP addresses (from spec or loadbalancer status) + ServicePorts []*ServicePort `protobuf:"bytes,103,rep,name=service_ports,json=servicePorts,proto3" json:"service_ports,omitempty"` // Service ports information + ServiceSelector map[string]string `protobuf:"bytes,104,rep,name=service_selector,json=serviceSelector,proto3" json:"service_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector labels + ServiceSessionAffinity string `protobuf:"bytes,105,opt,name=service_session_affinity,json=serviceSessionAffinity,proto3" json:"service_session_affinity,omitempty"` // Session affinity: "None" or "ClientIP" + ServiceExternalTrafficPolicy string `protobuf:"bytes,106,opt,name=service_external_traffic_policy,json=serviceExternalTrafficPolicy,proto3" json:"service_external_traffic_policy,omitempty"` // "Cluster" or "Local" + ServiceInternalTrafficPolicy string `protobuf:"bytes,107,opt,name=service_internal_traffic_policy,json=serviceInternalTrafficPolicy,proto3" json:"service_internal_traffic_policy,omitempty"` // "Cluster" or "Local" + ServiceLoadBalancerSourceRanges []string `protobuf:"bytes,108,rep,name=service_load_balancer_source_ranges,json=serviceLoadBalancerSourceRanges,proto3" json:"service_load_balancer_source_ranges,omitempty"` // LoadBalancer source ranges + ServiceLoadBalancerClass string `protobuf:"bytes,109,opt,name=service_load_balancer_class,json=serviceLoadBalancerClass,proto3" json:"service_load_balancer_class,omitempty"` // LoadBalancer class + ServiceIpFamilies []string `protobuf:"bytes,110,rep,name=service_ip_families,json=serviceIpFamilies,proto3" json:"service_ip_families,omitempty"` // IP families: ["IPv4"], ["IPv6"], or ["IPv4", "IPv6"] + ServiceIpFamilyPolicy string `protobuf:"bytes,111,opt,name=service_ip_family_policy,json=serviceIpFamilyPolicy,proto3" json:"service_ip_family_policy,omitempty"` // "SingleStack", "PreferDualStack", "RequireDualStack" + // Ingress-specific fields + IngressClassName string `protobuf:"bytes,120,opt,name=ingress_class_name,json=ingressClassName,proto3" json:"ingress_class_name,omitempty"` // Ingress class name (e.g., "nginx", "traefik") + IngressHosts []string `protobuf:"bytes,121,rep,name=ingress_hosts,json=ingressHosts,proto3" json:"ingress_hosts,omitempty"` // List of hosts served by this ingress + IngressPaths []string `protobuf:"bytes,122,rep,name=ingress_paths,json=ingressPaths,proto3" json:"ingress_paths,omitempty"` // List of paths served by this ingress + IngressBackends []string `protobuf:"bytes,123,rep,name=ingress_backends,json=ingressBackends,proto3" json:"ingress_backends,omitempty"` // List of backend services + IngressTlsHosts []string `protobuf:"bytes,124,rep,name=ingress_tls_hosts,json=ingressTlsHosts,proto3" json:"ingress_tls_hosts,omitempty"` // Hosts covered by TLS + IngressTlsSecrets []string `protobuf:"bytes,125,rep,name=ingress_tls_secrets,json=ingressTlsSecrets,proto3" json:"ingress_tls_secrets,omitempty"` // TLS secret names + IngressLoadBalancerIps []string `protobuf:"bytes,126,rep,name=ingress_load_balancer_ips,json=ingressLoadBalancerIps,proto3" json:"ingress_load_balancer_ips,omitempty"` // Load balancer IPs/hostnames from status + IngressRulesCount int32 `protobuf:"varint,127,opt,name=ingress_rules_count,json=ingressRulesCount,proto3" json:"ingress_rules_count,omitempty"` // Number of ingress rules + IngressTlsCount int32 `protobuf:"varint,128,opt,name=ingress_tls_count,json=ingressTlsCount,proto3" json:"ingress_tls_count,omitempty"` // Number of TLS configurations + IngressHasDefaultBackend bool `protobuf:"varint,129,opt,name=ingress_has_default_backend,json=ingressHasDefaultBackend,proto3" json:"ingress_has_default_backend,omitempty"` // Whether ingress has a default backend + // PersistentVolumeClaim-specific fields + PvcStorageClassName string `protobuf:"bytes,130,opt,name=pvc_storage_class_name,json=pvcStorageClassName,proto3" json:"pvc_storage_class_name,omitempty"` // Storage class name (e.g., "gp2", "fast-ssd") + PvcRequestedCapacity string `protobuf:"bytes,131,opt,name=pvc_requested_capacity,json=pvcRequestedCapacity,proto3" json:"pvc_requested_capacity,omitempty"` // Requested storage capacity (e.g., "50Gi") + PvcActualCapacity string `protobuf:"bytes,132,opt,name=pvc_actual_capacity,json=pvcActualCapacity,proto3" json:"pvc_actual_capacity,omitempty"` // Actual allocated capacity from status (e.g., "100Gi") + PvcAccessModes []string `protobuf:"bytes,133,rep,name=pvc_access_modes,json=pvcAccessModes,proto3" json:"pvc_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] + PvcVolumeMode string `protobuf:"bytes,134,opt,name=pvc_volume_mode,json=pvcVolumeMode,proto3" json:"pvc_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" + PvcVolumeName string `protobuf:"bytes,135,opt,name=pvc_volume_name,json=pvcVolumeName,proto3" json:"pvc_volume_name,omitempty"` // Bound persistent volume name + PvcStatus string `protobuf:"bytes,136,opt,name=pvc_status,json=pvcStatus,proto3" json:"pvc_status,omitempty"` // PVC status: "Pending", "Bound", "Lost" + PvcIsBound bool `protobuf:"varint,137,opt,name=pvc_is_bound,json=pvcIsBound,proto3" json:"pvc_is_bound,omitempty"` // Whether PVC is bound to a PV + PvcSelectorMatchLabels string `protobuf:"bytes,138,opt,name=pvc_selector_match_labels,json=pvcSelectorMatchLabels,proto3" json:"pvc_selector_match_labels,omitempty"` // Selector labels for PV binding (JSON string) + PvcAllowedTopologies []string `protobuf:"bytes,139,rep,name=pvc_allowed_topologies,json=pvcAllowedTopologies,proto3" json:"pvc_allowed_topologies,omitempty"` // Allowed node topologies + // PersistentVolume-specific fields + PvStorageClassName string `protobuf:"bytes,150,opt,name=pv_storage_class_name,json=pvStorageClassName,proto3" json:"pv_storage_class_name,omitempty"` // Storage class name (e.g., "standard-rwo", "fast-ssd") + PvCapacity string `protobuf:"bytes,151,opt,name=pv_capacity,json=pvCapacity,proto3" json:"pv_capacity,omitempty"` // Storage capacity (e.g., "5Gi") + PvAccessModes []string `protobuf:"bytes,152,rep,name=pv_access_modes,json=pvAccessModes,proto3" json:"pv_access_modes,omitempty"` // Access modes: ["ReadWriteOnce", "ReadOnlyMany", "ReadWriteMany"] + PvReclaimPolicy string `protobuf:"bytes,153,opt,name=pv_reclaim_policy,json=pvReclaimPolicy,proto3" json:"pv_reclaim_policy,omitempty"` // Reclaim policy: "Retain", "Delete", "Recycle" + PvClaimRefName string `protobuf:"bytes,154,opt,name=pv_claim_ref_name,json=pvClaimRefName,proto3" json:"pv_claim_ref_name,omitempty"` // Referenced PVC name + PvClaimRefNamespace string `protobuf:"bytes,155,opt,name=pv_claim_ref_namespace,json=pvClaimRefNamespace,proto3" json:"pv_claim_ref_namespace,omitempty"` // Referenced PVC namespace + PvStatus string `protobuf:"bytes,156,opt,name=pv_status,json=pvStatus,proto3" json:"pv_status,omitempty"` // PV status: "Available", "Bound", "Released", "Failed" + PvIsBound bool `protobuf:"varint,157,opt,name=pv_is_bound,json=pvIsBound,proto3" json:"pv_is_bound,omitempty"` // Whether PV is bound to a PVC + PvVolumeMode string `protobuf:"bytes,158,opt,name=pv_volume_mode,json=pvVolumeMode,proto3" json:"pv_volume_mode,omitempty"` // Volume mode: "Filesystem" or "Block" + PvCsiDriver string `protobuf:"bytes,159,opt,name=pv_csi_driver,json=pvCsiDriver,proto3" json:"pv_csi_driver,omitempty"` // CSI driver name (if using CSI) + PvVolumeSourceType string `protobuf:"bytes,160,opt,name=pv_volume_source_type,json=pvVolumeSourceType,proto3" json:"pv_volume_source_type,omitempty"` // Volume source type: "CSI", "HostPath", "NFS", "AWS EBS", etc. + PvNodeAffinityZones []string `protobuf:"bytes,161,rep,name=pv_node_affinity_zones,json=pvNodeAffinityZones,proto3" json:"pv_node_affinity_zones,omitempty"` // Node affinity zones/regions + // StorageClass-specific fields + ScProvisioner string `protobuf:"bytes,170,opt,name=sc_provisioner,json=scProvisioner,proto3" json:"sc_provisioner,omitempty"` // Storage provisioner (e.g., "kubernetes.io/aws-ebs", "pd.csi.storage.gke.io") + ScReclaimPolicy string `protobuf:"bytes,171,opt,name=sc_reclaim_policy,json=scReclaimPolicy,proto3" json:"sc_reclaim_policy,omitempty"` // Default reclaim policy: "Retain", "Delete" + ScVolumeBindingMode string `protobuf:"bytes,172,opt,name=sc_volume_binding_mode,json=scVolumeBindingMode,proto3" json:"sc_volume_binding_mode,omitempty"` // Volume binding mode: "Immediate", "WaitForFirstConsumer" + ScAllowVolumeExpansion bool `protobuf:"varint,173,opt,name=sc_allow_volume_expansion,json=scAllowVolumeExpansion,proto3" json:"sc_allow_volume_expansion,omitempty"` // Whether volume expansion is allowed + ScParameters map[string]string `protobuf:"bytes,174,rep,name=sc_parameters,json=scParameters,proto3" json:"sc_parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters (type, encrypted, etc.) + ScAllowedTopologies []string `protobuf:"bytes,175,rep,name=sc_allowed_topologies,json=scAllowedTopologies,proto3" json:"sc_allowed_topologies,omitempty"` // Allowed topologies for volumes + ScMountOptions []string `protobuf:"bytes,176,rep,name=sc_mount_options,json=scMountOptions,proto3" json:"sc_mount_options,omitempty"` // Default mount options + // Namespace fields (name|status|age + additional) + NsStatus string `protobuf:"bytes,177,opt,name=ns_status,json=nsStatus,proto3" json:"ns_status,omitempty"` // Namespace status/phase: "Active", "Terminating" + NsFinalizers []string `protobuf:"bytes,178,rep,name=ns_finalizers,json=nsFinalizers,proto3" json:"ns_finalizers,omitempty"` // Finalizers preventing deletion + // Node fields (name|cpu|memory|ready|taints|roles|internal IP|external IP|version|age + additional) + NodeCpuCapacity string `protobuf:"bytes,179,opt,name=node_cpu_capacity,json=nodeCpuCapacity,proto3" json:"node_cpu_capacity,omitempty"` // CPU capacity (e.g., "16", "15890m") + NodeMemoryCapacity string `protobuf:"bytes,180,opt,name=node_memory_capacity,json=nodeMemoryCapacity,proto3" json:"node_memory_capacity,omitempty"` // Memory capacity (e.g., "64422188Ki") + NodeReady bool `protobuf:"varint,181,opt,name=node_ready,json=nodeReady,proto3" json:"node_ready,omitempty"` // Node ready status + NodeTaints []*NodeTaint `protobuf:"bytes,182,rep,name=node_taints,json=nodeTaints,proto3" json:"node_taints,omitempty"` // Node taints affecting scheduling + NodeRoles []string `protobuf:"bytes,183,rep,name=node_roles,json=nodeRoles,proto3" json:"node_roles,omitempty"` // Node roles (master, worker, etc.) + NodeInternalIp string `protobuf:"bytes,184,opt,name=node_internal_ip,json=nodeInternalIp,proto3" json:"node_internal_ip,omitempty"` // Internal IP address + NodeExternalIp string `protobuf:"bytes,185,opt,name=node_external_ip,json=nodeExternalIp,proto3" json:"node_external_ip,omitempty"` // External IP address (if any) + NodeVersion string `protobuf:"bytes,186,opt,name=node_version,json=nodeVersion,proto3" json:"node_version,omitempty"` // Kubelet version + NodeInstanceType string `protobuf:"bytes,187,opt,name=node_instance_type,json=nodeInstanceType,proto3" json:"node_instance_type,omitempty"` // Cloud instance type (e.g., "m5.xlarge") + NodeOs string `protobuf:"bytes,188,opt,name=node_os,json=nodeOs,proto3" json:"node_os,omitempty"` // Operating system + NodeContainerRuntime string `protobuf:"bytes,189,opt,name=node_container_runtime,json=nodeContainerRuntime,proto3" json:"node_container_runtime,omitempty"` // Container runtime version + NodeImageCount int32 `protobuf:"varint,190,opt,name=node_image_count,json=nodeImageCount,proto3" json:"node_image_count,omitempty"` // Number of container images + // HorizontalPodAutoscaler-specific fields + HpaMinReplicas int32 `protobuf:"varint,200,opt,name=hpa_min_replicas,json=hpaMinReplicas,proto3" json:"hpa_min_replicas,omitempty"` // Minimum replicas from spec.minReplicas + HpaMaxReplicas int32 `protobuf:"varint,201,opt,name=hpa_max_replicas,json=hpaMaxReplicas,proto3" json:"hpa_max_replicas,omitempty"` // Maximum replicas from spec.maxReplicas + HpaCurrentReplicas int32 `protobuf:"varint,202,opt,name=hpa_current_replicas,json=hpaCurrentReplicas,proto3" json:"hpa_current_replicas,omitempty"` // Current replicas from status.currentReplicas + HpaDesiredReplicas int32 `protobuf:"varint,203,opt,name=hpa_desired_replicas,json=hpaDesiredReplicas,proto3" json:"hpa_desired_replicas,omitempty"` // Desired replicas from status.desiredReplicas + HpaMetricsCount int32 `protobuf:"varint,204,opt,name=hpa_metrics_count,json=hpaMetricsCount,proto3" json:"hpa_metrics_count,omitempty"` // Number of metrics configured + HpaStatus string `protobuf:"bytes,205,opt,name=hpa_status,json=hpaStatus,proto3" json:"hpa_status,omitempty"` // HPA status: "Active", "Inactive", "Unknown" + HpaScaleUpStabilization int32 `protobuf:"varint,206,opt,name=hpa_scale_up_stabilization,json=hpaScaleUpStabilization,proto3" json:"hpa_scale_up_stabilization,omitempty"` // Scale up stabilization window seconds + HpaScaleDownStabilization int32 `protobuf:"varint,207,opt,name=hpa_scale_down_stabilization,json=hpaScaleDownStabilization,proto3" json:"hpa_scale_down_stabilization,omitempty"` // Scale down stabilization window seconds + // VerticalPodAutoscaler-specific fields + VpaUpdateMode string `protobuf:"bytes,210,opt,name=vpa_update_mode,json=vpaUpdateMode,proto3" json:"vpa_update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" + VpaPoliciesCount int32 `protobuf:"varint,211,opt,name=vpa_policies_count,json=vpaPoliciesCount,proto3" json:"vpa_policies_count,omitempty"` // Number of container policies configured + VpaRecommendationsCount int32 `protobuf:"varint,212,opt,name=vpa_recommendations_count,json=vpaRecommendationsCount,proto3" json:"vpa_recommendations_count,omitempty"` // Number of container recommendations available + VpaCpuTarget string `protobuf:"bytes,213,opt,name=vpa_cpu_target,json=vpaCpuTarget,proto3" json:"vpa_cpu_target,omitempty"` // CPU target recommendation (e.g., "100m") + VpaMemoryTarget string `protobuf:"bytes,214,opt,name=vpa_memory_target,json=vpaMemoryTarget,proto3" json:"vpa_memory_target,omitempty"` // Memory target recommendation (e.g., "128Mi") + VpaStatus string `protobuf:"bytes,215,opt,name=vpa_status,json=vpaStatus,proto3" json:"vpa_status,omitempty"` // VPA status: "Active", "No Recommendations" + // LimitRange-specific fields + LimitRangeItemsCount int32 `protobuf:"varint,220,opt,name=limit_range_items_count,json=limitRangeItemsCount,proto3" json:"limit_range_items_count,omitempty"` // Number of limit items configured + LimitRangeTypes []string `protobuf:"bytes,221,rep,name=limit_range_types,json=limitRangeTypes,proto3" json:"limit_range_types,omitempty"` // Types of limits: ["Container", "Pod", "PersistentVolumeClaim"] + LimitRangeHasDefaults bool `protobuf:"varint,222,opt,name=limit_range_has_defaults,json=limitRangeHasDefaults,proto3" json:"limit_range_has_defaults,omitempty"` // Whether default limits/requests are set + LimitRangeMaxCpu string `protobuf:"bytes,223,opt,name=limit_range_max_cpu,json=limitRangeMaxCpu,proto3" json:"limit_range_max_cpu,omitempty"` // Maximum CPU limit (e.g., "2") + LimitRangeMaxMemory string `protobuf:"bytes,224,opt,name=limit_range_max_memory,json=limitRangeMaxMemory,proto3" json:"limit_range_max_memory,omitempty"` // Maximum memory limit (e.g., "2Gi") + LimitRangeMinCpu string `protobuf:"bytes,225,opt,name=limit_range_min_cpu,json=limitRangeMinCpu,proto3" json:"limit_range_min_cpu,omitempty"` // Minimum CPU limit (e.g., "100m") + LimitRangeMinMemory string `protobuf:"bytes,226,opt,name=limit_range_min_memory,json=limitRangeMinMemory,proto3" json:"limit_range_min_memory,omitempty"` // Minimum memory limit (e.g., "64Mi") + LimitRangeDefaultCpuLimit string `protobuf:"bytes,227,opt,name=limit_range_default_cpu_limit,json=limitRangeDefaultCpuLimit,proto3" json:"limit_range_default_cpu_limit,omitempty"` // Default CPU limit (e.g., "500m") + LimitRangeDefaultMemoryLimit string `protobuf:"bytes,228,opt,name=limit_range_default_memory_limit,json=limitRangeDefaultMemoryLimit,proto3" json:"limit_range_default_memory_limit,omitempty"` // Default memory limit (e.g., "512Mi") + LimitRangeDefaultCpuRequest string `protobuf:"bytes,229,opt,name=limit_range_default_cpu_request,json=limitRangeDefaultCpuRequest,proto3" json:"limit_range_default_cpu_request,omitempty"` // Default CPU request (e.g., "200m") + LimitRangeDefaultMemoryRequest string `protobuf:"bytes,230,opt,name=limit_range_default_memory_request,json=limitRangeDefaultMemoryRequest,proto3" json:"limit_range_default_memory_request,omitempty"` // Default memory request (e.g., "256Mi") + LimitRangeStatus string `protobuf:"bytes,231,opt,name=limit_range_status,json=limitRangeStatus,proto3" json:"limit_range_status,omitempty"` // LimitRange status (always "Active") + ResourceVersion string `protobuf:"bytes,240,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Service account resource version + ApiVersion string `protobuf:"bytes,241,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version +} + +func (x *ResourceDetails) Reset() { + *x = ResourceDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourceDetails) ProtoMessage() {} + +func (x *ResourceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[32] + 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 ResourceDetails.ProtoReflect.Descriptor instead. +func (*ResourceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{32} +} + +func (m *ResourceDetails) GetDetails() isResourceDetails_Details { + if m != nil { + return m.Details + } + return nil +} + +func (x *ResourceDetails) GetPodDetails() *PodDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PodDetails); ok { + return x.PodDetails + } + return nil +} + +func (x *ResourceDetails) GetDeploymentDetails() *DeploymentDetails { + if x, ok := x.GetDetails().(*ResourceDetails_DeploymentDetails); ok { + return x.DeploymentDetails + } + return nil +} + +func (x *ResourceDetails) GetStatefulSetDetails() *StatefulSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_StatefulSetDetails); ok { + return x.StatefulSetDetails + } + return nil +} + +func (x *ResourceDetails) GetDaemonSetDetails() *DaemonSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_DaemonSetDetails); ok { + return x.DaemonSetDetails + } + return nil +} + +func (x *ResourceDetails) GetReplicaSetDetails() *ReplicaSetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ReplicaSetDetails); ok { + return x.ReplicaSetDetails + } + return nil +} + +func (x *ResourceDetails) GetJobDetails() *JobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_JobDetails); ok { + return x.JobDetails + } + return nil +} + +func (x *ResourceDetails) GetCronJobDetails() *CronJobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_CronJobDetails); ok { + return x.CronJobDetails + } + return nil +} + +func (x *ResourceDetails) GetServiceDetails() *ServiceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ServiceDetails); ok { + return x.ServiceDetails + } + return nil +} + +func (x *ResourceDetails) GetIngressDetails() *IngressDetails { + if x, ok := x.GetDetails().(*ResourceDetails_IngressDetails); ok { + return x.IngressDetails + } + return nil +} + +func (x *ResourceDetails) GetPvcDetails() *PersistentVolumeClaimDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PvcDetails); ok { + return x.PvcDetails + } + return nil +} + +func (x *ResourceDetails) GetPvDetails() *PersistentVolumeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PvDetails); ok { + return x.PvDetails + } + return nil +} + +func (x *ResourceDetails) GetScDetails() *StorageClassDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ScDetails); ok { + return x.ScDetails + } + return nil +} + +func (x *ResourceDetails) GetNsDetails() *NamespaceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_NsDetails); ok { + return x.NsDetails + } + return nil +} + +func (x *ResourceDetails) GetNodeDetails() *NodeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_NodeDetails); ok { + return x.NodeDetails + } + return nil +} + +func (x *ResourceDetails) GetHpaDetails() *HPADetails { + if x, ok := x.GetDetails().(*ResourceDetails_HpaDetails); ok { + return x.HpaDetails + } + return nil +} + +func (x *ResourceDetails) GetVpaDetails() *VPADetails { + if x, ok := x.GetDetails().(*ResourceDetails_VpaDetails); ok { + return x.VpaDetails + } + return nil +} + +func (x *ResourceDetails) GetLimitRangeDetails() *LimitRangeDetails { + if x, ok := x.GetDetails().(*ResourceDetails_LimitRangeDetails); ok { + return x.LimitRangeDetails + } + return nil +} + +func (x *ResourceDetails) GetServiceAccountDetails() *ServiceAccountDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ServiceAccountDetails); ok { + return x.ServiceAccountDetails + } + return nil +} + +func (x *ResourceDetails) GetRoleDetails() *RoleDetails { + if x, ok := x.GetDetails().(*ResourceDetails_RoleDetails); ok { + return x.RoleDetails + } + return nil +} + +func (x *ResourceDetails) GetRoleBindingDetails() *RoleBindingDetails { + if x, ok := x.GetDetails().(*ResourceDetails_RoleBindingDetails); ok { + return x.RoleBindingDetails + } + return nil +} + +func (x *ResourceDetails) GetKedaScaledObjectDetails() *KedaScaledObjectDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KedaScaledObjectDetails); ok { + return x.KedaScaledObjectDetails + } + return nil +} + +func (x *ResourceDetails) GetKarpenterResourceDetails() *KarpenterResourceDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KarpenterResourceDetails); ok { + return x.KarpenterResourceDetails + } + return nil +} + +func (x *ResourceDetails) GetPodDisruptionBudgetDetails() *PodDisruptionBudgetDetails { + if x, ok := x.GetDetails().(*ResourceDetails_PodDisruptionBudgetDetails); ok { + return x.PodDisruptionBudgetDetails + } + return nil +} + +func (x *ResourceDetails) GetResourceQuotaDetails() *ResourceQuotaDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ResourceQuotaDetails); ok { + return x.ResourceQuotaDetails + } + return nil +} + +func (x *ResourceDetails) GetVolcanoJobDetails() *VolcanoJobDetails { + if x, ok := x.GetDetails().(*ResourceDetails_VolcanoJobDetails); ok { + return x.VolcanoJobDetails + } + return nil +} + +func (x *ResourceDetails) GetSparkApplicationDetails() *SparkApplicationDetails { + if x, ok := x.GetDetails().(*ResourceDetails_SparkApplicationDetails); ok { + return x.SparkApplicationDetails + } + return nil +} + +func (x *ResourceDetails) GetScheduledSparkApplicationDetails() *ScheduledSparkApplicationDetails { + if x, ok := x.GetDetails().(*ResourceDetails_ScheduledSparkApplicationDetails); ok { + return x.ScheduledSparkApplicationDetails + } + return nil +} + +func (x *ResourceDetails) GetKyvernoPolicyDetails() *KyvernoPolicyDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KyvernoPolicyDetails); ok { + return x.KyvernoPolicyDetails + } + return nil +} + +func (x *ResourceDetails) GetKyvernoPolicyReportDetails() *KyvernoPolicyReportDetails { + if x, ok := x.GetDetails().(*ResourceDetails_KyvernoPolicyReportDetails); ok { + return x.KyvernoPolicyReportDetails + } + return nil +} + +func (x *ResourceDetails) GetGatekeeperConstraintTemplateDetails() *GatekeeperConstraintTemplateDetails { + if x, ok := x.GetDetails().(*ResourceDetails_GatekeeperConstraintTemplateDetails); ok { + return x.GatekeeperConstraintTemplateDetails + } + return nil +} + +func (x *ResourceDetails) GetGatekeeperConstraintDetails() *GatekeeperConstraintDetails { + if x, ok := x.GetDetails().(*ResourceDetails_GatekeeperConstraintDetails); ok { + return x.GatekeeperConstraintDetails + } + return nil +} + +func (x *ResourceDetails) GetPhase() string { + if x != nil { + return x.Phase + } + return "" +} + +func (x *ResourceDetails) GetPodIp() string { + if x != nil { + return x.PodIp + } + return "" +} + +func (x *ResourceDetails) GetHostIp() string { + if x != nil { + return x.HostIp + } + return "" +} + +func (x *ResourceDetails) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *ResourceDetails) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +func (x *ResourceDetails) GetQosClass() string { + if x != nil { + return x.QosClass + } + return "" +} + +func (x *ResourceDetails) GetContainerCount() int32 { + if x != nil { + return x.ContainerCount + } + return 0 +} + +func (x *ResourceDetails) GetRestartCount() int32 { + if x != nil { + return x.RestartCount + } + return 0 +} + +func (x *ResourceDetails) GetCpuRequestsMillicores() int64 { + if x != nil { + return x.CpuRequestsMillicores + } + return 0 +} + +func (x *ResourceDetails) GetMemoryRequestsBytes() int64 { + if x != nil { + return x.MemoryRequestsBytes + } + return 0 +} + +func (x *ResourceDetails) GetCpuLimitsMillicores() int64 { + if x != nil { + return x.CpuLimitsMillicores + } + return 0 +} + +func (x *ResourceDetails) GetMemoryLimitsBytes() int64 { + if x != nil { + return x.MemoryLimitsBytes + } + return 0 +} + +func (x *ResourceDetails) GetStatusReason() string { + if x != nil { + return x.StatusReason + } + return "" +} + +func (x *ResourceDetails) GetControlledBy() string { + if x != nil { + return x.ControlledBy + } + return "" +} + +func (x *ResourceDetails) GetAge() string { + if x != nil { + return x.Age + } + return "" +} + +func (x *ResourceDetails) GetReplicasDesired() int32 { + if x != nil { + return x.ReplicasDesired + } + return 0 +} + +func (x *ResourceDetails) GetReplicasReady() int32 { + if x != nil { + return x.ReplicasReady + } + return 0 +} + +func (x *ResourceDetails) GetReplicasAvailable() int32 { + if x != nil { + return x.ReplicasAvailable + } + return 0 +} + +func (x *ResourceDetails) GetReplicasUpdated() int32 { + if x != nil { + return x.ReplicasUpdated + } + return 0 +} + +func (x *ResourceDetails) GetStrategyType() string { + if x != nil { + return x.StrategyType + } + return "" +} + +func (x *ResourceDetails) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *ResourceDetails) GetProgressing() bool { + if x != nil { + return x.Progressing + } + return false +} + +func (x *ResourceDetails) GetDeploymentStatus() string { + if x != nil { + return x.DeploymentStatus + } + return "" +} + +func (x *ResourceDetails) GetImages() []string { + if x != nil { + return x.Images + } + return nil +} + +func (x *ResourceDetails) GetServiceName() string { + if x != nil { + return x.ServiceName + } + return "" +} + +func (x *ResourceDetails) GetPodManagementPolicy() string { + if x != nil { + return x.PodManagementPolicy + } + return "" +} + +func (x *ResourceDetails) GetUpdateStrategyType() string { + if x != nil { + return x.UpdateStrategyType + } + return "" +} + +func (x *ResourceDetails) GetVolumeClaimTemplateCount() int32 { + if x != nil { + return x.VolumeClaimTemplateCount + } + return 0 +} + +func (x *ResourceDetails) GetPvcRetentionPolicy() string { + if x != nil { + return x.PvcRetentionPolicy + } + return "" +} + +func (x *ResourceDetails) GetCurrentRevision() string { + if x != nil { + return x.CurrentRevision + } + return "" +} + +func (x *ResourceDetails) GetUpdateRevision() string { + if x != nil { + return x.UpdateRevision + } + return "" +} + +func (x *ResourceDetails) GetNodesDesired() int32 { + if x != nil { + return x.NodesDesired + } + return 0 +} + +func (x *ResourceDetails) GetNodesReady() int32 { + if x != nil { + return x.NodesReady + } + return 0 +} + +func (x *ResourceDetails) GetNodesAvailable() int32 { + if x != nil { + return x.NodesAvailable + } + return 0 +} + +func (x *ResourceDetails) GetNodesCurrent() int32 { + if x != nil { + return x.NodesCurrent + } + return 0 +} + +func (x *ResourceDetails) GetNodesUpdated() int32 { + if x != nil { + return x.NodesUpdated + } + return 0 +} + +func (x *ResourceDetails) GetNodesMisscheduled() int32 { + if x != nil { + return x.NodesMisscheduled + } + return 0 +} + +func (x *ResourceDetails) GetMaxUnavailable() string { + if x != nil { + return x.MaxUnavailable + } + return "" +} + +func (x *ResourceDetails) GetPriorityClass() string { + if x != nil { + return x.PriorityClass + } + return "" +} + +func (x *ResourceDetails) GetJobCompletionsDesired() int32 { + if x != nil { + return x.JobCompletionsDesired + } + return 0 +} + +func (x *ResourceDetails) GetJobCompletionsSucceeded() int32 { + if x != nil { + return x.JobCompletionsSucceeded + } + return 0 +} + +func (x *ResourceDetails) GetJobParallelism() int32 { + if x != nil { + return x.JobParallelism + } + return 0 +} + +func (x *ResourceDetails) GetJobBackoffLimit() int32 { + if x != nil { + return x.JobBackoffLimit + } + return 0 +} + +func (x *ResourceDetails) GetJobCompletionMode() string { + if x != nil { + return x.JobCompletionMode + } + return "" +} + +func (x *ResourceDetails) GetJobSuspended() bool { + if x != nil { + return x.JobSuspended + } + return false +} + +func (x *ResourceDetails) GetJobDuration() string { + if x != nil { + return x.JobDuration + } + return "" +} + +func (x *ResourceDetails) GetJobStatus() string { + if x != nil { + return x.JobStatus + } + return "" +} + +func (x *ResourceDetails) GetJobActivePods() int32 { + if x != nil { + return x.JobActivePods + } + return 0 +} + +func (x *ResourceDetails) GetJobFailedPods() int32 { + if x != nil { + return x.JobFailedPods + } + return 0 +} + +func (x *ResourceDetails) GetCronSchedule() string { + if x != nil { + return x.CronSchedule + } + return "" +} + +func (x *ResourceDetails) GetCronSuspended() bool { + if x != nil { + return x.CronSuspended + } + return false +} + +func (x *ResourceDetails) GetCronActiveJobs() int32 { + if x != nil { + return x.CronActiveJobs + } + return 0 +} + +func (x *ResourceDetails) GetCronLastScheduleTime() string { + if x != nil { + return x.CronLastScheduleTime + } + return "" +} + +func (x *ResourceDetails) GetCronNextScheduleTime() string { + if x != nil { + return x.CronNextScheduleTime + } + return "" +} + +func (x *ResourceDetails) GetCronConcurrencyPolicy() string { + if x != nil { + return x.CronConcurrencyPolicy + } + return "" +} + +func (x *ResourceDetails) GetCronSuccessfulJobsLimit() int32 { + if x != nil { + return x.CronSuccessfulJobsLimit + } + return 0 +} + +func (x *ResourceDetails) GetCronFailedJobsLimit() int32 { + if x != nil { + return x.CronFailedJobsLimit + } + return 0 +} + +func (x *ResourceDetails) GetCronStartingDeadlineSeconds() int32 { + if x != nil { + return x.CronStartingDeadlineSeconds + } + return 0 +} + +func (x *ResourceDetails) GetServiceType() string { + if x != nil { + return x.ServiceType + } + return "" +} + +func (x *ResourceDetails) GetServiceClusterIp() string { + if x != nil { + return x.ServiceClusterIp + } + return "" +} + +func (x *ResourceDetails) GetServiceExternalIps() []string { + if x != nil { + return x.ServiceExternalIps + } + return nil +} + +func (x *ResourceDetails) GetServicePorts() []*ServicePort { + if x != nil { + return x.ServicePorts + } + return nil +} + +func (x *ResourceDetails) GetServiceSelector() map[string]string { + if x != nil { + return x.ServiceSelector + } + return nil +} + +func (x *ResourceDetails) GetServiceSessionAffinity() string { + if x != nil { + return x.ServiceSessionAffinity + } + return "" +} + +func (x *ResourceDetails) GetServiceExternalTrafficPolicy() string { + if x != nil { + return x.ServiceExternalTrafficPolicy + } + return "" +} + +func (x *ResourceDetails) GetServiceInternalTrafficPolicy() string { + if x != nil { + return x.ServiceInternalTrafficPolicy + } + return "" +} + +func (x *ResourceDetails) GetServiceLoadBalancerSourceRanges() []string { + if x != nil { + return x.ServiceLoadBalancerSourceRanges + } + return nil +} + +func (x *ResourceDetails) GetServiceLoadBalancerClass() string { + if x != nil { + return x.ServiceLoadBalancerClass + } + return "" +} + +func (x *ResourceDetails) GetServiceIpFamilies() []string { + if x != nil { + return x.ServiceIpFamilies + } + return nil +} + +func (x *ResourceDetails) GetServiceIpFamilyPolicy() string { + if x != nil { + return x.ServiceIpFamilyPolicy + } + return "" +} + +func (x *ResourceDetails) GetIngressClassName() string { + if x != nil { + return x.IngressClassName + } + return "" +} + +func (x *ResourceDetails) GetIngressHosts() []string { + if x != nil { + return x.IngressHosts + } + return nil +} + +func (x *ResourceDetails) GetIngressPaths() []string { + if x != nil { + return x.IngressPaths + } + return nil +} + +func (x *ResourceDetails) GetIngressBackends() []string { + if x != nil { + return x.IngressBackends + } + return nil +} + +func (x *ResourceDetails) GetIngressTlsHosts() []string { + if x != nil { + return x.IngressTlsHosts + } + return nil +} + +func (x *ResourceDetails) GetIngressTlsSecrets() []string { + if x != nil { + return x.IngressTlsSecrets + } + return nil +} + +func (x *ResourceDetails) GetIngressLoadBalancerIps() []string { + if x != nil { + return x.IngressLoadBalancerIps + } + return nil +} + +func (x *ResourceDetails) GetIngressRulesCount() int32 { + if x != nil { + return x.IngressRulesCount + } + return 0 +} + +func (x *ResourceDetails) GetIngressTlsCount() int32 { + if x != nil { + return x.IngressTlsCount + } + return 0 +} + +func (x *ResourceDetails) GetIngressHasDefaultBackend() bool { + if x != nil { + return x.IngressHasDefaultBackend + } + return false +} + +func (x *ResourceDetails) GetPvcStorageClassName() string { + if x != nil { + return x.PvcStorageClassName + } + return "" +} + +func (x *ResourceDetails) GetPvcRequestedCapacity() string { + if x != nil { + return x.PvcRequestedCapacity } return "" } -func (x *ResourceDetails) GetJobStatus() string { +func (x *ResourceDetails) GetPvcActualCapacity() string { if x != nil { - return x.JobStatus + return x.PvcActualCapacity } return "" } -func (x *ResourceDetails) GetJobActivePods() int32 { +func (x *ResourceDetails) GetPvcAccessModes() []string { if x != nil { - return x.JobActivePods + return x.PvcAccessModes } - return 0 + return nil } -func (x *ResourceDetails) GetJobFailedPods() int32 { +func (x *ResourceDetails) GetPvcVolumeMode() string { if x != nil { - return x.JobFailedPods + return x.PvcVolumeMode } - return 0 + return "" } -func (x *ResourceDetails) GetCronSchedule() string { +func (x *ResourceDetails) GetPvcVolumeName() string { if x != nil { - return x.CronSchedule + return x.PvcVolumeName } return "" } -func (x *ResourceDetails) GetCronSuspended() bool { +func (x *ResourceDetails) GetPvcStatus() string { if x != nil { - return x.CronSuspended + return x.PvcStatus } - return false + return "" } -func (x *ResourceDetails) GetCronActiveJobs() int32 { +func (x *ResourceDetails) GetPvcIsBound() bool { if x != nil { - return x.CronActiveJobs + return x.PvcIsBound } - return 0 + return false } -func (x *ResourceDetails) GetCronLastScheduleTime() string { +func (x *ResourceDetails) GetPvcSelectorMatchLabels() string { if x != nil { - return x.CronLastScheduleTime + return x.PvcSelectorMatchLabels } return "" } -func (x *ResourceDetails) GetCronNextScheduleTime() string { +func (x *ResourceDetails) GetPvcAllowedTopologies() []string { if x != nil { - return x.CronNextScheduleTime + return x.PvcAllowedTopologies + } + return nil +} + +func (x *ResourceDetails) GetPvStorageClassName() string { + if x != nil { + return x.PvStorageClassName } return "" } -func (x *ResourceDetails) GetCronConcurrencyPolicy() string { +func (x *ResourceDetails) GetPvCapacity() string { if x != nil { - return x.CronConcurrencyPolicy + return x.PvCapacity } return "" } -func (x *ResourceDetails) GetCronSuccessfulJobsLimit() int32 { +func (x *ResourceDetails) GetPvAccessModes() []string { if x != nil { - return x.CronSuccessfulJobsLimit + return x.PvAccessModes } - return 0 + return nil } -func (x *ResourceDetails) GetCronFailedJobsLimit() int32 { +func (x *ResourceDetails) GetPvReclaimPolicy() string { if x != nil { - return x.CronFailedJobsLimit + return x.PvReclaimPolicy } - return 0 + return "" } -func (x *ResourceDetails) GetCronStartingDeadlineSeconds() int32 { +func (x *ResourceDetails) GetPvClaimRefName() string { if x != nil { - return x.CronStartingDeadlineSeconds + return x.PvClaimRefName } - return 0 + return "" } -func (x *ResourceDetails) GetServiceType() string { +func (x *ResourceDetails) GetPvClaimRefNamespace() string { if x != nil { - return x.ServiceType + return x.PvClaimRefNamespace } return "" } -func (x *ResourceDetails) GetServiceClusterIp() string { +func (x *ResourceDetails) GetPvStatus() string { if x != nil { - return x.ServiceClusterIp + return x.PvStatus } return "" } -func (x *ResourceDetails) GetServiceExternalIps() []string { +func (x *ResourceDetails) GetPvIsBound() bool { if x != nil { - return x.ServiceExternalIps + return x.PvIsBound } - return nil + return false } -func (x *ResourceDetails) GetServicePorts() []*ServicePort { +func (x *ResourceDetails) GetPvVolumeMode() string { if x != nil { - return x.ServicePorts + return x.PvVolumeMode } - return nil + return "" } -func (x *ResourceDetails) GetServiceSelector() map[string]string { +func (x *ResourceDetails) GetPvCsiDriver() string { if x != nil { - return x.ServiceSelector + return x.PvCsiDriver + } + return "" +} + +func (x *ResourceDetails) GetPvVolumeSourceType() string { + if x != nil { + return x.PvVolumeSourceType + } + return "" +} + +func (x *ResourceDetails) GetPvNodeAffinityZones() []string { + if x != nil { + return x.PvNodeAffinityZones } return nil } -func (x *ResourceDetails) GetServiceSessionAffinity() string { +func (x *ResourceDetails) GetScProvisioner() string { if x != nil { - return x.ServiceSessionAffinity + return x.ScProvisioner } return "" } -func (x *ResourceDetails) GetServiceExternalTrafficPolicy() string { +func (x *ResourceDetails) GetScReclaimPolicy() string { if x != nil { - return x.ServiceExternalTrafficPolicy + return x.ScReclaimPolicy } return "" } -func (x *ResourceDetails) GetServiceInternalTrafficPolicy() string { +func (x *ResourceDetails) GetScVolumeBindingMode() string { if x != nil { - return x.ServiceInternalTrafficPolicy + return x.ScVolumeBindingMode } return "" } -func (x *ResourceDetails) GetServiceLoadBalancerSourceRanges() []string { +func (x *ResourceDetails) GetScAllowVolumeExpansion() bool { if x != nil { - return x.ServiceLoadBalancerSourceRanges + return x.ScAllowVolumeExpansion + } + return false +} + +func (x *ResourceDetails) GetScParameters() map[string]string { + if x != nil { + return x.ScParameters } return nil } -func (x *ResourceDetails) GetServiceLoadBalancerClass() string { +func (x *ResourceDetails) GetScAllowedTopologies() []string { if x != nil { - return x.ServiceLoadBalancerClass + return x.ScAllowedTopologies + } + return nil +} + +func (x *ResourceDetails) GetScMountOptions() []string { + if x != nil { + return x.ScMountOptions + } + return nil +} + +func (x *ResourceDetails) GetNsStatus() string { + if x != nil { + return x.NsStatus } return "" } -func (x *ResourceDetails) GetServiceIpFamilies() []string { +func (x *ResourceDetails) GetNsFinalizers() []string { if x != nil { - return x.ServiceIpFamilies + return x.NsFinalizers } return nil } -func (x *ResourceDetails) GetServiceIpFamilyPolicy() string { +func (x *ResourceDetails) GetNodeCpuCapacity() string { if x != nil { - return x.ServiceIpFamilyPolicy + return x.NodeCpuCapacity } return "" } -func (x *ResourceDetails) GetIngressClassName() string { +func (x *ResourceDetails) GetNodeMemoryCapacity() string { if x != nil { - return x.IngressClassName + return x.NodeMemoryCapacity } return "" } -func (x *ResourceDetails) GetIngressHosts() []string { +func (x *ResourceDetails) GetNodeReady() bool { if x != nil { - return x.IngressHosts + return x.NodeReady } - return nil + return false } -func (x *ResourceDetails) GetIngressPaths() []string { +func (x *ResourceDetails) GetNodeTaints() []*NodeTaint { if x != nil { - return x.IngressPaths + return x.NodeTaints } return nil } -func (x *ResourceDetails) GetIngressBackends() []string { +func (x *ResourceDetails) GetNodeRoles() []string { if x != nil { - return x.IngressBackends + return x.NodeRoles } return nil } -func (x *ResourceDetails) GetIngressTlsHosts() []string { +func (x *ResourceDetails) GetNodeInternalIp() string { if x != nil { - return x.IngressTlsHosts + return x.NodeInternalIp } - return nil + return "" } -func (x *ResourceDetails) GetIngressTlsSecrets() []string { +func (x *ResourceDetails) GetNodeExternalIp() string { if x != nil { - return x.IngressTlsSecrets + return x.NodeExternalIp } - return nil + return "" } -func (x *ResourceDetails) GetIngressLoadBalancerIps() []string { +func (x *ResourceDetails) GetNodeVersion() string { if x != nil { - return x.IngressLoadBalancerIps + return x.NodeVersion } - return nil + return "" } -func (x *ResourceDetails) GetIngressRulesCount() int32 { +func (x *ResourceDetails) GetNodeInstanceType() string { if x != nil { - return x.IngressRulesCount + return x.NodeInstanceType + } + return "" +} + +func (x *ResourceDetails) GetNodeOs() string { + if x != nil { + return x.NodeOs + } + return "" +} + +func (x *ResourceDetails) GetNodeContainerRuntime() string { + if x != nil { + return x.NodeContainerRuntime + } + return "" +} + +func (x *ResourceDetails) GetNodeImageCount() int32 { + if x != nil { + return x.NodeImageCount } return 0 } -func (x *ResourceDetails) GetIngressTlsCount() int32 { +func (x *ResourceDetails) GetHpaMinReplicas() int32 { if x != nil { - return x.IngressTlsCount + return x.HpaMinReplicas } return 0 } -func (x *ResourceDetails) GetIngressHasDefaultBackend() bool { +func (x *ResourceDetails) GetHpaMaxReplicas() int32 { if x != nil { - return x.IngressHasDefaultBackend + return x.HpaMaxReplicas } - return false + return 0 } -func (x *ResourceDetails) GetPvcStorageClassName() string { +func (x *ResourceDetails) GetHpaCurrentReplicas() int32 { if x != nil { - return x.PvcStorageClassName + return x.HpaCurrentReplicas } - return "" + return 0 } -func (x *ResourceDetails) GetPvcRequestedCapacity() string { +func (x *ResourceDetails) GetHpaDesiredReplicas() int32 { if x != nil { - return x.PvcRequestedCapacity + return x.HpaDesiredReplicas } - return "" + return 0 } -func (x *ResourceDetails) GetPvcActualCapacity() string { +func (x *ResourceDetails) GetHpaMetricsCount() int32 { if x != nil { - return x.PvcActualCapacity + return x.HpaMetricsCount + } + return 0 +} + +func (x *ResourceDetails) GetHpaStatus() string { + if x != nil { + return x.HpaStatus } return "" } -func (x *ResourceDetails) GetPvcAccessModes() []string { +func (x *ResourceDetails) GetHpaScaleUpStabilization() int32 { if x != nil { - return x.PvcAccessModes + return x.HpaScaleUpStabilization } - return nil + return 0 } -func (x *ResourceDetails) GetPvcVolumeMode() string { +func (x *ResourceDetails) GetHpaScaleDownStabilization() int32 { if x != nil { - return x.PvcVolumeMode + return x.HpaScaleDownStabilization } - return "" + return 0 } -func (x *ResourceDetails) GetPvcVolumeName() string { +func (x *ResourceDetails) GetVpaUpdateMode() string { if x != nil { - return x.PvcVolumeName + return x.VpaUpdateMode } return "" } -func (x *ResourceDetails) GetPvcStatus() string { +func (x *ResourceDetails) GetVpaPoliciesCount() int32 { if x != nil { - return x.PvcStatus + return x.VpaPoliciesCount } - return "" + return 0 } -func (x *ResourceDetails) GetPvcIsBound() bool { +func (x *ResourceDetails) GetVpaRecommendationsCount() int32 { if x != nil { - return x.PvcIsBound + return x.VpaRecommendationsCount } - return false + return 0 } -func (x *ResourceDetails) GetPvcSelectorMatchLabels() string { +func (x *ResourceDetails) GetVpaCpuTarget() string { if x != nil { - return x.PvcSelectorMatchLabels + return x.VpaCpuTarget } return "" } -func (x *ResourceDetails) GetPvcAllowedTopologies() []string { +func (x *ResourceDetails) GetVpaMemoryTarget() string { if x != nil { - return x.PvcAllowedTopologies + return x.VpaMemoryTarget } - return nil + return "" } -func (x *ResourceDetails) GetPvStorageClassName() string { +func (x *ResourceDetails) GetVpaStatus() string { if x != nil { - return x.PvStorageClassName + return x.VpaStatus } return "" } -func (x *ResourceDetails) GetPvCapacity() string { +func (x *ResourceDetails) GetLimitRangeItemsCount() int32 { if x != nil { - return x.PvCapacity + return x.LimitRangeItemsCount } - return "" + return 0 } -func (x *ResourceDetails) GetPvAccessModes() []string { +func (x *ResourceDetails) GetLimitRangeTypes() []string { if x != nil { - return x.PvAccessModes + return x.LimitRangeTypes } return nil } -func (x *ResourceDetails) GetPvReclaimPolicy() string { +func (x *ResourceDetails) GetLimitRangeHasDefaults() bool { if x != nil { - return x.PvReclaimPolicy + return x.LimitRangeHasDefaults } - return "" + return false } -func (x *ResourceDetails) GetPvClaimRefName() string { +func (x *ResourceDetails) GetLimitRangeMaxCpu() string { if x != nil { - return x.PvClaimRefName + return x.LimitRangeMaxCpu } return "" } -func (x *ResourceDetails) GetPvClaimRefNamespace() string { +func (x *ResourceDetails) GetLimitRangeMaxMemory() string { if x != nil { - return x.PvClaimRefNamespace + return x.LimitRangeMaxMemory } return "" } -func (x *ResourceDetails) GetPvStatus() string { +func (x *ResourceDetails) GetLimitRangeMinCpu() string { if x != nil { - return x.PvStatus + return x.LimitRangeMinCpu } return "" } -func (x *ResourceDetails) GetPvIsBound() bool { +func (x *ResourceDetails) GetLimitRangeMinMemory() string { if x != nil { - return x.PvIsBound + return x.LimitRangeMinMemory } - return false + return "" } -func (x *ResourceDetails) GetPvVolumeMode() string { +func (x *ResourceDetails) GetLimitRangeDefaultCpuLimit() string { if x != nil { - return x.PvVolumeMode + return x.LimitRangeDefaultCpuLimit } return "" } -func (x *ResourceDetails) GetPvCsiDriver() string { +func (x *ResourceDetails) GetLimitRangeDefaultMemoryLimit() string { if x != nil { - return x.PvCsiDriver + return x.LimitRangeDefaultMemoryLimit } return "" } -func (x *ResourceDetails) GetPvVolumeSourceType() string { +func (x *ResourceDetails) GetLimitRangeDefaultCpuRequest() string { if x != nil { - return x.PvVolumeSourceType + return x.LimitRangeDefaultCpuRequest } return "" } -func (x *ResourceDetails) GetPvNodeAffinityZones() []string { +func (x *ResourceDetails) GetLimitRangeDefaultMemoryRequest() string { if x != nil { - return x.PvNodeAffinityZones + return x.LimitRangeDefaultMemoryRequest } - return nil + return "" } -func (x *ResourceDetails) GetScProvisioner() string { +func (x *ResourceDetails) GetLimitRangeStatus() string { if x != nil { - return x.ScProvisioner + return x.LimitRangeStatus } return "" } -func (x *ResourceDetails) GetScReclaimPolicy() string { +func (x *ResourceDetails) GetResourceVersion() string { if x != nil { - return x.ScReclaimPolicy + return x.ResourceVersion } return "" } -func (x *ResourceDetails) GetScVolumeBindingMode() string { +func (x *ResourceDetails) GetApiVersion() string { if x != nil { - return x.ScVolumeBindingMode + return x.ApiVersion } return "" } -func (x *ResourceDetails) GetScAllowVolumeExpansion() bool { - if x != nil { - return x.ScAllowVolumeExpansion - } - return false +type isResourceDetails_Details interface { + isResourceDetails_Details() } -func (x *ResourceDetails) GetScParameters() map[string]string { - if x != nil { - return x.ScParameters - } - return nil +type ResourceDetails_PodDetails struct { + // Pod-specific fields + PodDetails *PodDetails `protobuf:"bytes,1,opt,name=pod_details,json=podDetails,proto3,oneof"` } -func (x *ResourceDetails) GetScAllowedTopologies() []string { - if x != nil { - return x.ScAllowedTopologies - } - return nil +type ResourceDetails_DeploymentDetails struct { + // Deployment-specific fields + DeploymentDetails *DeploymentDetails `protobuf:"bytes,2,opt,name=deployment_details,json=deploymentDetails,proto3,oneof"` } -func (x *ResourceDetails) GetScMountOptions() []string { - if x != nil { - return x.ScMountOptions - } - return nil +type ResourceDetails_StatefulSetDetails struct { + // StatefulSet-specific fields + StatefulSetDetails *StatefulSetDetails `protobuf:"bytes,3,opt,name=stateful_set_details,json=statefulSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNsStatus() string { - if x != nil { - return x.NsStatus - } - return "" +type ResourceDetails_DaemonSetDetails struct { + // DaemonSet-specific fields + DaemonSetDetails *DaemonSetDetails `protobuf:"bytes,4,opt,name=daemon_set_details,json=daemonSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNsFinalizers() []string { - if x != nil { - return x.NsFinalizers - } - return nil +type ResourceDetails_ReplicaSetDetails struct { + // ReplicaSet-specific fields + ReplicaSetDetails *ReplicaSetDetails `protobuf:"bytes,5,opt,name=replica_set_details,json=replicaSetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeCpuCapacity() string { - if x != nil { - return x.NodeCpuCapacity - } - return "" +type ResourceDetails_JobDetails struct { + // Job-specific fields + JobDetails *JobDetails `protobuf:"bytes,6,opt,name=job_details,json=jobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeMemoryCapacity() string { - if x != nil { - return x.NodeMemoryCapacity - } - return "" +type ResourceDetails_CronJobDetails struct { + // CronJob-specific fields + CronJobDetails *CronJobDetails `protobuf:"bytes,7,opt,name=cron_job_details,json=cronJobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeReady() bool { - if x != nil { - return x.NodeReady - } - return false +type ResourceDetails_ServiceDetails struct { + // Service-specific fields + ServiceDetails *ServiceDetails `protobuf:"bytes,8,opt,name=service_details,json=serviceDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeTaints() []*NodeTaint { - if x != nil { - return x.NodeTaints - } - return nil +type ResourceDetails_IngressDetails struct { + // Ingress-specific fields + IngressDetails *IngressDetails `protobuf:"bytes,9,opt,name=ingress_details,json=ingressDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeRoles() []string { - if x != nil { - return x.NodeRoles - } - return nil +type ResourceDetails_PvcDetails struct { + // PersistentVolumeClaim-specific fields + PvcDetails *PersistentVolumeClaimDetails `protobuf:"bytes,140,opt,name=pvc_details,json=pvcDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeInternalIp() string { - if x != nil { - return x.NodeInternalIp - } - return "" +type ResourceDetails_PvDetails struct { + // PersistentVolume-specific fields + PvDetails *PersistentVolumeDetails `protobuf:"bytes,141,opt,name=pv_details,json=pvDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeExternalIp() string { - if x != nil { - return x.NodeExternalIp - } - return "" +type ResourceDetails_ScDetails struct { + // StorageClass-specific fields + ScDetails *StorageClassDetails `protobuf:"bytes,142,opt,name=sc_details,json=scDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeVersion() string { - if x != nil { - return x.NodeVersion - } - return "" +type ResourceDetails_NsDetails struct { + // Namespace-specific fields + NsDetails *NamespaceDetails `protobuf:"bytes,143,opt,name=ns_details,json=nsDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeInstanceType() string { - if x != nil { - return x.NodeInstanceType - } - return "" +type ResourceDetails_NodeDetails struct { + // Node-specific fields + NodeDetails *NodeDetails `protobuf:"bytes,144,opt,name=node_details,json=nodeDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeOs() string { - if x != nil { - return x.NodeOs - } - return "" +type ResourceDetails_HpaDetails struct { + // HorizontalPodAutoscaler-specific fields + HpaDetails *HPADetails `protobuf:"bytes,145,opt,name=hpa_details,json=hpaDetails,proto3,oneof"` +} + +type ResourceDetails_VpaDetails struct { + // VerticalPodAutoscaler-specific fields + VpaDetails *VPADetails `protobuf:"bytes,146,opt,name=vpa_details,json=vpaDetails,proto3,oneof"` +} + +type ResourceDetails_LimitRangeDetails struct { + // LimitRange-specific fields + LimitRangeDetails *LimitRangeDetails `protobuf:"bytes,147,opt,name=limit_range_details,json=limitRangeDetails,proto3,oneof"` +} + +type ResourceDetails_ServiceAccountDetails struct { + // ServiceAccount-specific fields + ServiceAccountDetails *ServiceAccountDetails `protobuf:"bytes,232,opt,name=service_account_details,json=serviceAccountDetails,proto3,oneof"` +} + +type ResourceDetails_RoleDetails struct { + // Role-specific fields + RoleDetails *RoleDetails `protobuf:"bytes,233,opt,name=role_details,json=roleDetails,proto3,oneof"` +} + +type ResourceDetails_RoleBindingDetails struct { + // RoleBinding-specific fields + RoleBindingDetails *RoleBindingDetails `protobuf:"bytes,234,opt,name=role_binding_details,json=roleBindingDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeContainerRuntime() string { - if x != nil { - return x.NodeContainerRuntime - } - return "" +type ResourceDetails_KedaScaledObjectDetails struct { + // KedaScaledObject-specific fields + KedaScaledObjectDetails *KedaScaledObjectDetails `protobuf:"bytes,235,opt,name=keda_scaled_object_details,json=kedaScaledObjectDetails,proto3,oneof"` } -func (x *ResourceDetails) GetNodeImageCount() int32 { - if x != nil { - return x.NodeImageCount - } - return 0 +type ResourceDetails_KarpenterResourceDetails struct { + // KarpenterResource-specific fields + KarpenterResourceDetails *KarpenterResourceDetails `protobuf:"bytes,236,opt,name=karpenter_resource_details,json=karpenterResourceDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMinReplicas() int32 { - if x != nil { - return x.HpaMinReplicas - } - return 0 +type ResourceDetails_PodDisruptionBudgetDetails struct { + // PodDisruptionBudget-specific fields + PodDisruptionBudgetDetails *PodDisruptionBudgetDetails `protobuf:"bytes,237,opt,name=pod_disruption_budget_details,json=podDisruptionBudgetDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMaxReplicas() int32 { - if x != nil { - return x.HpaMaxReplicas - } - return 0 +type ResourceDetails_ResourceQuotaDetails struct { + // ResourceQuota-specific fields + ResourceQuotaDetails *ResourceQuotaDetails `protobuf:"bytes,238,opt,name=resource_quota_details,json=resourceQuotaDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaCurrentReplicas() int32 { - if x != nil { - return x.HpaCurrentReplicas - } - return 0 +type ResourceDetails_VolcanoJobDetails struct { + // VolcanoJob-specific fields + VolcanoJobDetails *VolcanoJobDetails `protobuf:"bytes,239,opt,name=volcano_job_details,json=volcanoJobDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaDesiredReplicas() int32 { - if x != nil { - return x.HpaDesiredReplicas - } - return 0 +type ResourceDetails_SparkApplicationDetails struct { + // SparkApplication-specific fields + SparkApplicationDetails *SparkApplicationDetails `protobuf:"bytes,242,opt,name=spark_application_details,json=sparkApplicationDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaMetricsCount() int32 { - if x != nil { - return x.HpaMetricsCount - } - return 0 +type ResourceDetails_ScheduledSparkApplicationDetails struct { + // ScheduledSparkApplication-specific fields + ScheduledSparkApplicationDetails *ScheduledSparkApplicationDetails `protobuf:"bytes,243,opt,name=scheduled_spark_application_details,json=scheduledSparkApplicationDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaStatus() string { - if x != nil { - return x.HpaStatus - } - return "" +type ResourceDetails_KyvernoPolicyDetails struct { + // KyvernoPolicy-specific fields + KyvernoPolicyDetails *KyvernoPolicyDetails `protobuf:"bytes,244,opt,name=kyverno_policy_details,json=kyvernoPolicyDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaScaleUpStabilization() int32 { - if x != nil { - return x.HpaScaleUpStabilization - } - return 0 +type ResourceDetails_KyvernoPolicyReportDetails struct { + // KyvernoPolicyReport-specific fields + KyvernoPolicyReportDetails *KyvernoPolicyReportDetails `protobuf:"bytes,245,opt,name=kyverno_policy_report_details,json=kyvernoPolicyReportDetails,proto3,oneof"` } -func (x *ResourceDetails) GetHpaScaleDownStabilization() int32 { - if x != nil { - return x.HpaScaleDownStabilization - } - return 0 +type ResourceDetails_GatekeeperConstraintTemplateDetails struct { + // GatekeeperConstraintTemplate-specific fields + GatekeeperConstraintTemplateDetails *GatekeeperConstraintTemplateDetails `protobuf:"bytes,246,opt,name=gatekeeper_constraint_template_details,json=gatekeeperConstraintTemplateDetails,proto3,oneof"` } -func (x *ResourceDetails) GetVpaUpdateMode() string { - if x != nil { - return x.VpaUpdateMode - } - return "" +type ResourceDetails_GatekeeperConstraintDetails struct { + // GatekeeperConstraint-specific fields + GatekeeperConstraintDetails *GatekeeperConstraintDetails `protobuf:"bytes,247,opt,name=gatekeeper_constraint_details,json=gatekeeperConstraintDetails,proto3,oneof"` } -func (x *ResourceDetails) GetVpaPoliciesCount() int32 { - if x != nil { - return x.VpaPoliciesCount - } - return 0 -} +func (*ResourceDetails_PodDetails) isResourceDetails_Details() {} -func (x *ResourceDetails) GetVpaRecommendationsCount() int32 { - if x != nil { - return x.VpaRecommendationsCount - } - return 0 +func (*ResourceDetails_DeploymentDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_StatefulSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_DaemonSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ReplicaSetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_JobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_CronJobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ServiceDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_IngressDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PvcDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PvDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ScDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_NsDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_NodeDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_HpaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_VpaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_LimitRangeDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ServiceAccountDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_RoleDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_RoleBindingDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KedaScaledObjectDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KarpenterResourceDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_PodDisruptionBudgetDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ResourceQuotaDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_VolcanoJobDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_SparkApplicationDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_ScheduledSparkApplicationDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KyvernoPolicyDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_KyvernoPolicyReportDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_GatekeeperConstraintTemplateDetails) isResourceDetails_Details() {} + +func (*ResourceDetails_GatekeeperConstraintDetails) isResourceDetails_Details() {} + +// PodDetails contains detailed Pod information (for the oneof, if we need nested data later) +type PodDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container details for debugging } -func (x *ResourceDetails) GetVpaCpuTarget() string { - if x != nil { - return x.VpaCpuTarget +func (x *PodDetails) Reset() { + *x = PodDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ResourceDetails) GetVpaMemoryTarget() string { - if x != nil { - return x.VpaMemoryTarget - } - return "" +func (x *PodDetails) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetVpaStatus() string { - if x != nil { - return x.VpaStatus +func (*PodDetails) ProtoMessage() {} + +func (x *PodDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetLimitRangeItemsCount() int32 { - if x != nil { - return x.LimitRangeItemsCount - } - return 0 +// Deprecated: Use PodDetails.ProtoReflect.Descriptor instead. +func (*PodDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{33} } -func (x *ResourceDetails) GetLimitRangeTypes() []string { +func (x *PodDetails) GetContainers() []*ContainerSummary { if x != nil { - return x.LimitRangeTypes + return x.Containers } return nil } -func (x *ResourceDetails) GetLimitRangeHasDefaults() bool { - if x != nil { - return x.LimitRangeHasDefaults - } - return false -} +// ContainerSummary provides essential container information +type ContainerSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ResourceDetails) GetLimitRangeMaxCpu() string { - if x != nil { - return x.LimitRangeMaxCpu - } - return "" + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image + Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` // Container ready status + RestartCount int32 `protobuf:"varint,4,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Container restart count + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` // "running", "waiting", "terminated" + StateReason string `protobuf:"bytes,6,opt,name=state_reason,json=stateReason,proto3" json:"state_reason,omitempty"` // Reason for current state (if not running) } -func (x *ResourceDetails) GetLimitRangeMaxMemory() string { - if x != nil { - return x.LimitRangeMaxMemory +func (x *ContainerSummary) Reset() { + *x = ContainerSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ResourceDetails) GetLimitRangeMinCpu() string { - if x != nil { - return x.LimitRangeMinCpu - } - return "" +func (x *ContainerSummary) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ResourceDetails) GetLimitRangeMinMemory() string { - if x != nil { - return x.LimitRangeMinMemory - } - return "" -} +func (*ContainerSummary) ProtoMessage() {} -func (x *ResourceDetails) GetLimitRangeDefaultCpuLimit() string { - if x != nil { - return x.LimitRangeDefaultCpuLimit +func (x *ContainerSummary) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ResourceDetails) GetLimitRangeDefaultMemoryLimit() string { +// Deprecated: Use ContainerSummary.ProtoReflect.Descriptor instead. +func (*ContainerSummary) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{34} +} + +func (x *ContainerSummary) GetName() string { if x != nil { - return x.LimitRangeDefaultMemoryLimit + return x.Name } return "" } -func (x *ResourceDetails) GetLimitRangeDefaultCpuRequest() string { +func (x *ContainerSummary) GetImage() string { if x != nil { - return x.LimitRangeDefaultCpuRequest + return x.Image } return "" } -func (x *ResourceDetails) GetLimitRangeDefaultMemoryRequest() string { +func (x *ContainerSummary) GetReady() bool { if x != nil { - return x.LimitRangeDefaultMemoryRequest + return x.Ready } - return "" + return false } -func (x *ResourceDetails) GetLimitRangeStatus() string { +func (x *ContainerSummary) GetRestartCount() int32 { if x != nil { - return x.LimitRangeStatus + return x.RestartCount } - return "" + return 0 } -func (x *ResourceDetails) GetResourceVersion() string { +func (x *ContainerSummary) GetState() string { if x != nil { - return x.ResourceVersion + return x.State } return "" } -func (x *ResourceDetails) GetApiVersion() string { +func (x *ContainerSummary) GetStateReason() string { if x != nil { - return x.ApiVersion + return x.StateReason } return "" } -type isResourceDetails_Details interface { - isResourceDetails_Details() -} - -type ResourceDetails_PodDetails struct { - // Pod-specific fields - PodDetails *PodDetails `protobuf:"bytes,1,opt,name=pod_details,json=podDetails,proto3,oneof"` -} - -type ResourceDetails_DeploymentDetails struct { - // Deployment-specific fields - DeploymentDetails *DeploymentDetails `protobuf:"bytes,2,opt,name=deployment_details,json=deploymentDetails,proto3,oneof"` -} - -type ResourceDetails_StatefulSetDetails struct { - // StatefulSet-specific fields - StatefulSetDetails *StatefulSetDetails `protobuf:"bytes,3,opt,name=stateful_set_details,json=statefulSetDetails,proto3,oneof"` -} - -type ResourceDetails_DaemonSetDetails struct { - // DaemonSet-specific fields - DaemonSetDetails *DaemonSetDetails `protobuf:"bytes,4,opt,name=daemon_set_details,json=daemonSetDetails,proto3,oneof"` -} - -type ResourceDetails_ReplicaSetDetails struct { - // ReplicaSet-specific fields - ReplicaSetDetails *ReplicaSetDetails `protobuf:"bytes,5,opt,name=replica_set_details,json=replicaSetDetails,proto3,oneof"` -} - -type ResourceDetails_JobDetails struct { - // Job-specific fields - JobDetails *JobDetails `protobuf:"bytes,6,opt,name=job_details,json=jobDetails,proto3,oneof"` -} - -type ResourceDetails_CronJobDetails struct { - // CronJob-specific fields - CronJobDetails *CronJobDetails `protobuf:"bytes,7,opt,name=cron_job_details,json=cronJobDetails,proto3,oneof"` -} - -type ResourceDetails_ServiceDetails struct { - // Service-specific fields - ServiceDetails *ServiceDetails `protobuf:"bytes,8,opt,name=service_details,json=serviceDetails,proto3,oneof"` -} - -type ResourceDetails_IngressDetails struct { - // Ingress-specific fields - IngressDetails *IngressDetails `protobuf:"bytes,9,opt,name=ingress_details,json=ingressDetails,proto3,oneof"` -} +// DeploymentDetails contains detailed Deployment information for drill-down +type DeploymentDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type ResourceDetails_PvcDetails struct { - // PersistentVolumeClaim-specific fields - PvcDetails *PersistentVolumeClaimDetails `protobuf:"bytes,140,opt,name=pvc_details,json=pvcDetails,proto3,oneof"` + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*DeploymentCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Deployment conditions for debugging } -type ResourceDetails_PvDetails struct { - // PersistentVolume-specific fields - PvDetails *PersistentVolumeDetails `protobuf:"bytes,141,opt,name=pv_details,json=pvDetails,proto3,oneof"` +func (x *DeploymentDetails) Reset() { + *x = DeploymentDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type ResourceDetails_ScDetails struct { - // StorageClass-specific fields - ScDetails *StorageClassDetails `protobuf:"bytes,142,opt,name=sc_details,json=scDetails,proto3,oneof"` +func (x *DeploymentDetails) String() string { + return protoimpl.X.MessageStringOf(x) } -type ResourceDetails_NsDetails struct { - // Namespace-specific fields - NsDetails *NamespaceDetails `protobuf:"bytes,143,opt,name=ns_details,json=nsDetails,proto3,oneof"` -} +func (*DeploymentDetails) ProtoMessage() {} -type ResourceDetails_NodeDetails struct { - // Node-specific fields - NodeDetails *NodeDetails `protobuf:"bytes,144,opt,name=node_details,json=nodeDetails,proto3,oneof"` +func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[35] + 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) } -type ResourceDetails_HpaDetails struct { - // HorizontalPodAutoscaler-specific fields - HpaDetails *HPADetails `protobuf:"bytes,145,opt,name=hpa_details,json=hpaDetails,proto3,oneof"` +// Deprecated: Use DeploymentDetails.ProtoReflect.Descriptor instead. +func (*DeploymentDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{35} } -type ResourceDetails_VpaDetails struct { - // VerticalPodAutoscaler-specific fields - VpaDetails *VPADetails `protobuf:"bytes,146,opt,name=vpa_details,json=vpaDetails,proto3,oneof"` +func (x *DeploymentDetails) GetContainers() []*ContainerTemplate { + if x != nil { + return x.Containers + } + return nil } -type ResourceDetails_LimitRangeDetails struct { - // LimitRange-specific fields - LimitRangeDetails *LimitRangeDetails `protobuf:"bytes,147,opt,name=limit_range_details,json=limitRangeDetails,proto3,oneof"` +func (x *DeploymentDetails) GetConditions() []*DeploymentCondition { + if x != nil { + return x.Conditions + } + return nil } -type ResourceDetails_ServiceAccountDetails struct { - // ServiceAccount-specific fields - ServiceAccountDetails *ServiceAccountDetails `protobuf:"bytes,232,opt,name=service_account_details,json=serviceAccountDetails,proto3,oneof"` -} +// ContainerTemplate represents a container template in a deployment +type ContainerTemplate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type ResourceDetails_RoleDetails struct { - // Role-specific fields - RoleDetails *RoleDetails `protobuf:"bytes,233,opt,name=role_details,json=roleDetails,proto3,oneof"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name + Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image + CpuRequestsMillicores int64 `protobuf:"varint,3,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // CPU requests in millicores + MemoryRequestsBytes int64 `protobuf:"varint,4,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Memory requests in bytes + CpuLimitsMillicores int64 `protobuf:"varint,5,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // CPU limits in millicores + MemoryLimitsBytes int64 `protobuf:"varint,6,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Memory limits in bytes } -type ResourceDetails_RoleBindingDetails struct { - // RoleBinding-specific fields - RoleBindingDetails *RoleBindingDetails `protobuf:"bytes,234,opt,name=role_binding_details,json=roleBindingDetails,proto3,oneof"` +func (x *ContainerTemplate) Reset() { + *x = ContainerTemplate{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type ResourceDetails_KedaScaledObjectDetails struct { - // KedaScaledObject-specific fields - KedaScaledObjectDetails *KedaScaledObjectDetails `protobuf:"bytes,235,opt,name=keda_scaled_object_details,json=kedaScaledObjectDetails,proto3,oneof"` +func (x *ContainerTemplate) String() string { + return protoimpl.X.MessageStringOf(x) } -type ResourceDetails_KarpenterResourceDetails struct { - // KarpenterResource-specific fields - KarpenterResourceDetails *KarpenterResourceDetails `protobuf:"bytes,236,opt,name=karpenter_resource_details,json=karpenterResourceDetails,proto3,oneof"` -} +func (*ContainerTemplate) ProtoMessage() {} -type ResourceDetails_PodDisruptionBudgetDetails struct { - // PodDisruptionBudget-specific fields - PodDisruptionBudgetDetails *PodDisruptionBudgetDetails `protobuf:"bytes,237,opt,name=pod_disruption_budget_details,json=podDisruptionBudgetDetails,proto3,oneof"` +func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[36] + 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) } -type ResourceDetails_ResourceQuotaDetails struct { - // ResourceQuota-specific fields - ResourceQuotaDetails *ResourceQuotaDetails `protobuf:"bytes,238,opt,name=resource_quota_details,json=resourceQuotaDetails,proto3,oneof"` +// Deprecated: Use ContainerTemplate.ProtoReflect.Descriptor instead. +func (*ContainerTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{36} } -type ResourceDetails_VolcanoJobDetails struct { - // VolcanoJob-specific fields - VolcanoJobDetails *VolcanoJobDetails `protobuf:"bytes,239,opt,name=volcano_job_details,json=volcanoJobDetails,proto3,oneof"` +func (x *ContainerTemplate) GetName() string { + if x != nil { + return x.Name + } + return "" } -type ResourceDetails_SparkApplicationDetails struct { - // SparkApplication-specific fields - SparkApplicationDetails *SparkApplicationDetails `protobuf:"bytes,242,opt,name=spark_application_details,json=sparkApplicationDetails,proto3,oneof"` +func (x *ContainerTemplate) GetImage() string { + if x != nil { + return x.Image + } + return "" } -type ResourceDetails_ScheduledSparkApplicationDetails struct { - // ScheduledSparkApplication-specific fields - ScheduledSparkApplicationDetails *ScheduledSparkApplicationDetails `protobuf:"bytes,243,opt,name=scheduled_spark_application_details,json=scheduledSparkApplicationDetails,proto3,oneof"` +func (x *ContainerTemplate) GetCpuRequestsMillicores() int64 { + if x != nil { + return x.CpuRequestsMillicores + } + return 0 } -func (*ResourceDetails_PodDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_DeploymentDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_StatefulSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_DaemonSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ReplicaSetDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_JobDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_CronJobDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ServiceDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_IngressDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_PvcDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_PvDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_ScDetails) isResourceDetails_Details() {} - -func (*ResourceDetails_NsDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetMemoryRequestsBytes() int64 { + if x != nil { + return x.MemoryRequestsBytes + } + return 0 +} -func (*ResourceDetails_NodeDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetCpuLimitsMillicores() int64 { + if x != nil { + return x.CpuLimitsMillicores + } + return 0 +} -func (*ResourceDetails_HpaDetails) isResourceDetails_Details() {} +func (x *ContainerTemplate) GetMemoryLimitsBytes() int64 { + if x != nil { + return x.MemoryLimitsBytes + } + return 0 +} -func (*ResourceDetails_VpaDetails) isResourceDetails_Details() {} +// DeploymentCondition represents a deployment condition +type DeploymentCondition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (*ResourceDetails_LimitRangeDetails) isResourceDetails_Details() {} + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Available", "Progressing", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastUpdateTime int64 `protobuf:"varint,5,opt,name=last_update_time,json=lastUpdateTime,proto3" json:"last_update_time,omitempty"` // Last time condition was updated +} -func (*ResourceDetails_ServiceAccountDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) Reset() { + *x = DeploymentCondition{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} -func (*ResourceDetails_RoleDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) String() string { + return protoimpl.X.MessageStringOf(x) +} -func (*ResourceDetails_RoleBindingDetails) isResourceDetails_Details() {} +func (*DeploymentCondition) ProtoMessage() {} -func (*ResourceDetails_KedaScaledObjectDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[37] + 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) +} -func (*ResourceDetails_KarpenterResourceDetails) isResourceDetails_Details() {} +// Deprecated: Use DeploymentCondition.ProtoReflect.Descriptor instead. +func (*DeploymentCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{37} +} -func (*ResourceDetails_PodDisruptionBudgetDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetType() string { + if x != nil { + return x.Type + } + return "" +} -func (*ResourceDetails_ResourceQuotaDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} -func (*ResourceDetails_VolcanoJobDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} -func (*ResourceDetails_SparkApplicationDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} -func (*ResourceDetails_ScheduledSparkApplicationDetails) isResourceDetails_Details() {} +func (x *DeploymentCondition) GetLastUpdateTime() int64 { + if x != nil { + return x.LastUpdateTime + } + return 0 +} -// PodDetails contains detailed Pod information (for the oneof, if we need nested data later) -type PodDetails struct { +// StatefulSetDetails contains detailed StatefulSet information for drill-down +type StatefulSetDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container details for debugging + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + VolumeClaimTemplates []*VolumeClaimTemplate `protobuf:"bytes,2,rep,name=volume_claim_templates,json=volumeClaimTemplates,proto3" json:"volume_claim_templates,omitempty"` // PVC templates + Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` // Update strategy partition (for canary updates) } -func (x *PodDetails) Reset() { - *x = PodDetails{} +func (x *StatefulSetDetails) Reset() { + *x = StatefulSetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[27] + mi := &file_api_v1_common_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PodDetails) String() string { +func (x *StatefulSetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PodDetails) ProtoMessage() {} +func (*StatefulSetDetails) ProtoMessage() {} -func (x *PodDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[27] +func (x *StatefulSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5936,49 +7326,62 @@ func (x *PodDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PodDetails.ProtoReflect.Descriptor instead. -func (*PodDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{27} +// Deprecated: Use StatefulSetDetails.ProtoReflect.Descriptor instead. +func (*StatefulSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{38} } -func (x *PodDetails) GetContainers() []*ContainerSummary { +func (x *StatefulSetDetails) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -// ContainerSummary provides essential container information -type ContainerSummary struct { +func (x *StatefulSetDetails) GetVolumeClaimTemplates() []*VolumeClaimTemplate { + if x != nil { + return x.VolumeClaimTemplates + } + return nil +} + +func (x *StatefulSetDetails) GetPartition() int32 { + if x != nil { + return x.Partition + } + return 0 +} + +// VolumeClaimTemplate represents a volume claim template in a StatefulSet +type VolumeClaimTemplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image - Ready bool `protobuf:"varint,3,opt,name=ready,proto3" json:"ready,omitempty"` // Container ready status - RestartCount int32 `protobuf:"varint,4,opt,name=restart_count,json=restartCount,proto3" json:"restart_count,omitempty"` // Container restart count - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` // "running", "waiting", "terminated" - StateReason string `protobuf:"bytes,6,opt,name=state_reason,json=stateReason,proto3" json:"state_reason,omitempty"` // Reason for current state (if not running) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC template name + AccessModes []string `protobuf:"bytes,2,rep,name=access_modes,json=accessModes,proto3" json:"access_modes,omitempty"` // "ReadWriteOnce", etc. + VolumeMode string `protobuf:"bytes,3,opt,name=volume_mode,json=volumeMode,proto3" json:"volume_mode,omitempty"` // "Filesystem" or "Block" + StorageRequests int64 `protobuf:"varint,4,opt,name=storage_requests,json=storageRequests,proto3" json:"storage_requests,omitempty"` // Storage size requested in bytes + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Storage class name (optional) } -func (x *ContainerSummary) Reset() { - *x = ContainerSummary{} +func (x *VolumeClaimTemplate) Reset() { + *x = VolumeClaimTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[28] + mi := &file_api_v1_common_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerSummary) String() string { +func (x *VolumeClaimTemplate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerSummary) ProtoMessage() {} +func (*VolumeClaimTemplate) ProtoMessage() {} -func (x *ContainerSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[28] +func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5989,80 +7392,137 @@ func (x *ContainerSummary) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerSummary.ProtoReflect.Descriptor instead. -func (*ContainerSummary) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{28} +// Deprecated: Use VolumeClaimTemplate.ProtoReflect.Descriptor instead. +func (*VolumeClaimTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{39} } -func (x *ContainerSummary) GetName() string { +func (x *VolumeClaimTemplate) GetName() string { if x != nil { return x.Name } return "" } -func (x *ContainerSummary) GetImage() string { +func (x *VolumeClaimTemplate) GetAccessModes() []string { if x != nil { - return x.Image + return x.AccessModes } - return "" + return nil } -func (x *ContainerSummary) GetReady() bool { +func (x *VolumeClaimTemplate) GetVolumeMode() string { if x != nil { - return x.Ready + return x.VolumeMode } - return false + return "" } -func (x *ContainerSummary) GetRestartCount() int32 { +func (x *VolumeClaimTemplate) GetStorageRequests() int64 { if x != nil { - return x.RestartCount + return x.StorageRequests } return 0 } -func (x *ContainerSummary) GetState() string { +func (x *VolumeClaimTemplate) GetStorageClass() string { if x != nil { - return x.State + return x.StorageClass } return "" } -func (x *ContainerSummary) GetStateReason() string { +// DaemonSetDetails contains detailed DaemonSet information for drill-down +type DaemonSetDetails 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 pod spec + Tolerations []*TolerationInfo `protobuf:"bytes,2,rep,name=tolerations,proto3" json:"tolerations,omitempty"` // Tolerations for node scheduling + NodeSelector *NodeSelector `protobuf:"bytes,3,opt,name=node_selector,json=nodeSelector,proto3" json:"node_selector,omitempty"` // Node selector requirements (optional) +} + +func (x *DaemonSetDetails) Reset() { + *x = DaemonSetDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DaemonSetDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DaemonSetDetails) ProtoMessage() {} + +func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[40] + 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 DaemonSetDetails.ProtoReflect.Descriptor instead. +func (*DaemonSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{40} +} + +func (x *DaemonSetDetails) GetContainers() []*ContainerTemplate { + if x != nil { + return x.Containers + } + return nil +} + +func (x *DaemonSetDetails) GetTolerations() []*TolerationInfo { + if x != nil { + return x.Tolerations + } + return nil +} + +func (x *DaemonSetDetails) GetNodeSelector() *NodeSelector { if x != nil { - return x.StateReason + return x.NodeSelector } - return "" + return nil } -// DeploymentDetails contains detailed Deployment information for drill-down -type DeploymentDetails struct { +// ReplicaSetDetails contains detailed ReplicaSet information for drill-down +type ReplicaSetDetails 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 pod spec - Conditions []*DeploymentCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Deployment conditions for debugging + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for replica set } -func (x *DeploymentDetails) Reset() { - *x = DeploymentDetails{} +func (x *ReplicaSetDetails) Reset() { + *x = ReplicaSetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[29] + mi := &file_api_v1_common_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeploymentDetails) String() string { +func (x *ReplicaSetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeploymentDetails) ProtoMessage() {} +func (*ReplicaSetDetails) ProtoMessage() {} -func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[29] +func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6073,56 +7533,53 @@ func (x *DeploymentDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeploymentDetails.ProtoReflect.Descriptor instead. -func (*DeploymentDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{29} +// Deprecated: Use ReplicaSetDetails.ProtoReflect.Descriptor instead. +func (*ReplicaSetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{41} } -func (x *DeploymentDetails) GetContainers() []*ContainerTemplate { +func (x *ReplicaSetDetails) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -func (x *DeploymentDetails) GetConditions() []*DeploymentCondition { +func (x *ReplicaSetDetails) GetSelector() *LabelSelector { if x != nil { - return x.Conditions + return x.Selector } return nil } -// ContainerTemplate represents a container template in a deployment -type ContainerTemplate struct { +// JobDetails contains detailed Job information for drill-down +type JobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Container name - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` // Container image - CpuRequestsMillicores int64 `protobuf:"varint,3,opt,name=cpu_requests_millicores,json=cpuRequestsMillicores,proto3" json:"cpu_requests_millicores,omitempty"` // CPU requests in millicores - MemoryRequestsBytes int64 `protobuf:"varint,4,opt,name=memory_requests_bytes,json=memoryRequestsBytes,proto3" json:"memory_requests_bytes,omitempty"` // Memory requests in bytes - CpuLimitsMillicores int64 `protobuf:"varint,5,opt,name=cpu_limits_millicores,json=cpuLimitsMillicores,proto3" json:"cpu_limits_millicores,omitempty"` // CPU limits in millicores - MemoryLimitsBytes int64 `protobuf:"varint,6,opt,name=memory_limits_bytes,json=memoryLimitsBytes,proto3" json:"memory_limits_bytes,omitempty"` // Memory limits in bytes + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*JobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Job conditions for debugging + Selector *LabelSelector `protobuf:"bytes,3,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for job } -func (x *ContainerTemplate) Reset() { - *x = ContainerTemplate{} +func (x *JobDetails) Reset() { + *x = JobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[30] + mi := &file_api_v1_common_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ContainerTemplate) String() string { +func (x *JobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContainerTemplate) ProtoMessage() {} +func (*JobDetails) ProtoMessage() {} -func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[30] +func (x *JobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6133,83 +7590,63 @@ func (x *ContainerTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContainerTemplate.ProtoReflect.Descriptor instead. -func (*ContainerTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{30} -} - -func (x *ContainerTemplate) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *ContainerTemplate) GetImage() string { - if x != nil { - return x.Image - } - return "" -} - -func (x *ContainerTemplate) GetCpuRequestsMillicores() int64 { - if x != nil { - return x.CpuRequestsMillicores - } - return 0 +// Deprecated: Use JobDetails.ProtoReflect.Descriptor instead. +func (*JobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{42} } -func (x *ContainerTemplate) GetMemoryRequestsBytes() int64 { +func (x *JobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.MemoryRequestsBytes + return x.Containers } - return 0 + return nil } -func (x *ContainerTemplate) GetCpuLimitsMillicores() int64 { +func (x *JobDetails) GetConditions() []*JobCondition { if x != nil { - return x.CpuLimitsMillicores + return x.Conditions } - return 0 + return nil } -func (x *ContainerTemplate) GetMemoryLimitsBytes() int64 { +func (x *JobDetails) GetSelector() *LabelSelector { if x != nil { - return x.MemoryLimitsBytes + return x.Selector } - return 0 + return nil } -// DeploymentCondition represents a deployment condition -type DeploymentCondition struct { +// JobCondition represents a job condition +type JobCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Available", "Progressing", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastUpdateTime int64 `protobuf:"varint,5,opt,name=last_update_time,json=lastUpdateTime,proto3" json:"last_update_time,omitempty"` // Last time condition was updated + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Complete", "Failed", "SuccessCriteriaMet", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *DeploymentCondition) Reset() { - *x = DeploymentCondition{} +func (x *JobCondition) Reset() { + *x = JobCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[31] + mi := &file_api_v1_common_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeploymentCondition) String() string { +func (x *JobCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeploymentCondition) ProtoMessage() {} +func (*JobCondition) ProtoMessage() {} -func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[31] +func (x *JobCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6220,140 +7657,81 @@ func (x *DeploymentCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeploymentCondition.ProtoReflect.Descriptor instead. -func (*DeploymentCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{31} +// Deprecated: Use JobCondition.ProtoReflect.Descriptor instead. +func (*JobCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{43} } -func (x *DeploymentCondition) GetType() string { +func (x *JobCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *DeploymentCondition) GetStatus() string { +func (x *JobCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *DeploymentCondition) GetReason() string { +func (x *JobCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *DeploymentCondition) GetMessage() string { +func (x *JobCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *DeploymentCondition) GetLastUpdateTime() int64 { +func (x *JobCondition) GetLastProbeTime() int64 { if x != nil { - return x.LastUpdateTime + return x.LastProbeTime } return 0 } -// StatefulSetDetails contains detailed StatefulSet information for drill-down -type StatefulSetDetails 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 pod spec - VolumeClaimTemplates []*VolumeClaimTemplate `protobuf:"bytes,2,rep,name=volume_claim_templates,json=volumeClaimTemplates,proto3" json:"volume_claim_templates,omitempty"` // PVC templates - Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` // Update strategy partition (for canary updates) -} - -func (x *StatefulSetDetails) Reset() { - *x = StatefulSetDetails{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatefulSetDetails) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatefulSetDetails) ProtoMessage() {} - -func (x *StatefulSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[32] - 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 StatefulSetDetails.ProtoReflect.Descriptor instead. -func (*StatefulSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{32} -} - -func (x *StatefulSetDetails) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil -} - -func (x *StatefulSetDetails) GetVolumeClaimTemplates() []*VolumeClaimTemplate { - if x != nil { - return x.VolumeClaimTemplates - } - return nil -} - -func (x *StatefulSetDetails) GetPartition() int32 { +func (x *JobCondition) GetLastTransitionTime() int64 { if x != nil { - return x.Partition + return x.LastTransitionTime } return 0 } -// VolumeClaimTemplate represents a volume claim template in a StatefulSet -type VolumeClaimTemplate struct { +// CronJobDetails contains detailed CronJob information for drill-down +type CronJobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC template name - AccessModes []string `protobuf:"bytes,2,rep,name=access_modes,json=accessModes,proto3" json:"access_modes,omitempty"` // "ReadWriteOnce", etc. - VolumeMode string `protobuf:"bytes,3,opt,name=volume_mode,json=volumeMode,proto3" json:"volume_mode,omitempty"` // "Filesystem" or "Block" - StorageRequests int64 `protobuf:"varint,4,opt,name=storage_requests,json=storageRequests,proto3" json:"storage_requests,omitempty"` // Storage size requested in bytes - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` // Storage class name (optional) + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from job template pod spec + ActiveJobs []*ActiveJobReference `protobuf:"bytes,2,rep,name=active_jobs,json=activeJobs,proto3" json:"active_jobs,omitempty"` // Currently active jobs + JobTemplate *JobTemplate `protobuf:"bytes,3,opt,name=job_template,json=jobTemplate,proto3" json:"job_template,omitempty"` // Job template specification } -func (x *VolumeClaimTemplate) Reset() { - *x = VolumeClaimTemplate{} +func (x *CronJobDetails) Reset() { + *x = CronJobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[33] + mi := &file_api_v1_common_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolumeClaimTemplate) String() string { +func (x *CronJobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolumeClaimTemplate) ProtoMessage() {} +func (*CronJobDetails) ProtoMessage() {} -func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[33] +func (x *CronJobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6364,74 +7742,61 @@ func (x *VolumeClaimTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolumeClaimTemplate.ProtoReflect.Descriptor instead. -func (*VolumeClaimTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{33} -} - -func (x *VolumeClaimTemplate) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use CronJobDetails.ProtoReflect.Descriptor instead. +func (*CronJobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{44} } -func (x *VolumeClaimTemplate) GetAccessModes() []string { +func (x *CronJobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.AccessModes + return x.Containers } return nil } -func (x *VolumeClaimTemplate) GetVolumeMode() string { - if x != nil { - return x.VolumeMode - } - return "" -} - -func (x *VolumeClaimTemplate) GetStorageRequests() int64 { +func (x *CronJobDetails) GetActiveJobs() []*ActiveJobReference { if x != nil { - return x.StorageRequests + return x.ActiveJobs } - return 0 + return nil } -func (x *VolumeClaimTemplate) GetStorageClass() string { +func (x *CronJobDetails) GetJobTemplate() *JobTemplate { if x != nil { - return x.StorageClass + return x.JobTemplate } - return "" + return nil } -// DaemonSetDetails contains detailed DaemonSet information for drill-down -type DaemonSetDetails struct { +// ActiveJobReference represents an active job created by a CronJob +type ActiveJobReference 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 pod spec - Tolerations []*TolerationInfo `protobuf:"bytes,2,rep,name=tolerations,proto3" json:"tolerations,omitempty"` // Tolerations for node scheduling - NodeSelector *NodeSelector `protobuf:"bytes,3,opt,name=node_selector,json=nodeSelector,proto3" json:"node_selector,omitempty"` // Node selector requirements (optional) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Job name + Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` // Job UID + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Job namespace + CreationTime int64 `protobuf:"varint,4,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` // Job creation timestamp } -func (x *DaemonSetDetails) Reset() { - *x = DaemonSetDetails{} +func (x *ActiveJobReference) Reset() { + *x = ActiveJobReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[34] + mi := &file_api_v1_common_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DaemonSetDetails) String() string { +func (x *ActiveJobReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DaemonSetDetails) ProtoMessage() {} +func (*ActiveJobReference) ProtoMessage() {} -func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[34] +func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6442,59 +7807,69 @@ func (x *DaemonSetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DaemonSetDetails.ProtoReflect.Descriptor instead. -func (*DaemonSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{34} +// Deprecated: Use ActiveJobReference.ProtoReflect.Descriptor instead. +func (*ActiveJobReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{45} } -func (x *DaemonSetDetails) GetContainers() []*ContainerTemplate { +func (x *ActiveJobReference) GetName() string { if x != nil { - return x.Containers + return x.Name } - return nil + return "" } -func (x *DaemonSetDetails) GetTolerations() []*TolerationInfo { +func (x *ActiveJobReference) GetUid() string { if x != nil { - return x.Tolerations + return x.Uid } - return nil + return "" } -func (x *DaemonSetDetails) GetNodeSelector() *NodeSelector { +func (x *ActiveJobReference) GetNamespace() string { if x != nil { - return x.NodeSelector + return x.Namespace } - return nil + return "" } -// ReplicaSetDetails contains detailed ReplicaSet information for drill-down -type ReplicaSetDetails struct { +func (x *ActiveJobReference) GetCreationTime() int64 { + if x != nil { + return x.CreationTime + } + return 0 +} + +// JobTemplate represents the job template in a CronJob +type JobTemplate 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 pod spec - Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for replica set + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates + BackoffLimit int32 `protobuf:"varint,2,opt,name=backoff_limit,json=backoffLimit,proto3" json:"backoff_limit,omitempty"` // Backoff limit from job template + Completions int32 `protobuf:"varint,3,opt,name=completions,proto3" json:"completions,omitempty"` // Desired completions + Parallelism int32 `protobuf:"varint,4,opt,name=parallelism,proto3" json:"parallelism,omitempty"` // Parallelism setting + CompletionMode string `protobuf:"bytes,5,opt,name=completion_mode,json=completionMode,proto3" json:"completion_mode,omitempty"` // Completion mode } -func (x *ReplicaSetDetails) Reset() { - *x = ReplicaSetDetails{} +func (x *JobTemplate) Reset() { + *x = JobTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[35] + mi := &file_api_v1_common_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReplicaSetDetails) String() string { +func (x *JobTemplate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReplicaSetDetails) ProtoMessage() {} +func (*JobTemplate) ProtoMessage() {} -func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[35] +func (x *JobTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6505,53 +7880,75 @@ func (x *ReplicaSetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReplicaSetDetails.ProtoReflect.Descriptor instead. -func (*ReplicaSetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{35} +// Deprecated: Use JobTemplate.ProtoReflect.Descriptor instead. +func (*JobTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{46} } -func (x *ReplicaSetDetails) GetContainers() []*ContainerTemplate { +func (x *JobTemplate) GetContainers() []*ContainerTemplate { if x != nil { return x.Containers } return nil } -func (x *ReplicaSetDetails) GetSelector() *LabelSelector { +func (x *JobTemplate) GetBackoffLimit() int32 { if x != nil { - return x.Selector + return x.BackoffLimit } - return nil + return 0 } -// JobDetails contains detailed Job information for drill-down -type JobDetails struct { +func (x *JobTemplate) GetCompletions() int32 { + if x != nil { + return x.Completions + } + return 0 +} + +func (x *JobTemplate) GetParallelism() int32 { + if x != nil { + return x.Parallelism + } + return 0 +} + +func (x *JobTemplate) GetCompletionMode() string { + if x != nil { + return x.CompletionMode + } + return "" +} + +// ServiceDetails contains detailed Service information for drill-down +type ServiceDetails 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 pod spec - Conditions []*JobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Job conditions for debugging - Selector *LabelSelector `protobuf:"bytes,3,opt,name=selector,proto3" json:"selector,omitempty"` // Pod selector for job + Ports []*ServicePort `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"` // Detailed port information + Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector + LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,3,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // LoadBalancer ingress points + EndpointAddresses []string `protobuf:"bytes,4,rep,name=endpoint_addresses,json=endpointAddresses,proto3" json:"endpoint_addresses,omitempty"` // Endpoint addresses (if available) } -func (x *JobDetails) Reset() { - *x = JobDetails{} +func (x *ServiceDetails) Reset() { + *x = ServiceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[36] + mi := &file_api_v1_common_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobDetails) String() string { +func (x *ServiceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobDetails) ProtoMessage() {} +func (*ServiceDetails) ProtoMessage() {} -func (x *JobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[36] +func (x *ServiceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6562,63 +7959,71 @@ func (x *JobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobDetails.ProtoReflect.Descriptor instead. -func (*JobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{36} +// Deprecated: Use ServiceDetails.ProtoReflect.Descriptor instead. +func (*ServiceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{47} } -func (x *JobDetails) GetContainers() []*ContainerTemplate { +func (x *ServiceDetails) GetPorts() []*ServicePort { if x != nil { - return x.Containers + return x.Ports } return nil } -func (x *JobDetails) GetConditions() []*JobCondition { +func (x *ServiceDetails) GetSelector() map[string]string { if x != nil { - return x.Conditions + return x.Selector } return nil } -func (x *JobDetails) GetSelector() *LabelSelector { +func (x *ServiceDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { if x != nil { - return x.Selector + return x.LoadBalancerIngress } return nil } -// JobCondition represents a job condition -type JobCondition struct { +func (x *ServiceDetails) GetEndpointAddresses() []string { + if x != nil { + return x.EndpointAddresses + } + return nil +} + +// ServicePort represents a port exposed by a service +type ServicePort struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Complete", "Failed", "SuccessCriteriaMet", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Port name (optional) + Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Service port number + TargetPort int32 `protobuf:"varint,3,opt,name=target_port,json=targetPort,proto3" json:"target_port,omitempty"` // Target port on pods (could be port number or name) + TargetPortName string `protobuf:"bytes,4,opt,name=target_port_name,json=targetPortName,proto3" json:"target_port_name,omitempty"` // Target port name if it's a named port + Protocol string `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"` // Protocol: "TCP", "UDP", "SCTP" + NodePort int32 `protobuf:"varint,6,opt,name=node_port,json=nodePort,proto3" json:"node_port,omitempty"` // NodePort (for NodePort and LoadBalancer services) + AppProtocol string `protobuf:"bytes,7,opt,name=app_protocol,json=appProtocol,proto3" json:"app_protocol,omitempty"` // Application protocol (optional, e.g., "HTTP", "HTTPS") } -func (x *JobCondition) Reset() { - *x = JobCondition{} +func (x *ServicePort) Reset() { + *x = ServicePort{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[37] + mi := &file_api_v1_common_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobCondition) String() string { +func (x *ServicePort) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobCondition) ProtoMessage() {} +func (*ServicePort) ProtoMessage() {} -func (x *JobCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[37] +func (x *ServicePort) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6629,81 +8034,89 @@ func (x *JobCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobCondition.ProtoReflect.Descriptor instead. -func (*JobCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{37} +// Deprecated: Use ServicePort.ProtoReflect.Descriptor instead. +func (*ServicePort) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{48} } -func (x *JobCondition) GetType() string { +func (x *ServicePort) GetName() string { if x != nil { - return x.Type + return x.Name } return "" } -func (x *JobCondition) GetStatus() string { +func (x *ServicePort) GetPort() int32 { if x != nil { - return x.Status + return x.Port } - return "" + return 0 } -func (x *JobCondition) GetReason() string { +func (x *ServicePort) GetTargetPort() int32 { if x != nil { - return x.Reason + return x.TargetPort + } + return 0 +} + +func (x *ServicePort) GetTargetPortName() string { + if x != nil { + return x.TargetPortName } return "" } -func (x *JobCondition) GetMessage() string { +func (x *ServicePort) GetProtocol() string { if x != nil { - return x.Message + return x.Protocol } return "" } -func (x *JobCondition) GetLastProbeTime() int64 { +func (x *ServicePort) GetNodePort() int32 { if x != nil { - return x.LastProbeTime + return x.NodePort } return 0 } -func (x *JobCondition) GetLastTransitionTime() int64 { +func (x *ServicePort) GetAppProtocol() string { if x != nil { - return x.LastTransitionTime + return x.AppProtocol } - return 0 + return "" } -// CronJobDetails contains detailed CronJob information for drill-down -type CronJobDetails struct { +// LoadBalancerIngress represents a load balancer ingress point +type LoadBalancerIngress 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 job template pod spec - ActiveJobs []*ActiveJobReference `protobuf:"bytes,2,rep,name=active_jobs,json=activeJobs,proto3" json:"active_jobs,omitempty"` // Currently active jobs - JobTemplate *JobTemplate `protobuf:"bytes,3,opt,name=job_template,json=jobTemplate,proto3" json:"job_template,omitempty"` // Job template specification + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` // IP address + Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` // Hostname (alternative to IP) + Ports []string `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"` // Ports information from ingress + IpMode string `protobuf:"bytes,4,opt,name=ip_mode,json=ipMode,proto3" json:"ip_mode,omitempty"` // IP mode: "VIP" or "Proxy" } -func (x *CronJobDetails) Reset() { - *x = CronJobDetails{} +func (x *LoadBalancerIngress) Reset() { + *x = LoadBalancerIngress{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[38] + mi := &file_api_v1_common_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CronJobDetails) String() string { +func (x *LoadBalancerIngress) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CronJobDetails) ProtoMessage() {} +func (*LoadBalancerIngress) ProtoMessage() {} -func (x *CronJobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[38] +func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6714,61 +8127,68 @@ func (x *CronJobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CronJobDetails.ProtoReflect.Descriptor instead. -func (*CronJobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{38} +// Deprecated: Use LoadBalancerIngress.ProtoReflect.Descriptor instead. +func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{49} } -func (x *CronJobDetails) GetContainers() []*ContainerTemplate { +func (x *LoadBalancerIngress) GetIp() string { if x != nil { - return x.Containers + return x.Ip } - return nil + return "" } -func (x *CronJobDetails) GetActiveJobs() []*ActiveJobReference { +func (x *LoadBalancerIngress) GetHostname() string { if x != nil { - return x.ActiveJobs + return x.Hostname } - return nil + return "" } -func (x *CronJobDetails) GetJobTemplate() *JobTemplate { +func (x *LoadBalancerIngress) GetPorts() []string { if x != nil { - return x.JobTemplate + return x.Ports } return nil } -// ActiveJobReference represents an active job created by a CronJob -type ActiveJobReference struct { +func (x *LoadBalancerIngress) GetIpMode() string { + if x != nil { + return x.IpMode + } + return "" +} + +// IngressDetails contains detailed Ingress information for drill-down +type IngressDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Job name - Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` // Job UID - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Job namespace - CreationTime int64 `protobuf:"varint,4,opt,name=creation_time,json=creationTime,proto3" json:"creation_time,omitempty"` // Job creation timestamp + Rules []*IngressRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Ingress rules + Tls []*IngressTLS `protobuf:"bytes,2,rep,name=tls,proto3" json:"tls,omitempty"` // TLS configurations + DefaultBackend *IngressBackend `protobuf:"bytes,3,opt,name=default_backend,json=defaultBackend,proto3" json:"default_backend,omitempty"` // Default backend (optional) + LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,4,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // Load balancer status } -func (x *ActiveJobReference) Reset() { - *x = ActiveJobReference{} +func (x *IngressDetails) Reset() { + *x = IngressDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[39] + mi := &file_api_v1_common_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ActiveJobReference) String() string { +func (x *IngressDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ActiveJobReference) ProtoMessage() {} +func (*IngressDetails) ProtoMessage() {} -func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[39] +func (x *IngressDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6779,69 +8199,66 @@ func (x *ActiveJobReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ActiveJobReference.ProtoReflect.Descriptor instead. -func (*ActiveJobReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{39} +// Deprecated: Use IngressDetails.ProtoReflect.Descriptor instead. +func (*IngressDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{50} } -func (x *ActiveJobReference) GetName() string { +func (x *IngressDetails) GetRules() []*IngressRule { if x != nil { - return x.Name + return x.Rules } - return "" + return nil } -func (x *ActiveJobReference) GetUid() string { +func (x *IngressDetails) GetTls() []*IngressTLS { if x != nil { - return x.Uid + return x.Tls } - return "" + return nil } -func (x *ActiveJobReference) GetNamespace() string { +func (x *IngressDetails) GetDefaultBackend() *IngressBackend { if x != nil { - return x.Namespace + return x.DefaultBackend } - return "" + return nil } -func (x *ActiveJobReference) GetCreationTime() int64 { +func (x *IngressDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { if x != nil { - return x.CreationTime + return x.LoadBalancerIngress } - return 0 + return nil } -// JobTemplate represents the job template in a CronJob -type JobTemplate struct { +// IngressRule represents an ingress rule +type IngressRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates - BackoffLimit int32 `protobuf:"varint,2,opt,name=backoff_limit,json=backoffLimit,proto3" json:"backoff_limit,omitempty"` // Backoff limit from job template - Completions int32 `protobuf:"varint,3,opt,name=completions,proto3" json:"completions,omitempty"` // Desired completions - Parallelism int32 `protobuf:"varint,4,opt,name=parallelism,proto3" json:"parallelism,omitempty"` // Parallelism setting - CompletionMode string `protobuf:"bytes,5,opt,name=completion_mode,json=completionMode,proto3" json:"completion_mode,omitempty"` // Completion mode + Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // Host name (optional, empty means all hosts) + Paths []*IngressPath `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` // HTTP paths } -func (x *JobTemplate) Reset() { - *x = JobTemplate{} +func (x *IngressRule) Reset() { + *x = IngressRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[40] + mi := &file_api_v1_common_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *JobTemplate) String() string { +func (x *IngressRule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobTemplate) ProtoMessage() {} +func (*IngressRule) ProtoMessage() {} -func (x *JobTemplate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[40] +func (x *IngressRule) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6852,75 +8269,53 @@ func (x *JobTemplate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobTemplate.ProtoReflect.Descriptor instead. -func (*JobTemplate) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{40} -} - -func (x *JobTemplate) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil -} - -func (x *JobTemplate) GetBackoffLimit() int32 { - if x != nil { - return x.BackoffLimit - } - return 0 -} - -func (x *JobTemplate) GetCompletions() int32 { - if x != nil { - return x.Completions - } - return 0 +// Deprecated: Use IngressRule.ProtoReflect.Descriptor instead. +func (*IngressRule) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{51} } -func (x *JobTemplate) GetParallelism() int32 { +func (x *IngressRule) GetHost() string { if x != nil { - return x.Parallelism + return x.Host } - return 0 + return "" } -func (x *JobTemplate) GetCompletionMode() string { +func (x *IngressRule) GetPaths() []*IngressPath { if x != nil { - return x.CompletionMode + return x.Paths } - return "" + return nil } -// ServiceDetails contains detailed Service information for drill-down -type ServiceDetails struct { +// IngressPath represents a path rule within an ingress +type IngressPath struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ports []*ServicePort `protobuf:"bytes,1,rep,name=ports,proto3" json:"ports,omitempty"` // Detailed port information - Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Service selector - LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,3,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // LoadBalancer ingress points - EndpointAddresses []string `protobuf:"bytes,4,rep,name=endpoint_addresses,json=endpointAddresses,proto3" json:"endpoint_addresses,omitempty"` // Endpoint addresses (if available) + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // URL path + PathType string `protobuf:"bytes,2,opt,name=path_type,json=pathType,proto3" json:"path_type,omitempty"` // Path type: "Exact", "Prefix", "ImplementationSpecific" + Backend *IngressBackend `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"` // Backend service } -func (x *ServiceDetails) Reset() { - *x = ServiceDetails{} +func (x *IngressPath) Reset() { + *x = IngressPath{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[41] + mi := &file_api_v1_common_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServiceDetails) String() string { +func (x *IngressPath) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceDetails) ProtoMessage() {} +func (*IngressPath) ProtoMessage() {} -func (x *ServiceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[41] +func (x *IngressPath) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6931,71 +8326,63 @@ func (x *ServiceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServiceDetails.ProtoReflect.Descriptor instead. -func (*ServiceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{41} -} - -func (x *ServiceDetails) GetPorts() []*ServicePort { - if x != nil { - return x.Ports - } - return nil +// Deprecated: Use IngressPath.ProtoReflect.Descriptor instead. +func (*IngressPath) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{52} } -func (x *ServiceDetails) GetSelector() map[string]string { +func (x *IngressPath) GetPath() string { if x != nil { - return x.Selector + return x.Path } - return nil + return "" } -func (x *ServiceDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { +func (x *IngressPath) GetPathType() string { if x != nil { - return x.LoadBalancerIngress + return x.PathType } - return nil + return "" } -func (x *ServiceDetails) GetEndpointAddresses() []string { +func (x *IngressPath) GetBackend() *IngressBackend { if x != nil { - return x.EndpointAddresses + return x.Backend } return nil } -// ServicePort represents a port exposed by a service -type ServicePort struct { +// IngressBackend represents a backend referenced by an ingress +type IngressBackend struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Port name (optional) - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // Service port number - TargetPort int32 `protobuf:"varint,3,opt,name=target_port,json=targetPort,proto3" json:"target_port,omitempty"` // Target port on pods (could be port number or name) - TargetPortName string `protobuf:"bytes,4,opt,name=target_port_name,json=targetPortName,proto3" json:"target_port_name,omitempty"` // Target port name if it's a named port - Protocol string `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"` // Protocol: "TCP", "UDP", "SCTP" - NodePort int32 `protobuf:"varint,6,opt,name=node_port,json=nodePort,proto3" json:"node_port,omitempty"` // NodePort (for NodePort and LoadBalancer services) - AppProtocol string `protobuf:"bytes,7,opt,name=app_protocol,json=appProtocol,proto3" json:"app_protocol,omitempty"` // Application protocol (optional, e.g., "HTTP", "HTTPS") + ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Service name + ServicePort int32 `protobuf:"varint,2,opt,name=service_port,json=servicePort,proto3" json:"service_port,omitempty"` // Service port number + ServicePortName string `protobuf:"bytes,3,opt,name=service_port_name,json=servicePortName,proto3" json:"service_port_name,omitempty"` // Service port name (alternative to number) + ResourceApiVersion string `protobuf:"bytes,4,opt,name=resource_api_version,json=resourceApiVersion,proto3" json:"resource_api_version,omitempty"` // Resource API version (for non-service backends) + ResourceKind string `protobuf:"bytes,5,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Resource kind (for non-service backends) + ResourceName string `protobuf:"bytes,6,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Resource name (for non-service backends) } -func (x *ServicePort) Reset() { - *x = ServicePort{} +func (x *IngressBackend) Reset() { + *x = IngressBackend{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[42] + mi := &file_api_v1_common_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServicePort) String() string { +func (x *IngressBackend) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServicePort) ProtoMessage() {} +func (*IngressBackend) ProtoMessage() {} -func (x *ServicePort) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[42] +func (x *IngressBackend) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7006,89 +8393,139 @@ func (x *ServicePort) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServicePort.ProtoReflect.Descriptor instead. -func (*ServicePort) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{42} +// Deprecated: Use IngressBackend.ProtoReflect.Descriptor instead. +func (*IngressBackend) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{53} } -func (x *ServicePort) GetName() string { +func (x *IngressBackend) GetServiceName() string { if x != nil { - return x.Name + return x.ServiceName } return "" } -func (x *ServicePort) GetPort() int32 { +func (x *IngressBackend) GetServicePort() int32 { if x != nil { - return x.Port + return x.ServicePort } return 0 } -func (x *ServicePort) GetTargetPort() int32 { +func (x *IngressBackend) GetServicePortName() string { if x != nil { - return x.TargetPort + return x.ServicePortName } - return 0 + return "" } -func (x *ServicePort) GetTargetPortName() string { +func (x *IngressBackend) GetResourceApiVersion() string { if x != nil { - return x.TargetPortName + return x.ResourceApiVersion } return "" } -func (x *ServicePort) GetProtocol() string { +func (x *IngressBackend) GetResourceKind() string { if x != nil { - return x.Protocol + return x.ResourceKind } return "" } -func (x *ServicePort) GetNodePort() int32 { +func (x *IngressBackend) GetResourceName() string { if x != nil { - return x.NodePort + return x.ResourceName } - return 0 + return "" } -func (x *ServicePort) GetAppProtocol() string { +// IngressTLS represents TLS configuration for an ingress +type IngressTLS struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` // Hosts covered by this TLS config + SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` // Secret containing the TLS certificate +} + +func (x *IngressTLS) Reset() { + *x = IngressTLS{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IngressTLS) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IngressTLS) ProtoMessage() {} + +func (x *IngressTLS) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[54] + 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 IngressTLS.ProtoReflect.Descriptor instead. +func (*IngressTLS) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{54} +} + +func (x *IngressTLS) GetHosts() []string { if x != nil { - return x.AppProtocol + return x.Hosts + } + return nil +} + +func (x *IngressTLS) GetSecretName() string { + if x != nil { + return x.SecretName } return "" } -// LoadBalancerIngress represents a load balancer ingress point -type LoadBalancerIngress struct { +// PersistentVolumeClaimDetails contains detailed PVC information for drill-down +type PersistentVolumeClaimDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` // IP address - Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` // Hostname (alternative to IP) - Ports []string `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"` // Ports information from ingress - IpMode string `protobuf:"bytes,4,opt,name=ip_mode,json=ipMode,proto3" json:"ip_mode,omitempty"` // IP mode: "VIP" or "Proxy" + ResourceRequirements *ResourceRequirements `protobuf:"bytes,1,opt,name=resource_requirements,json=resourceRequirements,proto3" json:"resource_requirements,omitempty"` // Storage resource requirements + Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Label selector for PV binding + VolumeNodeAffinity []*VolumeNodeAffinity `protobuf:"bytes,3,rep,name=volume_node_affinity,json=volumeNodeAffinity,proto3" json:"volume_node_affinity,omitempty"` // Node affinity constraints + Conditions []*PVCCondition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty"` // PVC conditions + MountedByPods []string `protobuf:"bytes,5,rep,name=mounted_by_pods,json=mountedByPods,proto3" json:"mounted_by_pods,omitempty"` // Pods currently using this PVC } -func (x *LoadBalancerIngress) Reset() { - *x = LoadBalancerIngress{} +func (x *PersistentVolumeClaimDetails) Reset() { + *x = PersistentVolumeClaimDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[43] + mi := &file_api_v1_common_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LoadBalancerIngress) String() string { +func (x *PersistentVolumeClaimDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LoadBalancerIngress) ProtoMessage() {} +func (*PersistentVolumeClaimDetails) ProtoMessage() {} -func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[43] +func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7099,68 +8536,73 @@ func (x *LoadBalancerIngress) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LoadBalancerIngress.ProtoReflect.Descriptor instead. -func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{43} +// Deprecated: Use PersistentVolumeClaimDetails.ProtoReflect.Descriptor instead. +func (*PersistentVolumeClaimDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{55} } -func (x *LoadBalancerIngress) GetIp() string { +func (x *PersistentVolumeClaimDetails) GetResourceRequirements() *ResourceRequirements { if x != nil { - return x.Ip + return x.ResourceRequirements } - return "" + return nil } -func (x *LoadBalancerIngress) GetHostname() string { +func (x *PersistentVolumeClaimDetails) GetSelector() *LabelSelector { if x != nil { - return x.Hostname + return x.Selector } - return "" + return nil } -func (x *LoadBalancerIngress) GetPorts() []string { +func (x *PersistentVolumeClaimDetails) GetVolumeNodeAffinity() []*VolumeNodeAffinity { if x != nil { - return x.Ports + return x.VolumeNodeAffinity } return nil } -func (x *LoadBalancerIngress) GetIpMode() string { +func (x *PersistentVolumeClaimDetails) GetConditions() []*PVCCondition { if x != nil { - return x.IpMode + return x.Conditions } - return "" + return nil } -// IngressDetails contains detailed Ingress information for drill-down -type IngressDetails struct { +func (x *PersistentVolumeClaimDetails) GetMountedByPods() []string { + if x != nil { + return x.MountedByPods + } + return nil +} + +// ResourceRequirements represents storage resource requirements +type ResourceRequirements struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rules []*IngressRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Ingress rules - Tls []*IngressTLS `protobuf:"bytes,2,rep,name=tls,proto3" json:"tls,omitempty"` // TLS configurations - DefaultBackend *IngressBackend `protobuf:"bytes,3,opt,name=default_backend,json=defaultBackend,proto3" json:"default_backend,omitempty"` // Default backend (optional) - LoadBalancerIngress []*LoadBalancerIngress `protobuf:"bytes,4,rep,name=load_balancer_ingress,json=loadBalancerIngress,proto3" json:"load_balancer_ingress,omitempty"` // Load balancer status + Requests map[string]string `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource requests (e.g., "storage": "50Gi") + Limits map[string]string `protobuf:"bytes,2,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (optional for PVCs) } -func (x *IngressDetails) Reset() { - *x = IngressDetails{} +func (x *ResourceRequirements) Reset() { + *x = ResourceRequirements{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[44] + mi := &file_api_v1_common_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressDetails) String() string { +func (x *ResourceRequirements) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressDetails) ProtoMessage() {} +func (*ResourceRequirements) ProtoMessage() {} -func (x *IngressDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[44] +func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7171,66 +8613,52 @@ func (x *IngressDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressDetails.ProtoReflect.Descriptor instead. -func (*IngressDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{44} -} - -func (x *IngressDetails) GetRules() []*IngressRule { - if x != nil { - return x.Rules - } - return nil -} - -func (x *IngressDetails) GetTls() []*IngressTLS { - if x != nil { - return x.Tls - } - return nil +// Deprecated: Use ResourceRequirements.ProtoReflect.Descriptor instead. +func (*ResourceRequirements) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{56} } -func (x *IngressDetails) GetDefaultBackend() *IngressBackend { +func (x *ResourceRequirements) GetRequests() map[string]string { if x != nil { - return x.DefaultBackend + return x.Requests } return nil } -func (x *IngressDetails) GetLoadBalancerIngress() []*LoadBalancerIngress { +func (x *ResourceRequirements) GetLimits() map[string]string { if x != nil { - return x.LoadBalancerIngress + return x.Limits } return nil } -// IngressRule represents an ingress rule -type IngressRule struct { +// VolumeNodeAffinity represents node affinity constraints for volumes +type VolumeNodeAffinity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` // Host name (optional, empty means all hosts) - Paths []*IngressPath `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` // HTTP paths + Required []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=required,proto3" json:"required,omitempty"` // Required node selector terms + Preferred []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=preferred,proto3" json:"preferred,omitempty"` // Preferred node selector terms } -func (x *IngressRule) Reset() { - *x = IngressRule{} +func (x *VolumeNodeAffinity) Reset() { + *x = VolumeNodeAffinity{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[45] + mi := &file_api_v1_common_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressRule) String() string { +func (x *VolumeNodeAffinity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressRule) ProtoMessage() {} +func (*VolumeNodeAffinity) ProtoMessage() {} -func (x *IngressRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[45] +func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7241,53 +8669,56 @@ func (x *IngressRule) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressRule.ProtoReflect.Descriptor instead. -func (*IngressRule) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{45} +// Deprecated: Use VolumeNodeAffinity.ProtoReflect.Descriptor instead. +func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{57} } -func (x *IngressRule) GetHost() string { +func (x *VolumeNodeAffinity) GetRequired() []*NodeSelectorRequirement { if x != nil { - return x.Host + return x.Required } - return "" + return nil } -func (x *IngressRule) GetPaths() []*IngressPath { +func (x *VolumeNodeAffinity) GetPreferred() []*NodeSelectorRequirement { if x != nil { - return x.Paths + return x.Preferred } return nil } -// IngressPath represents a path rule within an ingress -type IngressPath struct { +// PVCCondition represents a condition of a PVC +type PVCCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // URL path - PathType string `protobuf:"bytes,2,opt,name=path_type,json=pathType,proto3" json:"path_type,omitempty"` // Path type: "Exact", "Prefix", "ImplementationSpecific" - Backend *IngressBackend `protobuf:"bytes,3,opt,name=backend,proto3" json:"backend,omitempty"` // Backend service + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Resizing") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *IngressPath) Reset() { - *x = IngressPath{} +func (x *PVCCondition) Reset() { + *x = PVCCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[46] + mi := &file_api_v1_common_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressPath) String() string { +func (x *PVCCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressPath) ProtoMessage() {} +func (*PVCCondition) ProtoMessage() {} -func (x *IngressPath) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[46] +func (x *PVCCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7298,63 +8729,83 @@ func (x *IngressPath) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressPath.ProtoReflect.Descriptor instead. -func (*IngressPath) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{46} +// Deprecated: Use PVCCondition.ProtoReflect.Descriptor instead. +func (*PVCCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{58} } -func (x *IngressPath) GetPath() string { +func (x *PVCCondition) GetType() string { if x != nil { - return x.Path + return x.Type } return "" } -func (x *IngressPath) GetPathType() string { +func (x *PVCCondition) GetStatus() string { if x != nil { - return x.PathType + return x.Status } return "" } -func (x *IngressPath) GetBackend() *IngressBackend { +func (x *PVCCondition) GetReason() string { if x != nil { - return x.Backend + return x.Reason } - return nil + return "" } -// IngressBackend represents a backend referenced by an ingress -type IngressBackend struct { +func (x *PVCCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *PVCCondition) GetLastProbeTime() int64 { + if x != nil { + return x.LastProbeTime + } + return 0 +} + +func (x *PVCCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime + } + return 0 +} + +// PersistentVolumeDetails contains detailed PV information for drill-down +type PersistentVolumeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ServiceName string `protobuf:"bytes,1,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` // Service name - ServicePort int32 `protobuf:"varint,2,opt,name=service_port,json=servicePort,proto3" json:"service_port,omitempty"` // Service port number - ServicePortName string `protobuf:"bytes,3,opt,name=service_port_name,json=servicePortName,proto3" json:"service_port_name,omitempty"` // Service port name (alternative to number) - ResourceApiVersion string `protobuf:"bytes,4,opt,name=resource_api_version,json=resourceApiVersion,proto3" json:"resource_api_version,omitempty"` // Resource API version (for non-service backends) - ResourceKind string `protobuf:"bytes,5,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Resource kind (for non-service backends) - ResourceName string `protobuf:"bytes,6,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Resource name (for non-service backends) + Capacity map[string]string `protobuf:"bytes,1,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage capacity resources + ClaimRef *PVClaimReference `protobuf:"bytes,2,opt,name=claim_ref,json=claimRef,proto3" json:"claim_ref,omitempty"` // Reference to bound PVC + VolumeSource *PVVolumeSource `protobuf:"bytes,3,opt,name=volume_source,json=volumeSource,proto3" json:"volume_source,omitempty"` // Volume source (CSI, HostPath, etc.) + NodeAffinity *NodeSelector `protobuf:"bytes,4,opt,name=node_affinity,json=nodeAffinity,proto3" json:"node_affinity,omitempty"` // Node affinity constraints + MountOptions []string `protobuf:"bytes,5,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Mount options for the volume } -func (x *IngressBackend) Reset() { - *x = IngressBackend{} +func (x *PersistentVolumeDetails) Reset() { + *x = PersistentVolumeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[47] + mi := &file_api_v1_common_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressBackend) String() string { +func (x *PersistentVolumeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressBackend) ProtoMessage() {} +func (*PersistentVolumeDetails) ProtoMessage() {} -func (x *IngressBackend) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[47] +func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7365,80 +8816,76 @@ func (x *IngressBackend) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressBackend.ProtoReflect.Descriptor instead. -func (*IngressBackend) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{47} -} - -func (x *IngressBackend) GetServiceName() string { - if x != nil { - return x.ServiceName - } - return "" +// Deprecated: Use PersistentVolumeDetails.ProtoReflect.Descriptor instead. +func (*PersistentVolumeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{59} } -func (x *IngressBackend) GetServicePort() int32 { +func (x *PersistentVolumeDetails) GetCapacity() map[string]string { if x != nil { - return x.ServicePort + return x.Capacity } - return 0 + return nil } -func (x *IngressBackend) GetServicePortName() string { +func (x *PersistentVolumeDetails) GetClaimRef() *PVClaimReference { if x != nil { - return x.ServicePortName + return x.ClaimRef } - return "" + return nil } -func (x *IngressBackend) GetResourceApiVersion() string { +func (x *PersistentVolumeDetails) GetVolumeSource() *PVVolumeSource { if x != nil { - return x.ResourceApiVersion + return x.VolumeSource } - return "" + return nil } -func (x *IngressBackend) GetResourceKind() string { +func (x *PersistentVolumeDetails) GetNodeAffinity() *NodeSelector { if x != nil { - return x.ResourceKind + return x.NodeAffinity } - return "" + return nil } -func (x *IngressBackend) GetResourceName() string { +func (x *PersistentVolumeDetails) GetMountOptions() []string { if x != nil { - return x.ResourceName + return x.MountOptions } - return "" + return nil } -// IngressTLS represents TLS configuration for an ingress -type IngressTLS struct { +// PVClaimReference represents a reference to a PVC +type PVClaimReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` // Hosts covered by this TLS config - SecretName string `protobuf:"bytes,2,opt,name=secret_name,json=secretName,proto3" json:"secret_name,omitempty"` // Secret containing the TLS certificate + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC name + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` // PVC namespace + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // PVC UID + ApiVersion string `protobuf:"bytes,4,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + ResourceVersion string `protobuf:"bytes,5,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Resource version } -func (x *IngressTLS) Reset() { - *x = IngressTLS{} +func (x *PVClaimReference) Reset() { + *x = PVClaimReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[48] + mi := &file_api_v1_common_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IngressTLS) String() string { +func (x *PVClaimReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IngressTLS) ProtoMessage() {} +func (*PVClaimReference) ProtoMessage() {} -func (x *IngressTLS) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[48] +func (x *PVClaimReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7449,55 +8896,76 @@ func (x *IngressTLS) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IngressTLS.ProtoReflect.Descriptor instead. -func (*IngressTLS) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{48} +// Deprecated: Use PVClaimReference.ProtoReflect.Descriptor instead. +func (*PVClaimReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{60} } -func (x *IngressTLS) GetHosts() []string { +func (x *PVClaimReference) GetName() string { if x != nil { - return x.Hosts + return x.Name } - return nil + return "" } -func (x *IngressTLS) GetSecretName() string { +func (x *PVClaimReference) GetNamespace() string { if x != nil { - return x.SecretName + return x.Namespace } return "" } -// PersistentVolumeClaimDetails contains detailed PVC information for drill-down -type PersistentVolumeClaimDetails struct { +func (x *PVClaimReference) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *PVClaimReference) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +func (x *PVClaimReference) GetResourceVersion() string { + if x != nil { + return x.ResourceVersion + } + return "" +} + +// PVVolumeSource represents the source of a persistent volume +type PVVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourceRequirements *ResourceRequirements `protobuf:"bytes,1,opt,name=resource_requirements,json=resourceRequirements,proto3" json:"resource_requirements,omitempty"` // Storage resource requirements - Selector *LabelSelector `protobuf:"bytes,2,opt,name=selector,proto3" json:"selector,omitempty"` // Label selector for PV binding - VolumeNodeAffinity []*VolumeNodeAffinity `protobuf:"bytes,3,rep,name=volume_node_affinity,json=volumeNodeAffinity,proto3" json:"volume_node_affinity,omitempty"` // Node affinity constraints - Conditions []*PVCCondition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty"` // PVC conditions - MountedByPods []string `protobuf:"bytes,5,rep,name=mounted_by_pods,json=mountedByPods,proto3" json:"mounted_by_pods,omitempty"` // Pods currently using this PVC + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Volume source type + Csi *CSIVolumeSource `protobuf:"bytes,2,opt,name=csi,proto3" json:"csi,omitempty"` // CSI volume source (if applicable) + HostPath *HostPathVolumeSource `protobuf:"bytes,3,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` // HostPath volume source (if applicable) + Nfs *NFSVolumeSource `protobuf:"bytes,4,opt,name=nfs,proto3" json:"nfs,omitempty"` // NFS volume source (if applicable) + VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Additional volume attributes } -func (x *PersistentVolumeClaimDetails) Reset() { - *x = PersistentVolumeClaimDetails{} +func (x *PVVolumeSource) Reset() { + *x = PVVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[49] + mi := &file_api_v1_common_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PersistentVolumeClaimDetails) String() string { +func (x *PVVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PersistentVolumeClaimDetails) ProtoMessage() {} +func (*PVVolumeSource) ProtoMessage() {} -func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[49] +func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7508,73 +8976,76 @@ func (x *PersistentVolumeClaimDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PersistentVolumeClaimDetails.ProtoReflect.Descriptor instead. -func (*PersistentVolumeClaimDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{49} +// Deprecated: Use PVVolumeSource.ProtoReflect.Descriptor instead. +func (*PVVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{61} } -func (x *PersistentVolumeClaimDetails) GetResourceRequirements() *ResourceRequirements { +func (x *PVVolumeSource) GetType() string { if x != nil { - return x.ResourceRequirements + return x.Type } - return nil + return "" } -func (x *PersistentVolumeClaimDetails) GetSelector() *LabelSelector { +func (x *PVVolumeSource) GetCsi() *CSIVolumeSource { if x != nil { - return x.Selector + return x.Csi } return nil } -func (x *PersistentVolumeClaimDetails) GetVolumeNodeAffinity() []*VolumeNodeAffinity { +func (x *PVVolumeSource) GetHostPath() *HostPathVolumeSource { if x != nil { - return x.VolumeNodeAffinity + return x.HostPath } return nil } -func (x *PersistentVolumeClaimDetails) GetConditions() []*PVCCondition { +func (x *PVVolumeSource) GetNfs() *NFSVolumeSource { if x != nil { - return x.Conditions + return x.Nfs } return nil } -func (x *PersistentVolumeClaimDetails) GetMountedByPods() []string { +func (x *PVVolumeSource) GetVolumeAttributes() map[string]string { if x != nil { - return x.MountedByPods + return x.VolumeAttributes } return nil } -// ResourceRequirements represents storage resource requirements -type ResourceRequirements struct { +// CSIVolumeSource represents a CSI volume source +type CSIVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Requests map[string]string `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource requests (e.g., "storage": "50Gi") - Limits map[string]string `protobuf:"bytes,2,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (optional for PVCs) + Driver string `protobuf:"bytes,1,opt,name=driver,proto3" json:"driver,omitempty"` // CSI driver name + VolumeHandle string `protobuf:"bytes,2,opt,name=volume_handle,json=volumeHandle,proto3" json:"volume_handle,omitempty"` // Volume handle/ID + FsType string `protobuf:"bytes,3,opt,name=fs_type,json=fsType,proto3" json:"fs_type,omitempty"` // Filesystem type + ReadOnly bool `protobuf:"varint,4,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether volume is read-only + VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // CSI volume attributes } -func (x *ResourceRequirements) Reset() { - *x = ResourceRequirements{} +func (x *CSIVolumeSource) Reset() { + *x = CSIVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[50] + mi := &file_api_v1_common_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceRequirements) String() string { +func (x *CSIVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceRequirements) ProtoMessage() {} +func (*CSIVolumeSource) ProtoMessage() {} -func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[50] +func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7585,52 +9056,73 @@ func (x *ResourceRequirements) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceRequirements.ProtoReflect.Descriptor instead. -func (*ResourceRequirements) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{50} +// Deprecated: Use CSIVolumeSource.ProtoReflect.Descriptor instead. +func (*CSIVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{62} } -func (x *ResourceRequirements) GetRequests() map[string]string { +func (x *CSIVolumeSource) GetDriver() string { if x != nil { - return x.Requests + return x.Driver } - return nil + return "" } -func (x *ResourceRequirements) GetLimits() map[string]string { +func (x *CSIVolumeSource) GetVolumeHandle() string { if x != nil { - return x.Limits + return x.VolumeHandle + } + return "" +} + +func (x *CSIVolumeSource) GetFsType() string { + if x != nil { + return x.FsType + } + return "" +} + +func (x *CSIVolumeSource) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *CSIVolumeSource) GetVolumeAttributes() map[string]string { + if x != nil { + return x.VolumeAttributes } return nil } -// VolumeNodeAffinity represents node affinity constraints for volumes -type VolumeNodeAffinity struct { +// HostPathVolumeSource represents a host path volume source +type HostPathVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Required []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=required,proto3" json:"required,omitempty"` // Required node selector terms - Preferred []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=preferred,proto3" json:"preferred,omitempty"` // Preferred node selector terms + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Host path + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // Path type (e.g., "Directory", "File") } -func (x *VolumeNodeAffinity) Reset() { - *x = VolumeNodeAffinity{} +func (x *HostPathVolumeSource) Reset() { + *x = HostPathVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[51] + mi := &file_api_v1_common_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolumeNodeAffinity) String() string { +func (x *HostPathVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolumeNodeAffinity) ProtoMessage() {} +func (*HostPathVolumeSource) ProtoMessage() {} -func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[51] +func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7641,56 +9133,53 @@ func (x *VolumeNodeAffinity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolumeNodeAffinity.ProtoReflect.Descriptor instead. -func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{51} +// Deprecated: Use HostPathVolumeSource.ProtoReflect.Descriptor instead. +func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{63} } -func (x *VolumeNodeAffinity) GetRequired() []*NodeSelectorRequirement { +func (x *HostPathVolumeSource) GetPath() string { if x != nil { - return x.Required + return x.Path } - return nil + return "" } -func (x *VolumeNodeAffinity) GetPreferred() []*NodeSelectorRequirement { +func (x *HostPathVolumeSource) GetType() string { if x != nil { - return x.Preferred + return x.Type } - return nil + return "" } -// PVCCondition represents a condition of a PVC -type PVCCondition struct { +// NFSVolumeSource represents an NFS volume source +type NFSVolumeSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Resizing") - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastProbeTime int64 `protobuf:"varint,5,opt,name=last_probe_time,json=lastProbeTime,proto3" json:"last_probe_time,omitempty"` // Last time condition was probed - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` // NFS server + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // NFS path + ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether NFS mount is read-only } -func (x *PVCCondition) Reset() { - *x = PVCCondition{} +func (x *NFSVolumeSource) Reset() { + *x = NFSVolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[52] + mi := &file_api_v1_common_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVCCondition) String() string { +func (x *NFSVolumeSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVCCondition) ProtoMessage() {} +func (*NFSVolumeSource) ProtoMessage() {} -func (x *PVCCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[52] +func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7701,83 +9190,64 @@ func (x *PVCCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVCCondition.ProtoReflect.Descriptor instead. -func (*PVCCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{52} -} - -func (x *PVCCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *PVCCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use NFSVolumeSource.ProtoReflect.Descriptor instead. +func (*NFSVolumeSource) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{64} } -func (x *PVCCondition) GetReason() string { +func (x *NFSVolumeSource) GetServer() string { if x != nil { - return x.Reason + return x.Server } return "" } -func (x *PVCCondition) GetMessage() string { +func (x *NFSVolumeSource) GetPath() string { if x != nil { - return x.Message + return x.Path } return "" } -func (x *PVCCondition) GetLastProbeTime() int64 { - if x != nil { - return x.LastProbeTime - } - return 0 -} - -func (x *PVCCondition) GetLastTransitionTime() int64 { +func (x *NFSVolumeSource) GetReadOnly() bool { if x != nil { - return x.LastTransitionTime + return x.ReadOnly } - return 0 + return false } -// PersistentVolumeDetails contains detailed PV information for drill-down -type PersistentVolumeDetails struct { +// StorageClassDetails contains detailed StorageClass information for drill-down +type StorageClassDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Capacity map[string]string `protobuf:"bytes,1,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage capacity resources - ClaimRef *PVClaimReference `protobuf:"bytes,2,opt,name=claim_ref,json=claimRef,proto3" json:"claim_ref,omitempty"` // Reference to bound PVC - VolumeSource *PVVolumeSource `protobuf:"bytes,3,opt,name=volume_source,json=volumeSource,proto3" json:"volume_source,omitempty"` // Volume source (CSI, HostPath, etc.) - NodeAffinity *NodeSelector `protobuf:"bytes,4,opt,name=node_affinity,json=nodeAffinity,proto3" json:"node_affinity,omitempty"` // Node affinity constraints - MountOptions []string `protobuf:"bytes,5,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Mount options for the volume + Provisioner string `protobuf:"bytes,1,opt,name=provisioner,proto3" json:"provisioner,omitempty"` // Storage provisioner + Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters + AllowedTopologies []*TopologySelector `protobuf:"bytes,3,rep,name=allowed_topologies,json=allowedTopologies,proto3" json:"allowed_topologies,omitempty"` // Allowed topologies + MountOptions []string `protobuf:"bytes,4,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Default mount options + VolumeBindingMode string `protobuf:"bytes,5,opt,name=volume_binding_mode,json=volumeBindingMode,proto3" json:"volume_binding_mode,omitempty"` // Volume binding mode + ReclaimPolicy string `protobuf:"bytes,6,opt,name=reclaim_policy,json=reclaimPolicy,proto3" json:"reclaim_policy,omitempty"` // Default reclaim policy + AllowVolumeExpansion bool `protobuf:"varint,7,opt,name=allow_volume_expansion,json=allowVolumeExpansion,proto3" json:"allow_volume_expansion,omitempty"` // Whether volume expansion is allowed } -func (x *PersistentVolumeDetails) Reset() { - *x = PersistentVolumeDetails{} +func (x *StorageClassDetails) Reset() { + *x = StorageClassDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[53] + mi := &file_api_v1_common_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PersistentVolumeDetails) String() string { +func (x *StorageClassDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PersistentVolumeDetails) ProtoMessage() {} +func (*StorageClassDetails) ProtoMessage() {} -func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[53] +func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7788,76 +9258,88 @@ func (x *PersistentVolumeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PersistentVolumeDetails.ProtoReflect.Descriptor instead. -func (*PersistentVolumeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{53} +// Deprecated: Use StorageClassDetails.ProtoReflect.Descriptor instead. +func (*StorageClassDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{65} } -func (x *PersistentVolumeDetails) GetCapacity() map[string]string { +func (x *StorageClassDetails) GetProvisioner() string { if x != nil { - return x.Capacity + return x.Provisioner } - return nil + return "" } -func (x *PersistentVolumeDetails) GetClaimRef() *PVClaimReference { +func (x *StorageClassDetails) GetParameters() map[string]string { if x != nil { - return x.ClaimRef + return x.Parameters } return nil } -func (x *PersistentVolumeDetails) GetVolumeSource() *PVVolumeSource { +func (x *StorageClassDetails) GetAllowedTopologies() []*TopologySelector { if x != nil { - return x.VolumeSource + return x.AllowedTopologies } return nil } -func (x *PersistentVolumeDetails) GetNodeAffinity() *NodeSelector { +func (x *StorageClassDetails) GetMountOptions() []string { if x != nil { - return x.NodeAffinity + return x.MountOptions } return nil } -func (x *PersistentVolumeDetails) GetMountOptions() []string { +func (x *StorageClassDetails) GetVolumeBindingMode() string { if x != nil { - return x.MountOptions + return x.VolumeBindingMode } - return nil + return "" } -// PVClaimReference represents a reference to a PVC -type PVClaimReference struct { +func (x *StorageClassDetails) GetReclaimPolicy() string { + if x != nil { + return x.ReclaimPolicy + } + return "" +} + +func (x *StorageClassDetails) GetAllowVolumeExpansion() bool { + if x != nil { + return x.AllowVolumeExpansion + } + return false +} + +// NamespaceDetails contains detailed Namespace information for drill-down +type NamespaceDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // PVC name - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` // PVC namespace - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` // PVC UID - ApiVersion string `protobuf:"bytes,4,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version - ResourceVersion string `protobuf:"bytes,5,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` // Resource version + Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"` // Namespace phase: "Active", "Terminating" + Finalizers []string `protobuf:"bytes,2,rep,name=finalizers,proto3" json:"finalizers,omitempty"` // Finalizers preventing deletion + Conditions map[string]string `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Namespace conditions if any } -func (x *PVClaimReference) Reset() { - *x = PVClaimReference{} +func (x *NamespaceDetails) Reset() { + *x = NamespaceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[54] + mi := &file_api_v1_common_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVClaimReference) String() string { +func (x *NamespaceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVClaimReference) ProtoMessage() {} +func (*NamespaceDetails) ProtoMessage() {} -func (x *PVClaimReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[54] +func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7868,76 +9350,69 @@ func (x *PVClaimReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVClaimReference.ProtoReflect.Descriptor instead. -func (*PVClaimReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{54} -} - -func (x *PVClaimReference) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *PVClaimReference) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" +// Deprecated: Use NamespaceDetails.ProtoReflect.Descriptor instead. +func (*NamespaceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{66} } -func (x *PVClaimReference) GetUid() string { +func (x *NamespaceDetails) GetPhase() string { if x != nil { - return x.Uid + return x.Phase } return "" } -func (x *PVClaimReference) GetApiVersion() string { +func (x *NamespaceDetails) GetFinalizers() []string { if x != nil { - return x.ApiVersion + return x.Finalizers } - return "" + return nil } -func (x *PVClaimReference) GetResourceVersion() string { +func (x *NamespaceDetails) GetConditions() map[string]string { if x != nil { - return x.ResourceVersion + return x.Conditions } - return "" + return nil } -// PVVolumeSource represents the source of a persistent volume -type PVVolumeSource struct { +// NodeDetails contains detailed Node information for drill-down +type NodeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Volume source type - Csi *CSIVolumeSource `protobuf:"bytes,2,opt,name=csi,proto3" json:"csi,omitempty"` // CSI volume source (if applicable) - HostPath *HostPathVolumeSource `protobuf:"bytes,3,opt,name=host_path,json=hostPath,proto3" json:"host_path,omitempty"` // HostPath volume source (if applicable) - Nfs *NFSVolumeSource `protobuf:"bytes,4,opt,name=nfs,proto3" json:"nfs,omitempty"` // NFS volume source (if applicable) - VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Additional volume attributes + Addresses []*NodeAddress `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` // Node addresses (Internal/External IP, DNS, etc.) + Conditions []*NodeCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Node conditions (Ready, MemoryPressure, etc.) + SystemInfo *NodeSystemInfo `protobuf:"bytes,3,opt,name=system_info,json=systemInfo,proto3" json:"system_info,omitempty"` // System information (OS, kernel, etc.) + Capacity map[string]string `protobuf:"bytes,4,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource capacity (cpu, memory, etc.) + Allocatable map[string]string `protobuf:"bytes,5,rep,name=allocatable,proto3" json:"allocatable,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Allocatable resources + Images []*NodeImage `protobuf:"bytes,6,rep,name=images,proto3" json:"images,omitempty"` // Container images on the node + // Desired MIG partitioning profile from the nvidia.com/mig.config node + // label; empty on nodes without MIG management. + MigConfigDesired string `protobuf:"bytes,7,opt,name=mig_config_desired,json=migConfigDesired,proto3" json:"mig_config_desired,omitempty"` + // Applied MIG state from the nvidia.com/mig.config.state node label + // (e.g. success, pending, failed); empty on nodes without MIG management. + MigConfigState string `protobuf:"bytes,8,opt,name=mig_config_state,json=migConfigState,proto3" json:"mig_config_state,omitempty"` } -func (x *PVVolumeSource) Reset() { - *x = PVVolumeSource{} +func (x *NodeDetails) Reset() { + *x = NodeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[55] + mi := &file_api_v1_common_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PVVolumeSource) String() string { +func (x *NodeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PVVolumeSource) ProtoMessage() {} +func (*NodeDetails) ProtoMessage() {} -func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[55] +func (x *NodeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7948,76 +9423,96 @@ func (x *PVVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PVVolumeSource.ProtoReflect.Descriptor instead. -func (*PVVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{55} +// Deprecated: Use NodeDetails.ProtoReflect.Descriptor instead. +func (*NodeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{67} } -func (x *PVVolumeSource) GetType() string { +func (x *NodeDetails) GetAddresses() []*NodeAddress { if x != nil { - return x.Type + return x.Addresses } - return "" + return nil } -func (x *PVVolumeSource) GetCsi() *CSIVolumeSource { +func (x *NodeDetails) GetConditions() []*NodeCondition { if x != nil { - return x.Csi + return x.Conditions } return nil } -func (x *PVVolumeSource) GetHostPath() *HostPathVolumeSource { +func (x *NodeDetails) GetSystemInfo() *NodeSystemInfo { if x != nil { - return x.HostPath + return x.SystemInfo } return nil } -func (x *PVVolumeSource) GetNfs() *NFSVolumeSource { +func (x *NodeDetails) GetCapacity() map[string]string { if x != nil { - return x.Nfs + return x.Capacity } return nil } -func (x *PVVolumeSource) GetVolumeAttributes() map[string]string { +func (x *NodeDetails) GetAllocatable() map[string]string { if x != nil { - return x.VolumeAttributes + return x.Allocatable } return nil } -// CSIVolumeSource represents a CSI volume source -type CSIVolumeSource struct { +func (x *NodeDetails) GetImages() []*NodeImage { + if x != nil { + return x.Images + } + return nil +} + +func (x *NodeDetails) GetMigConfigDesired() string { + if x != nil { + return x.MigConfigDesired + } + return "" +} + +func (x *NodeDetails) GetMigConfigState() string { + if x != nil { + return x.MigConfigState + } + return "" +} + +// NodeTaint represents a node taint that affects pod scheduling +type NodeTaint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Driver string `protobuf:"bytes,1,opt,name=driver,proto3" json:"driver,omitempty"` // CSI driver name - VolumeHandle string `protobuf:"bytes,2,opt,name=volume_handle,json=volumeHandle,proto3" json:"volume_handle,omitempty"` // Volume handle/ID - FsType string `protobuf:"bytes,3,opt,name=fs_type,json=fsType,proto3" json:"fs_type,omitempty"` // Filesystem type - ReadOnly bool `protobuf:"varint,4,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether volume is read-only - VolumeAttributes map[string]string `protobuf:"bytes,5,rep,name=volume_attributes,json=volumeAttributes,proto3" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // CSI volume attributes + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Taint key + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Taint value (optional) + Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // Taint effect: "NoSchedule", "PreferNoSchedule", "NoExecute" + TimeAdded int64 `protobuf:"varint,4,opt,name=time_added,json=timeAdded,proto3" json:"time_added,omitempty"` // When the taint was added (optional) } -func (x *CSIVolumeSource) Reset() { - *x = CSIVolumeSource{} +func (x *NodeTaint) Reset() { + *x = NodeTaint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[56] + mi := &file_api_v1_common_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CSIVolumeSource) String() string { +func (x *NodeTaint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CSIVolumeSource) ProtoMessage() {} +func (*NodeTaint) ProtoMessage() {} -func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[56] +func (x *NodeTaint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8028,73 +9523,66 @@ func (x *CSIVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CSIVolumeSource.ProtoReflect.Descriptor instead. -func (*CSIVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{56} +// Deprecated: Use NodeTaint.ProtoReflect.Descriptor instead. +func (*NodeTaint) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{68} } -func (x *CSIVolumeSource) GetDriver() string { +func (x *NodeTaint) GetKey() string { if x != nil { - return x.Driver + return x.Key } return "" } -func (x *CSIVolumeSource) GetVolumeHandle() string { +func (x *NodeTaint) GetValue() string { if x != nil { - return x.VolumeHandle + return x.Value } return "" } -func (x *CSIVolumeSource) GetFsType() string { +func (x *NodeTaint) GetEffect() string { if x != nil { - return x.FsType + return x.Effect } return "" } -func (x *CSIVolumeSource) GetReadOnly() bool { - if x != nil { - return x.ReadOnly - } - return false -} - -func (x *CSIVolumeSource) GetVolumeAttributes() map[string]string { +func (x *NodeTaint) GetTimeAdded() int64 { if x != nil { - return x.VolumeAttributes + return x.TimeAdded } - return nil + return 0 } -// HostPathVolumeSource represents a host path volume source -type HostPathVolumeSource struct { +// NodeAddress represents a node address +type NodeAddress struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Host path - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // Path type (e.g., "Directory", "File") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Address type: "InternalIP", "ExternalIP", "InternalDNS", "ExternalDNS", "Hostname" + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // The address value } -func (x *HostPathVolumeSource) Reset() { - *x = HostPathVolumeSource{} +func (x *NodeAddress) Reset() { + *x = NodeAddress{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[57] + mi := &file_api_v1_common_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HostPathVolumeSource) String() string { +func (x *NodeAddress) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HostPathVolumeSource) ProtoMessage() {} +func (*NodeAddress) ProtoMessage() {} -func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[57] +func (x *NodeAddress) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8105,53 +9593,56 @@ func (x *HostPathVolumeSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HostPathVolumeSource.ProtoReflect.Descriptor instead. -func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{57} +// Deprecated: Use NodeAddress.ProtoReflect.Descriptor instead. +func (*NodeAddress) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{69} } -func (x *HostPathVolumeSource) GetPath() string { +func (x *NodeAddress) GetType() string { if x != nil { - return x.Path + return x.Type } return "" } -func (x *HostPathVolumeSource) GetType() string { +func (x *NodeAddress) GetAddress() string { if x != nil { - return x.Type + return x.Address } return "" } -// NFSVolumeSource represents an NFS volume source -type NFSVolumeSource struct { +// NodeCondition represents a node condition +type NodeCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Server string `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` // NFS server - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // NFS path - ReadOnly bool `protobuf:"varint,3,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` // Whether NFS mount is read-only + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "Ready", "MemoryPressure", "DiskPressure", "PIDPressure", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastHeartbeatTime int64 `protobuf:"varint,5,opt,name=last_heartbeat_time,json=lastHeartbeatTime,proto3" json:"last_heartbeat_time,omitempty"` // Last heartbeat time + LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *NFSVolumeSource) Reset() { - *x = NFSVolumeSource{} +func (x *NodeCondition) Reset() { + *x = NodeCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[58] + mi := &file_api_v1_common_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NFSVolumeSource) String() string { +func (x *NodeCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NFSVolumeSource) ProtoMessage() {} +func (*NodeCondition) ProtoMessage() {} -func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[58] +func (x *NodeCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8159,67 +9650,91 @@ func (x *NFSVolumeSource) ProtoReflect() protoreflect.Message { } return ms } - return mi.MessageOf(x) + return mi.MessageOf(x) +} + +// Deprecated: Use NodeCondition.ProtoReflect.Descriptor instead. +func (*NodeCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{70} +} + +func (x *NodeCondition) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *NodeCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" } -// Deprecated: Use NFSVolumeSource.ProtoReflect.Descriptor instead. -func (*NFSVolumeSource) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{58} +func (x *NodeCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" } -func (x *NFSVolumeSource) GetServer() string { +func (x *NodeCondition) GetMessage() string { if x != nil { - return x.Server + return x.Message } return "" } -func (x *NFSVolumeSource) GetPath() string { +func (x *NodeCondition) GetLastHeartbeatTime() int64 { if x != nil { - return x.Path + return x.LastHeartbeatTime } - return "" + return 0 } -func (x *NFSVolumeSource) GetReadOnly() bool { +func (x *NodeCondition) GetLastTransitionTime() int64 { if x != nil { - return x.ReadOnly + return x.LastTransitionTime } - return false + return 0 } -// StorageClassDetails contains detailed StorageClass information for drill-down -type StorageClassDetails struct { +// NodeSystemInfo represents node system information +type NodeSystemInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Provisioner string `protobuf:"bytes,1,opt,name=provisioner,proto3" json:"provisioner,omitempty"` // Storage provisioner - Parameters map[string]string `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Storage class parameters - AllowedTopologies []*TopologySelector `protobuf:"bytes,3,rep,name=allowed_topologies,json=allowedTopologies,proto3" json:"allowed_topologies,omitempty"` // Allowed topologies - MountOptions []string `protobuf:"bytes,4,rep,name=mount_options,json=mountOptions,proto3" json:"mount_options,omitempty"` // Default mount options - VolumeBindingMode string `protobuf:"bytes,5,opt,name=volume_binding_mode,json=volumeBindingMode,proto3" json:"volume_binding_mode,omitempty"` // Volume binding mode - ReclaimPolicy string `protobuf:"bytes,6,opt,name=reclaim_policy,json=reclaimPolicy,proto3" json:"reclaim_policy,omitempty"` // Default reclaim policy - AllowVolumeExpansion bool `protobuf:"varint,7,opt,name=allow_volume_expansion,json=allowVolumeExpansion,proto3" json:"allow_volume_expansion,omitempty"` // Whether volume expansion is allowed + MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` // Machine ID + SystemUuid string `protobuf:"bytes,2,opt,name=system_uuid,json=systemUuid,proto3" json:"system_uuid,omitempty"` // System UUID + BootId string `protobuf:"bytes,3,opt,name=boot_id,json=bootId,proto3" json:"boot_id,omitempty"` // Boot ID + KernelVersion string `protobuf:"bytes,4,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"` // Kernel version + OsImage string `protobuf:"bytes,5,opt,name=os_image,json=osImage,proto3" json:"os_image,omitempty"` // OS image + ContainerRuntimeVersion string `protobuf:"bytes,6,opt,name=container_runtime_version,json=containerRuntimeVersion,proto3" json:"container_runtime_version,omitempty"` // Container runtime version + KubeletVersion string `protobuf:"bytes,7,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // Kubelet version + KubeProxyVersion string `protobuf:"bytes,8,opt,name=kube_proxy_version,json=kubeProxyVersion,proto3" json:"kube_proxy_version,omitempty"` // Kube-proxy version + OperatingSystem string `protobuf:"bytes,9,opt,name=operating_system,json=operatingSystem,proto3" json:"operating_system,omitempty"` // Operating system + Architecture string `protobuf:"bytes,10,opt,name=architecture,proto3" json:"architecture,omitempty"` // Architecture } -func (x *StorageClassDetails) Reset() { - *x = StorageClassDetails{} +func (x *NodeSystemInfo) Reset() { + *x = NodeSystemInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[59] + mi := &file_api_v1_common_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StorageClassDetails) String() string { +func (x *NodeSystemInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StorageClassDetails) ProtoMessage() {} +func (*NodeSystemInfo) ProtoMessage() {} -func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[59] +func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8230,88 +9745,108 @@ func (x *StorageClassDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StorageClassDetails.ProtoReflect.Descriptor instead. -func (*StorageClassDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{59} +// Deprecated: Use NodeSystemInfo.ProtoReflect.Descriptor instead. +func (*NodeSystemInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{71} } -func (x *StorageClassDetails) GetProvisioner() string { +func (x *NodeSystemInfo) GetMachineId() string { if x != nil { - return x.Provisioner + return x.MachineId } return "" } -func (x *StorageClassDetails) GetParameters() map[string]string { +func (x *NodeSystemInfo) GetSystemUuid() string { if x != nil { - return x.Parameters + return x.SystemUuid } - return nil + return "" } -func (x *StorageClassDetails) GetAllowedTopologies() []*TopologySelector { +func (x *NodeSystemInfo) GetBootId() string { if x != nil { - return x.AllowedTopologies + return x.BootId } - return nil + return "" } -func (x *StorageClassDetails) GetMountOptions() []string { +func (x *NodeSystemInfo) GetKernelVersion() string { if x != nil { - return x.MountOptions + return x.KernelVersion } - return nil + return "" } -func (x *StorageClassDetails) GetVolumeBindingMode() string { +func (x *NodeSystemInfo) GetOsImage() string { if x != nil { - return x.VolumeBindingMode + return x.OsImage } return "" } -func (x *StorageClassDetails) GetReclaimPolicy() string { +func (x *NodeSystemInfo) GetContainerRuntimeVersion() string { if x != nil { - return x.ReclaimPolicy + return x.ContainerRuntimeVersion } return "" } -func (x *StorageClassDetails) GetAllowVolumeExpansion() bool { +func (x *NodeSystemInfo) GetKubeletVersion() string { if x != nil { - return x.AllowVolumeExpansion + return x.KubeletVersion } - return false + return "" } -// NamespaceDetails contains detailed Namespace information for drill-down -type NamespaceDetails struct { +func (x *NodeSystemInfo) GetKubeProxyVersion() string { + if x != nil { + return x.KubeProxyVersion + } + return "" +} + +func (x *NodeSystemInfo) GetOperatingSystem() string { + if x != nil { + return x.OperatingSystem + } + return "" +} + +func (x *NodeSystemInfo) GetArchitecture() string { + if x != nil { + return x.Architecture + } + return "" +} + +// NodeImage represents a container image on the node +type NodeImage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Phase string `protobuf:"bytes,1,opt,name=phase,proto3" json:"phase,omitempty"` // Namespace phase: "Active", "Terminating" - Finalizers []string `protobuf:"bytes,2,rep,name=finalizers,proto3" json:"finalizers,omitempty"` // Finalizers preventing deletion - Conditions map[string]string `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Namespace conditions if any + Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"` // Image names/tags + SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` // Image size in bytes } -func (x *NamespaceDetails) Reset() { - *x = NamespaceDetails{} +func (x *NodeImage) Reset() { + *x = NodeImage{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[60] + mi := &file_api_v1_common_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NamespaceDetails) String() string { +func (x *NodeImage) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NamespaceDetails) ProtoMessage() {} +func (*NodeImage) ProtoMessage() {} -func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[60] +func (x *NodeImage) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8322,63 +9857,51 @@ func (x *NamespaceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NamespaceDetails.ProtoReflect.Descriptor instead. -func (*NamespaceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{60} -} - -func (x *NamespaceDetails) GetPhase() string { - if x != nil { - return x.Phase - } - return "" +// Deprecated: Use NodeImage.ProtoReflect.Descriptor instead. +func (*NodeImage) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{72} } -func (x *NamespaceDetails) GetFinalizers() []string { +func (x *NodeImage) GetNames() []string { if x != nil { - return x.Finalizers + return x.Names } return nil } -func (x *NamespaceDetails) GetConditions() map[string]string { +func (x *NodeImage) GetSizeBytes() int64 { if x != nil { - return x.Conditions + return x.SizeBytes } - return nil + return 0 } -// NodeDetails contains detailed Node information for drill-down -type NodeDetails struct { +// TopologySelector represents topology requirements for storage +type TopologySelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Addresses []*NodeAddress `protobuf:"bytes,1,rep,name=addresses,proto3" json:"addresses,omitempty"` // Node addresses (Internal/External IP, DNS, etc.) - Conditions []*NodeCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // Node conditions (Ready, MemoryPressure, etc.) - SystemInfo *NodeSystemInfo `protobuf:"bytes,3,opt,name=system_info,json=systemInfo,proto3" json:"system_info,omitempty"` // System information (OS, kernel, etc.) - Capacity map[string]string `protobuf:"bytes,4,rep,name=capacity,proto3" json:"capacity,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource capacity (cpu, memory, etc.) - Allocatable map[string]string `protobuf:"bytes,5,rep,name=allocatable,proto3" json:"allocatable,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Allocatable resources - Images []*NodeImage `protobuf:"bytes,6,rep,name=images,proto3" json:"images,omitempty"` // Container images on the node + MatchLabelExpressions []*TopologySelectorTerm `protobuf:"bytes,1,rep,name=match_label_expressions,json=matchLabelExpressions,proto3" json:"match_label_expressions,omitempty"` // Topology selector terms } -func (x *NodeDetails) Reset() { - *x = NodeDetails{} +func (x *TopologySelector) Reset() { + *x = TopologySelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[61] + mi := &file_api_v1_common_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeDetails) String() string { +func (x *TopologySelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeDetails) ProtoMessage() {} +func (*TopologySelector) ProtoMessage() {} -func (x *NodeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[61] +func (x *TopologySelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8389,82 +9912,96 @@ func (x *NodeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeDetails.ProtoReflect.Descriptor instead. -func (*NodeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{61} +// Deprecated: Use TopologySelector.ProtoReflect.Descriptor instead. +func (*TopologySelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{73} } -func (x *NodeDetails) GetAddresses() []*NodeAddress { +func (x *TopologySelector) GetMatchLabelExpressions() []*TopologySelectorTerm { if x != nil { - return x.Addresses + return x.MatchLabelExpressions } return nil } -func (x *NodeDetails) GetConditions() []*NodeCondition { - if x != nil { - return x.Conditions - } - return nil +// TopologySelectorTerm represents a topology selector term +type TopologySelectorTerm struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MatchLabels map[string]string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Labels that must match } -func (x *NodeDetails) GetSystemInfo() *NodeSystemInfo { - if x != nil { - return x.SystemInfo +func (x *TopologySelectorTerm) Reset() { + *x = TopologySelectorTerm{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodeDetails) GetCapacity() map[string]string { - if x != nil { - return x.Capacity - } - return nil +func (x *TopologySelectorTerm) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeDetails) GetAllocatable() map[string]string { - if x != nil { - return x.Allocatable +func (*TopologySelectorTerm) ProtoMessage() {} + +func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[74] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) +} + +// Deprecated: Use TopologySelectorTerm.ProtoReflect.Descriptor instead. +func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{74} } -func (x *NodeDetails) GetImages() []*NodeImage { +func (x *TopologySelectorTerm) GetMatchLabels() map[string]string { if x != nil { - return x.Images + return x.MatchLabels } return nil } -// NodeTaint represents a node taint that affects pod scheduling -type NodeTaint struct { +// TolerationInfo represents a simplified pod toleration for DaemonSets +type TolerationInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Taint key - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Taint value (optional) - Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // Taint effect: "NoSchedule", "PreferNoSchedule", "NoExecute" - TimeAdded int64 `protobuf:"varint,4,opt,name=time_added,json=timeAdded,proto3" json:"time_added,omitempty"` // When the taint was added (optional) + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Toleration key (optional for exists/all) + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "Equal", "Exists" + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Value to match (for Equal operator) + Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` // "NoSchedule", "PreferNoSchedule", "NoExecute", or "" + TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` // Toleration period for NoExecute (optional) } -func (x *NodeTaint) Reset() { - *x = NodeTaint{} +func (x *TolerationInfo) Reset() { + *x = TolerationInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[62] + mi := &file_api_v1_common_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeTaint) String() string { +func (x *TolerationInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeTaint) ProtoMessage() {} +func (*TolerationInfo) ProtoMessage() {} -func (x *NodeTaint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[62] +func (x *TolerationInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8475,66 +10012,72 @@ func (x *NodeTaint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeTaint.ProtoReflect.Descriptor instead. -func (*NodeTaint) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{62} +// Deprecated: Use TolerationInfo.ProtoReflect.Descriptor instead. +func (*TolerationInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{75} } -func (x *NodeTaint) GetKey() string { +func (x *TolerationInfo) GetKey() string { if x != nil { return x.Key } return "" } -func (x *NodeTaint) GetValue() string { +func (x *TolerationInfo) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *TolerationInfo) GetValue() string { if x != nil { return x.Value } return "" } -func (x *NodeTaint) GetEffect() string { +func (x *TolerationInfo) GetEffect() string { if x != nil { return x.Effect } return "" } -func (x *NodeTaint) GetTimeAdded() int64 { +func (x *TolerationInfo) GetTolerationSeconds() int64 { if x != nil { - return x.TimeAdded + return x.TolerationSeconds } return 0 } -// NodeAddress represents a node address -type NodeAddress struct { +// NodeSelector represents node selector requirements +type NodeSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Address type: "InternalIP", "ExternalIP", "InternalDNS", "ExternalDNS", "Hostname" - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` // The address value + Terms []*NodeSelectorTerm `protobuf:"bytes,1,rep,name=terms,proto3" json:"terms,omitempty"` // Node selector terms } -func (x *NodeAddress) Reset() { - *x = NodeAddress{} +func (x *NodeSelector) Reset() { + *x = NodeSelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[63] + mi := &file_api_v1_common_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeAddress) String() string { +func (x *NodeSelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeAddress) ProtoMessage() {} +func (*NodeSelector) ProtoMessage() {} -func (x *NodeAddress) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[63] +func (x *NodeSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8545,56 +10088,45 @@ func (x *NodeAddress) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeAddress.ProtoReflect.Descriptor instead. -func (*NodeAddress) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{63} -} - -func (x *NodeAddress) GetType() string { - if x != nil { - return x.Type - } - return "" +// Deprecated: Use NodeSelector.ProtoReflect.Descriptor instead. +func (*NodeSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{76} } -func (x *NodeAddress) GetAddress() string { +func (x *NodeSelector) GetTerms() []*NodeSelectorTerm { if x != nil { - return x.Address + return x.Terms } - return "" + return nil } -// NodeCondition represents a node condition -type NodeCondition struct { +// NodeSelectorTerm represents a node selector term +type NodeSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "Ready", "MemoryPressure", "DiskPressure", "PIDPressure", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastHeartbeatTime int64 `protobuf:"varint,5,opt,name=last_heartbeat_time,json=lastHeartbeatTime,proto3" json:"last_heartbeat_time,omitempty"` // Last heartbeat time - LastTransitionTime int64 `protobuf:"varint,6,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + MatchExpressions []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` // Match expressions + MatchFields []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=match_fields,json=matchFields,proto3" json:"match_fields,omitempty"` // Match fields } -func (x *NodeCondition) Reset() { - *x = NodeCondition{} +func (x *NodeSelectorTerm) Reset() { + *x = NodeSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[64] + mi := &file_api_v1_common_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeCondition) String() string { +func (x *NodeSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeCondition) ProtoMessage() {} +func (*NodeSelectorTerm) ProtoMessage() {} -func (x *NodeCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[64] +func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8605,88 +10137,53 @@ func (x *NodeCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeCondition.ProtoReflect.Descriptor instead. -func (*NodeCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{64} -} - -func (x *NodeCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *NodeCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *NodeCondition) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *NodeCondition) GetMessage() string { - if x != nil { - return x.Message - } - return "" +// Deprecated: Use NodeSelectorTerm.ProtoReflect.Descriptor instead. +func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{77} } -func (x *NodeCondition) GetLastHeartbeatTime() int64 { +func (x *NodeSelectorTerm) GetMatchExpressions() []*NodeSelectorRequirement { if x != nil { - return x.LastHeartbeatTime + return x.MatchExpressions } - return 0 + return nil } -func (x *NodeCondition) GetLastTransitionTime() int64 { +func (x *NodeSelectorTerm) GetMatchFields() []*NodeSelectorRequirement { if x != nil { - return x.LastTransitionTime + return x.MatchFields } - return 0 + return nil } -// NodeSystemInfo represents node system information -type NodeSystemInfo struct { +// NodeSelectorRequirement represents a node selector requirement +type NodeSelectorRequirement struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MachineId string `protobuf:"bytes,1,opt,name=machine_id,json=machineId,proto3" json:"machine_id,omitempty"` // Machine ID - SystemUuid string `protobuf:"bytes,2,opt,name=system_uuid,json=systemUuid,proto3" json:"system_uuid,omitempty"` // System UUID - BootId string `protobuf:"bytes,3,opt,name=boot_id,json=bootId,proto3" json:"boot_id,omitempty"` // Boot ID - KernelVersion string `protobuf:"bytes,4,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"` // Kernel version - OsImage string `protobuf:"bytes,5,opt,name=os_image,json=osImage,proto3" json:"os_image,omitempty"` // OS image - ContainerRuntimeVersion string `protobuf:"bytes,6,opt,name=container_runtime_version,json=containerRuntimeVersion,proto3" json:"container_runtime_version,omitempty"` // Container runtime version - KubeletVersion string `protobuf:"bytes,7,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // Kubelet version - KubeProxyVersion string `protobuf:"bytes,8,opt,name=kube_proxy_version,json=kubeProxyVersion,proto3" json:"kube_proxy_version,omitempty"` // Kube-proxy version - OperatingSystem string `protobuf:"bytes,9,opt,name=operating_system,json=operatingSystem,proto3" json:"operating_system,omitempty"` // Operating system - Architecture string `protobuf:"bytes,10,opt,name=architecture,proto3" json:"architecture,omitempty"` // Architecture + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Selector key + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "In", "NotIn", "Exists", "DoesNotExist", "Gt", "Lt" + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Values to match } -func (x *NodeSystemInfo) Reset() { - *x = NodeSystemInfo{} +func (x *NodeSelectorRequirement) Reset() { + *x = NodeSelectorRequirement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[65] + mi := &file_api_v1_common_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSystemInfo) String() string { +func (x *NodeSelectorRequirement) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSystemInfo) ProtoMessage() {} +func (*NodeSelectorRequirement) ProtoMessage() {} -func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[65] +func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8697,108 +10194,62 @@ func (x *NodeSystemInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSystemInfo.ProtoReflect.Descriptor instead. -func (*NodeSystemInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{65} -} - -func (x *NodeSystemInfo) GetMachineId() string { - if x != nil { - return x.MachineId - } - return "" -} - -func (x *NodeSystemInfo) GetSystemUuid() string { - if x != nil { - return x.SystemUuid - } - return "" -} - -func (x *NodeSystemInfo) GetBootId() string { - if x != nil { - return x.BootId - } - return "" -} - -func (x *NodeSystemInfo) GetKernelVersion() string { - if x != nil { - return x.KernelVersion - } - return "" -} - -func (x *NodeSystemInfo) GetOsImage() string { - if x != nil { - return x.OsImage - } - return "" -} - -func (x *NodeSystemInfo) GetContainerRuntimeVersion() string { - if x != nil { - return x.ContainerRuntimeVersion - } - return "" -} - -func (x *NodeSystemInfo) GetKubeletVersion() string { - if x != nil { - return x.KubeletVersion - } - return "" +// Deprecated: Use NodeSelectorRequirement.ProtoReflect.Descriptor instead. +func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{78} } -func (x *NodeSystemInfo) GetKubeProxyVersion() string { +func (x *NodeSelectorRequirement) GetKey() string { if x != nil { - return x.KubeProxyVersion + return x.Key } return "" } -func (x *NodeSystemInfo) GetOperatingSystem() string { +func (x *NodeSelectorRequirement) GetOperator() string { if x != nil { - return x.OperatingSystem + return x.Operator } return "" } -func (x *NodeSystemInfo) GetArchitecture() string { +func (x *NodeSelectorRequirement) GetValues() []string { if x != nil { - return x.Architecture + return x.Values } - return "" + return nil } -// NodeImage represents a container image on the node -type NodeImage struct { +// HPADetails contains detailed HorizontalPodAutoscaler information for drill-down +type HPADetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Names []string `protobuf:"bytes,1,rep,name=names,proto3" json:"names,omitempty"` // Image names/tags - SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` // Image size in bytes + ScaleTargetRef *ScaleTargetRef `protobuf:"bytes,1,opt,name=scale_target_ref,json=scaleTargetRef,proto3" json:"scale_target_ref,omitempty"` // Target reference for scaling + Metrics []*HPAMetric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"` // Scaling metrics configuration + Conditions []*HPACondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // HPA conditions for debugging + Behavior *HPABehavior `protobuf:"bytes,4,opt,name=behavior,proto3" json:"behavior,omitempty"` // Scaling behavior policies (optional) + CurrentMetrics []*HPACurrentMetric `protobuf:"bytes,5,rep,name=current_metrics,json=currentMetrics,proto3" json:"current_metrics,omitempty"` // Current metrics values } -func (x *NodeImage) Reset() { - *x = NodeImage{} +func (x *HPADetails) Reset() { + *x = HPADetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[66] + mi := &file_api_v1_common_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeImage) String() string { +func (x *HPADetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeImage) ProtoMessage() {} +func (*HPADetails) ProtoMessage() {} -func (x *NodeImage) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[66] +func (x *HPADetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8809,51 +10260,74 @@ func (x *NodeImage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeImage.ProtoReflect.Descriptor instead. -func (*NodeImage) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{66} +// Deprecated: Use HPADetails.ProtoReflect.Descriptor instead. +func (*HPADetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{79} } -func (x *NodeImage) GetNames() []string { +func (x *HPADetails) GetScaleTargetRef() *ScaleTargetRef { if x != nil { - return x.Names + return x.ScaleTargetRef } return nil } -func (x *NodeImage) GetSizeBytes() int64 { +func (x *HPADetails) GetMetrics() []*HPAMetric { if x != nil { - return x.SizeBytes + return x.Metrics } - return 0 + return nil } -// TopologySelector represents topology requirements for storage -type TopologySelector struct { +func (x *HPADetails) GetConditions() []*HPACondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *HPADetails) GetBehavior() *HPABehavior { + if x != nil { + return x.Behavior + } + return nil +} + +func (x *HPADetails) GetCurrentMetrics() []*HPACurrentMetric { + if x != nil { + return x.CurrentMetrics + } + return nil +} + +// ScaleTargetRef represents the target resource for HPA scaling +type ScaleTargetRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchLabelExpressions []*TopologySelectorTerm `protobuf:"bytes,1,rep,name=match_label_expressions,json=matchLabelExpressions,proto3" json:"match_label_expressions,omitempty"` // Topology selector terms + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource } -func (x *TopologySelector) Reset() { - *x = TopologySelector{} +func (x *ScaleTargetRef) Reset() { + *x = ScaleTargetRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[67] + mi := &file_api_v1_common_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopologySelector) String() string { +func (x *ScaleTargetRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopologySelector) ProtoMessage() {} +func (*ScaleTargetRef) ProtoMessage() {} -func (x *TopologySelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[67] +func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8864,44 +10338,62 @@ func (x *TopologySelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopologySelector.ProtoReflect.Descriptor instead. -func (*TopologySelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{67} +// Deprecated: Use ScaleTargetRef.ProtoReflect.Descriptor instead. +func (*ScaleTargetRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{80} } -func (x *TopologySelector) GetMatchLabelExpressions() []*TopologySelectorTerm { +func (x *ScaleTargetRef) GetKind() string { if x != nil { - return x.MatchLabelExpressions + return x.Kind } - return nil + return "" } -// TopologySelectorTerm represents a topology selector term -type TopologySelectorTerm struct { +func (x *ScaleTargetRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ScaleTargetRef) GetApiVersion() string { + if x != nil { + return x.ApiVersion + } + return "" +} + +// HPAMetric represents an HPA metric configuration +type HPAMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchLabels map[string]string `protobuf:"bytes,1,rep,name=match_labels,json=matchLabels,proto3" json:"match_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Labels that must match + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" + Resource *HPAResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Resource metric (if type is Resource) + Pods *HPAPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Pods metric (if type is Pods) + Object *HPAObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Object metric (if type is Object) + External *HPAExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // External metric (if type is External) } -func (x *TopologySelectorTerm) Reset() { - *x = TopologySelectorTerm{} +func (x *HPAMetric) Reset() { + *x = HPAMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[68] + mi := &file_api_v1_common_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TopologySelectorTerm) String() string { +func (x *HPAMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TopologySelectorTerm) ProtoMessage() {} +func (*HPAMetric) ProtoMessage() {} -func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[68] +func (x *HPAMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8912,48 +10404,74 @@ func (x *TopologySelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TopologySelectorTerm.ProtoReflect.Descriptor instead. -func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{68} +// Deprecated: Use HPAMetric.ProtoReflect.Descriptor instead. +func (*HPAMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{81} } -func (x *TopologySelectorTerm) GetMatchLabels() map[string]string { +func (x *HPAMetric) GetType() string { if x != nil { - return x.MatchLabels + return x.Type + } + return "" +} + +func (x *HPAMetric) GetResource() *HPAResourceMetric { + if x != nil { + return x.Resource } return nil } -// TolerationInfo represents a simplified pod toleration for DaemonSets -type TolerationInfo struct { +func (x *HPAMetric) GetPods() *HPAPodsMetric { + if x != nil { + return x.Pods + } + return nil +} + +func (x *HPAMetric) GetObject() *HPAObjectMetric { + if x != nil { + return x.Object + } + return nil +} + +func (x *HPAMetric) GetExternal() *HPAExternalMetric { + if x != nil { + return x.External + } + return nil +} + +// HPAResourceMetric represents a resource-based metric +type HPAResourceMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Toleration key (optional for exists/all) - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "Equal", "Exists" - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Value to match (for Equal operator) - Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` // "NoSchedule", "PreferNoSchedule", "NoExecute", or "" - TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` // Toleration period for NoExecute (optional) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name: "cpu", "memory" + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Utilization", "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value (e.g., "80" for 80%, "100m" for 100 millicores) } -func (x *TolerationInfo) Reset() { - *x = TolerationInfo{} +func (x *HPAResourceMetric) Reset() { + *x = HPAResourceMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[69] + mi := &file_api_v1_common_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TolerationInfo) String() string { +func (x *HPAResourceMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TolerationInfo) ProtoMessage() {} +func (*HPAResourceMetric) ProtoMessage() {} -func (x *TolerationInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[69] +func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8964,72 +10482,60 @@ func (x *TolerationInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TolerationInfo.ProtoReflect.Descriptor instead. -func (*TolerationInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{69} -} - -func (x *TolerationInfo) GetKey() string { - if x != nil { - return x.Key - } - return "" +// Deprecated: Use HPAResourceMetric.ProtoReflect.Descriptor instead. +func (*HPAResourceMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{82} } -func (x *TolerationInfo) GetOperator() string { +func (x *HPAResourceMetric) GetName() string { if x != nil { - return x.Operator + return x.Name } return "" } -func (x *TolerationInfo) GetValue() string { +func (x *HPAResourceMetric) GetTargetType() string { if x != nil { - return x.Value + return x.TargetType } return "" } -func (x *TolerationInfo) GetEffect() string { +func (x *HPAResourceMetric) GetTargetValue() string { if x != nil { - return x.Effect + return x.TargetValue } return "" } -func (x *TolerationInfo) GetTolerationSeconds() int64 { - if x != nil { - return x.TolerationSeconds - } - return 0 -} - -// NodeSelector represents node selector requirements -type NodeSelector struct { +// HPAPodsMetric represents a pods-based metric +type HPAPodsMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Terms []*NodeSelectorTerm `protobuf:"bytes,1,rep,name=terms,proto3" json:"terms,omitempty"` // Node selector terms + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target average value per pod } -func (x *NodeSelector) Reset() { - *x = NodeSelector{} +func (x *HPAPodsMetric) Reset() { + *x = HPAPodsMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[70] + mi := &file_api_v1_common_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelector) String() string { +func (x *HPAPodsMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelector) ProtoMessage() {} +func (*HPAPodsMetric) ProtoMessage() {} -func (x *NodeSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[70] +func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9040,45 +10546,61 @@ func (x *NodeSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelector.ProtoReflect.Descriptor instead. -func (*NodeSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{70} +// Deprecated: Use HPAPodsMetric.ProtoReflect.Descriptor instead. +func (*HPAPodsMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{83} } -func (x *NodeSelector) GetTerms() []*NodeSelectorTerm { +func (x *HPAPodsMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.Terms + return x.Metric } return nil } -// NodeSelectorTerm represents a node selector term -type NodeSelectorTerm struct { +func (x *HPAPodsMetric) GetTargetType() string { + if x != nil { + return x.TargetType + } + return "" +} + +func (x *HPAPodsMetric) GetTargetValue() string { + if x != nil { + return x.TargetValue + } + return "" +} + +// HPAObjectMetric represents an object-based metric +type HPAObjectMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MatchExpressions []*NodeSelectorRequirement `protobuf:"bytes,1,rep,name=match_expressions,json=matchExpressions,proto3" json:"match_expressions,omitempty"` // Match expressions - MatchFields []*NodeSelectorRequirement `protobuf:"bytes,2,rep,name=match_fields,json=matchFields,proto3" json:"match_fields,omitempty"` // Match fields + DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference + Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,3,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" + TargetValue string `protobuf:"bytes,4,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value } -func (x *NodeSelectorTerm) Reset() { - *x = NodeSelectorTerm{} +func (x *HPAObjectMetric) Reset() { + *x = HPAObjectMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[71] + mi := &file_api_v1_common_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelectorTerm) String() string { +func (x *HPAObjectMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelectorTerm) ProtoMessage() {} +func (*HPAObjectMetric) ProtoMessage() {} -func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[71] +func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9089,53 +10611,67 @@ func (x *NodeSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelectorTerm.ProtoReflect.Descriptor instead. -func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{71} +// Deprecated: Use HPAObjectMetric.ProtoReflect.Descriptor instead. +func (*HPAObjectMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{84} } -func (x *NodeSelectorTerm) GetMatchExpressions() []*NodeSelectorRequirement { +func (x *HPAObjectMetric) GetDescribedObject() *HPAObjectReference { if x != nil { - return x.MatchExpressions + return x.DescribedObject } return nil } -func (x *NodeSelectorTerm) GetMatchFields() []*NodeSelectorRequirement { +func (x *HPAObjectMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.MatchFields + return x.Metric } return nil } -// NodeSelectorRequirement represents a node selector requirement -type NodeSelectorRequirement struct { +func (x *HPAObjectMetric) GetTargetType() string { + if x != nil { + return x.TargetType + } + return "" +} + +func (x *HPAObjectMetric) GetTargetValue() string { + if x != nil { + return x.TargetValue + } + return "" +} + +// HPAExternalMetric represents an external metric +type HPAExternalMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Selector key - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // "In", "NotIn", "Exists", "DoesNotExist", "Gt", "Lt" - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Values to match + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" + TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value } -func (x *NodeSelectorRequirement) Reset() { - *x = NodeSelectorRequirement{} +func (x *HPAExternalMetric) Reset() { + *x = HPAExternalMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[72] + mi := &file_api_v1_common_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeSelectorRequirement) String() string { +func (x *HPAExternalMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeSelectorRequirement) ProtoMessage() {} +func (*HPAExternalMetric) ProtoMessage() {} -func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[72] +func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9146,62 +10682,59 @@ func (x *NodeSelectorRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeSelectorRequirement.ProtoReflect.Descriptor instead. -func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{72} +// Deprecated: Use HPAExternalMetric.ProtoReflect.Descriptor instead. +func (*HPAExternalMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{85} } -func (x *NodeSelectorRequirement) GetKey() string { +func (x *HPAExternalMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.Key + return x.Metric } - return "" + return nil } -func (x *NodeSelectorRequirement) GetOperator() string { +func (x *HPAExternalMetric) GetTargetType() string { if x != nil { - return x.Operator + return x.TargetType } return "" } -func (x *NodeSelectorRequirement) GetValues() []string { +func (x *HPAExternalMetric) GetTargetValue() string { if x != nil { - return x.Values + return x.TargetValue } - return nil + return "" } -// HPADetails contains detailed HorizontalPodAutoscaler information for drill-down -type HPADetails struct { +// HPAMetricSelector represents a metric selector +type HPAMetricSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ScaleTargetRef *ScaleTargetRef `protobuf:"bytes,1,opt,name=scale_target_ref,json=scaleTargetRef,proto3" json:"scale_target_ref,omitempty"` // Target reference for scaling - Metrics []*HPAMetric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"` // Scaling metrics configuration - Conditions []*HPACondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // HPA conditions for debugging - Behavior *HPABehavior `protobuf:"bytes,4,opt,name=behavior,proto3" json:"behavior,omitempty"` // Scaling behavior policies (optional) - CurrentMetrics []*HPACurrentMetric `protobuf:"bytes,5,rep,name=current_metrics,json=currentMetrics,proto3" json:"current_metrics,omitempty"` // Current metrics values + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Metric name + Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector (optional) } -func (x *HPADetails) Reset() { - *x = HPADetails{} +func (x *HPAMetricSelector) Reset() { + *x = HPAMetricSelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[73] + mi := &file_api_v1_common_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPADetails) String() string { +func (x *HPAMetricSelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPADetails) ProtoMessage() {} +func (*HPAMetricSelector) ProtoMessage() {} -func (x *HPADetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[73] +func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9212,74 +10745,54 @@ func (x *HPADetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPADetails.ProtoReflect.Descriptor instead. -func (*HPADetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{73} -} - -func (x *HPADetails) GetScaleTargetRef() *ScaleTargetRef { - if x != nil { - return x.ScaleTargetRef - } - return nil -} - -func (x *HPADetails) GetMetrics() []*HPAMetric { - if x != nil { - return x.Metrics - } - return nil -} - -func (x *HPADetails) GetConditions() []*HPACondition { - if x != nil { - return x.Conditions - } - return nil +// Deprecated: Use HPAMetricSelector.ProtoReflect.Descriptor instead. +func (*HPAMetricSelector) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{86} } -func (x *HPADetails) GetBehavior() *HPABehavior { +func (x *HPAMetricSelector) GetName() string { if x != nil { - return x.Behavior + return x.Name } - return nil + return "" } -func (x *HPADetails) GetCurrentMetrics() []*HPACurrentMetric { +func (x *HPAMetricSelector) GetSelector() map[string]string { if x != nil { - return x.CurrentMetrics + return x.Selector } return nil } -// ScaleTargetRef represents the target resource for HPA scaling -type ScaleTargetRef struct { +// HPAObjectReference represents an object reference for metrics +type HPAObjectReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Object kind + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Object name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Object namespace (optional) } -func (x *ScaleTargetRef) Reset() { - *x = ScaleTargetRef{} +func (x *HPAObjectReference) Reset() { + *x = HPAObjectReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[74] + mi := &file_api_v1_common_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ScaleTargetRef) String() string { +func (x *HPAObjectReference) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ScaleTargetRef) ProtoMessage() {} +func (*HPAObjectReference) ProtoMessage() {} -func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[74] +func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9290,62 +10803,69 @@ func (x *ScaleTargetRef) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ScaleTargetRef.ProtoReflect.Descriptor instead. -func (*ScaleTargetRef) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{74} +// Deprecated: Use HPAObjectReference.ProtoReflect.Descriptor instead. +func (*HPAObjectReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{87} } -func (x *ScaleTargetRef) GetKind() string { +func (x *HPAObjectReference) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *ScaleTargetRef) GetName() string { +func (x *HPAObjectReference) GetName() string { if x != nil { return x.Name } return "" } -func (x *ScaleTargetRef) GetApiVersion() string { +func (x *HPAObjectReference) GetApiVersion() string { if x != nil { return x.ApiVersion } return "" } -// HPAMetric represents an HPA metric configuration -type HPAMetric struct { +func (x *HPAObjectReference) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +// HPACurrentMetric represents current metric values +type HPACurrentMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" - Resource *HPAResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Resource metric (if type is Resource) - Pods *HPAPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Pods metric (if type is Pods) - Object *HPAObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Object metric (if type is Object) - External *HPAExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // External metric (if type is External) + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" + Resource *HPACurrentResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Current resource metric + Pods *HPACurrentPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Current pods metric + Object *HPACurrentObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Current object metric + External *HPACurrentExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // Current external metric } -func (x *HPAMetric) Reset() { - *x = HPAMetric{} +func (x *HPACurrentMetric) Reset() { + *x = HPACurrentMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[75] + mi := &file_api_v1_common_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAMetric) String() string { +func (x *HPACurrentMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAMetric) ProtoMessage() {} +func (*HPACurrentMetric) ProtoMessage() {} -func (x *HPAMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[75] +func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9356,74 +10876,74 @@ func (x *HPAMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAMetric.ProtoReflect.Descriptor instead. -func (*HPAMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{75} +// Deprecated: Use HPACurrentMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{88} } -func (x *HPAMetric) GetType() string { +func (x *HPACurrentMetric) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPAMetric) GetResource() *HPAResourceMetric { +func (x *HPACurrentMetric) GetResource() *HPACurrentResourceMetric { if x != nil { return x.Resource } return nil } -func (x *HPAMetric) GetPods() *HPAPodsMetric { +func (x *HPACurrentMetric) GetPods() *HPACurrentPodsMetric { if x != nil { return x.Pods } return nil } -func (x *HPAMetric) GetObject() *HPAObjectMetric { +func (x *HPACurrentMetric) GetObject() *HPACurrentObjectMetric { if x != nil { return x.Object } return nil } -func (x *HPAMetric) GetExternal() *HPAExternalMetric { +func (x *HPACurrentMetric) GetExternal() *HPACurrentExternalMetric { if x != nil { return x.External } return nil } -// HPAResourceMetric represents a resource-based metric -type HPAResourceMetric struct { +// HPACurrentResourceMetric represents current resource metric values +type HPACurrentResourceMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name: "cpu", "memory" - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Utilization", "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value (e.g., "80" for 80%, "100m" for 100 millicores) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name + CurrentUtilization string `protobuf:"bytes,2,opt,name=current_utilization,json=currentUtilization,proto3" json:"current_utilization,omitempty"` // Current utilization percentage (optional) + CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) } -func (x *HPAResourceMetric) Reset() { - *x = HPAResourceMetric{} +func (x *HPACurrentResourceMetric) Reset() { + *x = HPACurrentResourceMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[76] + mi := &file_api_v1_common_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAResourceMetric) String() string { +func (x *HPACurrentResourceMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAResourceMetric) ProtoMessage() {} +func (*HPACurrentResourceMetric) ProtoMessage() {} -func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[76] +func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9434,60 +10954,59 @@ func (x *HPAResourceMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAResourceMetric.ProtoReflect.Descriptor instead. -func (*HPAResourceMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{76} +// Deprecated: Use HPACurrentResourceMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentResourceMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{89} } -func (x *HPAResourceMetric) GetName() string { +func (x *HPACurrentResourceMetric) GetName() string { if x != nil { return x.Name } return "" } -func (x *HPAResourceMetric) GetTargetType() string { +func (x *HPACurrentResourceMetric) GetCurrentUtilization() string { if x != nil { - return x.TargetType + return x.CurrentUtilization } return "" } -func (x *HPAResourceMetric) GetTargetValue() string { +func (x *HPACurrentResourceMetric) GetCurrentAverageValue() string { if x != nil { - return x.TargetValue + return x.CurrentAverageValue } return "" } -// HPAPodsMetric represents a pods-based metric -type HPAPodsMetric struct { +// HPACurrentPodsMetric represents current pods metric values +type HPACurrentPodsMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target average value per pod + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + CurrentAverageValue string `protobuf:"bytes,2,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value per pod } -func (x *HPAPodsMetric) Reset() { - *x = HPAPodsMetric{} +func (x *HPACurrentPodsMetric) Reset() { + *x = HPACurrentPodsMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[77] + mi := &file_api_v1_common_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAPodsMetric) String() string { +func (x *HPACurrentPodsMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAPodsMetric) ProtoMessage() {} +func (*HPACurrentPodsMetric) ProtoMessage() {} -func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[77] +func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9498,61 +11017,53 @@ func (x *HPAPodsMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAPodsMetric.ProtoReflect.Descriptor instead. -func (*HPAPodsMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{77} +// Deprecated: Use HPACurrentPodsMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentPodsMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{90} } -func (x *HPAPodsMetric) GetMetric() *HPAMetricSelector { +func (x *HPACurrentPodsMetric) GetMetric() *HPAMetricSelector { if x != nil { return x.Metric } return nil } -func (x *HPAPodsMetric) GetTargetType() string { - if x != nil { - return x.TargetType - } - return "" -} - -func (x *HPAPodsMetric) GetTargetValue() string { +func (x *HPACurrentPodsMetric) GetCurrentAverageValue() string { if x != nil { - return x.TargetValue + return x.CurrentAverageValue } return "" } -// HPAObjectMetric represents an object-based metric -type HPAObjectMetric struct { +// HPACurrentObjectMetric represents current object metric values +type HPACurrentObjectMetric struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,3,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" - TargetValue string `protobuf:"bytes,4,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value + CurrentValue string `protobuf:"bytes,3,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value } -func (x *HPAObjectMetric) Reset() { - *x = HPAObjectMetric{} +func (x *HPACurrentObjectMetric) Reset() { + *x = HPACurrentObjectMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[78] + mi := &file_api_v1_common_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAObjectMetric) String() string { +func (x *HPACurrentObjectMetric) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAObjectMetric) ProtoMessage() {} +func (*HPACurrentObjectMetric) ProtoMessage() {} -func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[78] +func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9563,67 +11074,126 @@ func (x *HPAObjectMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAObjectMetric.ProtoReflect.Descriptor instead. -func (*HPAObjectMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{78} +// Deprecated: Use HPACurrentObjectMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentObjectMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{91} } -func (x *HPAObjectMetric) GetDescribedObject() *HPAObjectReference { +func (x *HPACurrentObjectMetric) GetDescribedObject() *HPAObjectReference { if x != nil { return x.DescribedObject } return nil } -func (x *HPAObjectMetric) GetMetric() *HPAMetricSelector { +func (x *HPACurrentObjectMetric) GetMetric() *HPAMetricSelector { if x != nil { return x.Metric } return nil } -func (x *HPAObjectMetric) GetTargetType() string { +func (x *HPACurrentObjectMetric) GetCurrentValue() string { if x != nil { - return x.TargetType + return x.CurrentValue } return "" } -func (x *HPAObjectMetric) GetTargetValue() string { +// HPACurrentExternalMetric represents current external metric values +type HPACurrentExternalMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector + CurrentValue string `protobuf:"bytes,2,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value + CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) +} + +func (x *HPACurrentExternalMetric) Reset() { + *x = HPACurrentExternalMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HPACurrentExternalMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HPACurrentExternalMetric) ProtoMessage() {} + +func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[92] + 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 HPACurrentExternalMetric.ProtoReflect.Descriptor instead. +func (*HPACurrentExternalMetric) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{92} +} + +func (x *HPACurrentExternalMetric) GetMetric() *HPAMetricSelector { if x != nil { - return x.TargetValue + return x.Metric + } + return nil +} + +func (x *HPACurrentExternalMetric) GetCurrentValue() string { + if x != nil { + return x.CurrentValue } return "" } -// HPAExternalMetric represents an external metric -type HPAExternalMetric struct { +func (x *HPACurrentExternalMetric) GetCurrentAverageValue() string { + if x != nil { + return x.CurrentAverageValue + } + return "" +} + +// HPACondition represents an HPA condition +type HPACondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - TargetType string `protobuf:"bytes,2,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"` // Target type: "Value", "AverageValue" - TargetValue string `protobuf:"bytes,3,opt,name=target_value,json=targetValue,proto3" json:"target_value,omitempty"` // Target value + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "AbleToScale", "ScalingActive", "ScalingLimited" + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *HPAExternalMetric) Reset() { - *x = HPAExternalMetric{} +func (x *HPACondition) Reset() { + *x = HPACondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[79] + mi := &file_api_v1_common_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAExternalMetric) String() string { +func (x *HPACondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAExternalMetric) ProtoMessage() {} +func (*HPACondition) ProtoMessage() {} -func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[79] +func (x *HPACondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9634,59 +11204,73 @@ func (x *HPAExternalMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAExternalMetric.ProtoReflect.Descriptor instead. -func (*HPAExternalMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{79} +// Deprecated: Use HPACondition.ProtoReflect.Descriptor instead. +func (*HPACondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{93} } -func (x *HPAExternalMetric) GetMetric() *HPAMetricSelector { +func (x *HPACondition) GetType() string { if x != nil { - return x.Metric + return x.Type } - return nil + return "" } -func (x *HPAExternalMetric) GetTargetType() string { +func (x *HPACondition) GetStatus() string { if x != nil { - return x.TargetType + return x.Status + } + return "" +} + +func (x *HPACondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *HPACondition) GetMessage() string { + if x != nil { + return x.Message } return "" } -func (x *HPAExternalMetric) GetTargetValue() string { +func (x *HPACondition) GetLastTransitionTime() int64 { if x != nil { - return x.TargetValue + return x.LastTransitionTime } - return "" + return 0 } -// HPAMetricSelector represents a metric selector -type HPAMetricSelector struct { +// HPABehavior represents HPA scaling behavior policies +type HPABehavior struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Metric name - Selector map[string]string `protobuf:"bytes,2,rep,name=selector,proto3" json:"selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector (optional) + ScaleUp *HPAScalingRules `protobuf:"bytes,1,opt,name=scale_up,json=scaleUp,proto3" json:"scale_up,omitempty"` // Scale up behavior + ScaleDown *HPAScalingRules `protobuf:"bytes,2,opt,name=scale_down,json=scaleDown,proto3" json:"scale_down,omitempty"` // Scale down behavior } -func (x *HPAMetricSelector) Reset() { - *x = HPAMetricSelector{} +func (x *HPABehavior) Reset() { + *x = HPABehavior{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[80] + mi := &file_api_v1_common_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAMetricSelector) String() string { +func (x *HPABehavior) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAMetricSelector) ProtoMessage() {} +func (*HPABehavior) ProtoMessage() {} -func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[80] +func (x *HPABehavior) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9697,54 +11281,53 @@ func (x *HPAMetricSelector) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAMetricSelector.ProtoReflect.Descriptor instead. -func (*HPAMetricSelector) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{80} +// Deprecated: Use HPABehavior.ProtoReflect.Descriptor instead. +func (*HPABehavior) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{94} } -func (x *HPAMetricSelector) GetName() string { +func (x *HPABehavior) GetScaleUp() *HPAScalingRules { if x != nil { - return x.Name + return x.ScaleUp } - return "" + return nil } -func (x *HPAMetricSelector) GetSelector() map[string]string { +func (x *HPABehavior) GetScaleDown() *HPAScalingRules { if x != nil { - return x.Selector + return x.ScaleDown } return nil } -// HPAObjectReference represents an object reference for metrics -type HPAObjectReference struct { +// HPAScalingRules represents scaling behavior rules +type HPAScalingRules struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Object kind - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Object name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` // Object namespace (optional) + StabilizationWindowSeconds int32 `protobuf:"varint,1,opt,name=stabilization_window_seconds,json=stabilizationWindowSeconds,proto3" json:"stabilization_window_seconds,omitempty"` // Stabilization window + SelectPolicy string `protobuf:"bytes,2,opt,name=select_policy,json=selectPolicy,proto3" json:"select_policy,omitempty"` // Policy selection: "Max", "Min", "Disabled" + Policies []*HPAScalingPolicy `protobuf:"bytes,3,rep,name=policies,proto3" json:"policies,omitempty"` // Scaling policies } -func (x *HPAObjectReference) Reset() { - *x = HPAObjectReference{} +func (x *HPAScalingRules) Reset() { + *x = HPAScalingRules{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[81] + mi := &file_api_v1_common_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAObjectReference) String() string { +func (x *HPAScalingRules) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAObjectReference) ProtoMessage() {} +func (*HPAScalingRules) ProtoMessage() {} -func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[81] +func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9755,69 +11338,60 @@ func (x *HPAObjectReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAObjectReference.ProtoReflect.Descriptor instead. -func (*HPAObjectReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{81} -} - -func (x *HPAObjectReference) GetKind() string { - if x != nil { - return x.Kind - } - return "" +// Deprecated: Use HPAScalingRules.ProtoReflect.Descriptor instead. +func (*HPAScalingRules) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{95} } -func (x *HPAObjectReference) GetName() string { +func (x *HPAScalingRules) GetStabilizationWindowSeconds() int32 { if x != nil { - return x.Name + return x.StabilizationWindowSeconds } - return "" + return 0 } -func (x *HPAObjectReference) GetApiVersion() string { +func (x *HPAScalingRules) GetSelectPolicy() string { if x != nil { - return x.ApiVersion + return x.SelectPolicy } return "" } -func (x *HPAObjectReference) GetNamespace() string { +func (x *HPAScalingRules) GetPolicies() []*HPAScalingPolicy { if x != nil { - return x.Namespace + return x.Policies } - return "" + return nil } -// HPACurrentMetric represents current metric values -type HPACurrentMetric struct { +// HPAScalingPolicy represents a scaling policy +type HPAScalingPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Metric type: "Resource", "Pods", "Object", "External" - Resource *HPACurrentResourceMetric `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` // Current resource metric - Pods *HPACurrentPodsMetric `protobuf:"bytes,3,opt,name=pods,proto3" json:"pods,omitempty"` // Current pods metric - Object *HPACurrentObjectMetric `protobuf:"bytes,4,opt,name=object,proto3" json:"object,omitempty"` // Current object metric - External *HPACurrentExternalMetric `protobuf:"bytes,5,opt,name=external,proto3" json:"external,omitempty"` // Current external metric + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Policy type: "Pods", "Percent" + Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` // Policy value + PeriodSeconds int32 `protobuf:"varint,3,opt,name=period_seconds,json=periodSeconds,proto3" json:"period_seconds,omitempty"` // Period in seconds } -func (x *HPACurrentMetric) Reset() { - *x = HPACurrentMetric{} +func (x *HPAScalingPolicy) Reset() { + *x = HPAScalingPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[82] + mi := &file_api_v1_common_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentMetric) String() string { +func (x *HPAScalingPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentMetric) ProtoMessage() {} +func (*HPAScalingPolicy) ProtoMessage() {} -func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[82] +func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9828,74 +11402,62 @@ func (x *HPACurrentMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{82} +// Deprecated: Use HPAScalingPolicy.ProtoReflect.Descriptor instead. +func (*HPAScalingPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{96} } -func (x *HPACurrentMetric) GetType() string { +func (x *HPAScalingPolicy) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPACurrentMetric) GetResource() *HPACurrentResourceMetric { - if x != nil { - return x.Resource - } - return nil -} - -func (x *HPACurrentMetric) GetPods() *HPACurrentPodsMetric { - if x != nil { - return x.Pods - } - return nil -} - -func (x *HPACurrentMetric) GetObject() *HPACurrentObjectMetric { +func (x *HPAScalingPolicy) GetValue() int32 { if x != nil { - return x.Object + return x.Value } - return nil + return 0 } -func (x *HPACurrentMetric) GetExternal() *HPACurrentExternalMetric { +func (x *HPAScalingPolicy) GetPeriodSeconds() int32 { if x != nil { - return x.External + return x.PeriodSeconds } - return nil + return 0 } -// HPACurrentResourceMetric represents current resource metric values -type HPACurrentResourceMetric struct { +// VPADetails contains detailed VerticalPodAutoscaler information for drill-down +type VPADetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name - CurrentUtilization string `protobuf:"bytes,2,opt,name=current_utilization,json=currentUtilization,proto3" json:"current_utilization,omitempty"` // Current utilization percentage (optional) - CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) + TargetRef *VPATargetRef `protobuf:"bytes,1,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // Target reference for VPA + UpdatePolicy *VPAUpdatePolicy `protobuf:"bytes,2,opt,name=update_policy,json=updatePolicy,proto3" json:"update_policy,omitempty"` // Update policy configuration + ResourcePolicy *VPAResourcePolicy `protobuf:"bytes,3,opt,name=resource_policy,json=resourcePolicy,proto3" json:"resource_policy,omitempty"` // Resource policy configuration + Recommendation *VPARecommendation `protobuf:"bytes,4,opt,name=recommendation,proto3" json:"recommendation,omitempty"` // Current recommendations + Conditions []*VPACondition `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty"` // VPA conditions for debugging } -func (x *HPACurrentResourceMetric) Reset() { - *x = HPACurrentResourceMetric{} +func (x *VPADetails) Reset() { + *x = VPADetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[83] + mi := &file_api_v1_common_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentResourceMetric) String() string { +func (x *VPADetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentResourceMetric) ProtoMessage() {} +func (*VPADetails) ProtoMessage() {} -func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[83] +func (x *VPADetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9906,59 +11468,74 @@ func (x *HPACurrentResourceMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentResourceMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentResourceMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{83} +// Deprecated: Use VPADetails.ProtoReflect.Descriptor instead. +func (*VPADetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{97} } -func (x *HPACurrentResourceMetric) GetName() string { +func (x *VPADetails) GetTargetRef() *VPATargetRef { if x != nil { - return x.Name + return x.TargetRef } - return "" + return nil } -func (x *HPACurrentResourceMetric) GetCurrentUtilization() string { +func (x *VPADetails) GetUpdatePolicy() *VPAUpdatePolicy { if x != nil { - return x.CurrentUtilization + return x.UpdatePolicy } - return "" + return nil } -func (x *HPACurrentResourceMetric) GetCurrentAverageValue() string { +func (x *VPADetails) GetResourcePolicy() *VPAResourcePolicy { if x != nil { - return x.CurrentAverageValue + return x.ResourcePolicy } - return "" + return nil } -// HPACurrentPodsMetric represents current pods metric values -type HPACurrentPodsMetric struct { +func (x *VPADetails) GetRecommendation() *VPARecommendation { + if x != nil { + return x.Recommendation + } + return nil +} + +func (x *VPADetails) GetConditions() []*VPACondition { + if x != nil { + return x.Conditions + } + return nil +} + +// VPATargetRef represents the target resource for VPA +type VPATargetRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentAverageValue string `protobuf:"bytes,2,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value per pod + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name + ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource } -func (x *HPACurrentPodsMetric) Reset() { - *x = HPACurrentPodsMetric{} +func (x *VPATargetRef) Reset() { + *x = VPATargetRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[84] + mi := &file_api_v1_common_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentPodsMetric) String() string { +func (x *VPATargetRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentPodsMetric) ProtoMessage() {} +func (*VPATargetRef) ProtoMessage() {} -func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[84] +func (x *VPATargetRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9969,53 +11546,59 @@ func (x *HPACurrentPodsMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentPodsMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentPodsMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{84} +// Deprecated: Use VPATargetRef.ProtoReflect.Descriptor instead. +func (*VPATargetRef) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{98} +} + +func (x *VPATargetRef) GetKind() string { + if x != nil { + return x.Kind + } + return "" } -func (x *HPACurrentPodsMetric) GetMetric() *HPAMetricSelector { +func (x *VPATargetRef) GetName() string { if x != nil { - return x.Metric + return x.Name } - return nil + return "" } -func (x *HPACurrentPodsMetric) GetCurrentAverageValue() string { +func (x *VPATargetRef) GetApiVersion() string { if x != nil { - return x.CurrentAverageValue + return x.ApiVersion } return "" } -// HPACurrentObjectMetric represents current object metric values -type HPACurrentObjectMetric struct { +// VPAUpdatePolicy represents VPA update policy +type VPAUpdatePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DescribedObject *HPAObjectReference `protobuf:"bytes,1,opt,name=described_object,json=describedObject,proto3" json:"described_object,omitempty"` // Object reference - Metric *HPAMetricSelector `protobuf:"bytes,2,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentValue string `protobuf:"bytes,3,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value + UpdateMode string `protobuf:"bytes,1,opt,name=update_mode,json=updateMode,proto3" json:"update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" + MinReplicas int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum replicas during update (optional) } -func (x *HPACurrentObjectMetric) Reset() { - *x = HPACurrentObjectMetric{} +func (x *VPAUpdatePolicy) Reset() { + *x = VPAUpdatePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[85] + mi := &file_api_v1_common_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentObjectMetric) String() string { +func (x *VPAUpdatePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentObjectMetric) ProtoMessage() {} +func (*VPAUpdatePolicy) ProtoMessage() {} -func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[85] +func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10026,60 +11609,51 @@ func (x *HPACurrentObjectMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentObjectMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentObjectMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{85} -} - -func (x *HPACurrentObjectMetric) GetDescribedObject() *HPAObjectReference { - if x != nil { - return x.DescribedObject - } - return nil +// Deprecated: Use VPAUpdatePolicy.ProtoReflect.Descriptor instead. +func (*VPAUpdatePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{99} } -func (x *HPACurrentObjectMetric) GetMetric() *HPAMetricSelector { +func (x *VPAUpdatePolicy) GetUpdateMode() string { if x != nil { - return x.Metric + return x.UpdateMode } - return nil + return "" } -func (x *HPACurrentObjectMetric) GetCurrentValue() string { +func (x *VPAUpdatePolicy) GetMinReplicas() int32 { if x != nil { - return x.CurrentValue + return x.MinReplicas } - return "" + return 0 } -// HPACurrentExternalMetric represents current external metric values -type HPACurrentExternalMetric struct { +// VPAResourcePolicy represents VPA resource policy +type VPAResourcePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metric *HPAMetricSelector `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` // Metric selector - CurrentValue string `protobuf:"bytes,2,opt,name=current_value,json=currentValue,proto3" json:"current_value,omitempty"` // Current value - CurrentAverageValue string `protobuf:"bytes,3,opt,name=current_average_value,json=currentAverageValue,proto3" json:"current_average_value,omitempty"` // Current average value (optional) + ContainerPolicies []*VPAContainerResourcePolicy `protobuf:"bytes,1,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` // Per-container policies } -func (x *HPACurrentExternalMetric) Reset() { - *x = HPACurrentExternalMetric{} +func (x *VPAResourcePolicy) Reset() { + *x = VPAResourcePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[86] + mi := &file_api_v1_common_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACurrentExternalMetric) String() string { +func (x *VPAResourcePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACurrentExternalMetric) ProtoMessage() {} +func (*VPAResourcePolicy) ProtoMessage() {} -func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[86] +func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10090,62 +11664,49 @@ func (x *HPACurrentExternalMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACurrentExternalMetric.ProtoReflect.Descriptor instead. -func (*HPACurrentExternalMetric) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{86} +// Deprecated: Use VPAResourcePolicy.ProtoReflect.Descriptor instead. +func (*VPAResourcePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{100} } -func (x *HPACurrentExternalMetric) GetMetric() *HPAMetricSelector { +func (x *VPAResourcePolicy) GetContainerPolicies() []*VPAContainerResourcePolicy { if x != nil { - return x.Metric + return x.ContainerPolicies } return nil } -func (x *HPACurrentExternalMetric) GetCurrentValue() string { - if x != nil { - return x.CurrentValue - } - return "" -} - -func (x *HPACurrentExternalMetric) GetCurrentAverageValue() string { - if x != nil { - return x.CurrentAverageValue - } - return "" -} - -// HPACondition represents an HPA condition -type HPACondition struct { +// VPAContainerResourcePolicy represents VPA policy for a container +type VPAContainerResourcePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "AbleToScale", "ScalingActive", "ScalingLimited" - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name + Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"` // Mode: "Auto", "Off" + MinAllowed map[string]string `protobuf:"bytes,3,rep,name=min_allowed,json=minAllowed,proto3" json:"min_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum allowed resources + MaxAllowed map[string]string `protobuf:"bytes,4,rep,name=max_allowed,json=maxAllowed,proto3" json:"max_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum allowed resources + ControlledResources []string `protobuf:"bytes,5,rep,name=controlled_resources,json=controlledResources,proto3" json:"controlled_resources,omitempty"` // Controlled resource types + ControlledValues string `protobuf:"bytes,6,opt,name=controlled_values,json=controlledValues,proto3" json:"controlled_values,omitempty"` // Controlled values: "RequestsAndLimits", "RequestsOnly" } -func (x *HPACondition) Reset() { - *x = HPACondition{} +func (x *VPAContainerResourcePolicy) Reset() { + *x = VPAContainerResourcePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[87] + mi := &file_api_v1_common_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPACondition) String() string { +func (x *VPAContainerResourcePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPACondition) ProtoMessage() {} +func (*VPAContainerResourcePolicy) ProtoMessage() {} -func (x *HPACondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[87] +func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10156,73 +11717,79 @@ func (x *HPACondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPACondition.ProtoReflect.Descriptor instead. -func (*HPACondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{87} +// Deprecated: Use VPAContainerResourcePolicy.ProtoReflect.Descriptor instead. +func (*VPAContainerResourcePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{101} } -func (x *HPACondition) GetType() string { +func (x *VPAContainerResourcePolicy) GetContainerName() string { if x != nil { - return x.Type + return x.ContainerName } return "" } -func (x *HPACondition) GetStatus() string { +func (x *VPAContainerResourcePolicy) GetMode() string { if x != nil { - return x.Status + return x.Mode } return "" } -func (x *HPACondition) GetReason() string { +func (x *VPAContainerResourcePolicy) GetMinAllowed() map[string]string { if x != nil { - return x.Reason + return x.MinAllowed } - return "" + return nil } -func (x *HPACondition) GetMessage() string { +func (x *VPAContainerResourcePolicy) GetMaxAllowed() map[string]string { if x != nil { - return x.Message + return x.MaxAllowed } - return "" + return nil } -func (x *HPACondition) GetLastTransitionTime() int64 { +func (x *VPAContainerResourcePolicy) GetControlledResources() []string { if x != nil { - return x.LastTransitionTime + return x.ControlledResources } - return 0 + return nil } -// HPABehavior represents HPA scaling behavior policies -type HPABehavior struct { +func (x *VPAContainerResourcePolicy) GetControlledValues() string { + if x != nil { + return x.ControlledValues + } + return "" +} + +// VPARecommendation represents VPA recommendations +type VPARecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ScaleUp *HPAScalingRules `protobuf:"bytes,1,opt,name=scale_up,json=scaleUp,proto3" json:"scale_up,omitempty"` // Scale up behavior - ScaleDown *HPAScalingRules `protobuf:"bytes,2,opt,name=scale_down,json=scaleDown,proto3" json:"scale_down,omitempty"` // Scale down behavior + ContainerRecommendations []*VPAContainerRecommendation `protobuf:"bytes,1,rep,name=container_recommendations,json=containerRecommendations,proto3" json:"container_recommendations,omitempty"` // Per-container recommendations } -func (x *HPABehavior) Reset() { - *x = HPABehavior{} +func (x *VPARecommendation) Reset() { + *x = VPARecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[88] + mi := &file_api_v1_common_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPABehavior) String() string { +func (x *VPARecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPABehavior) ProtoMessage() {} +func (*VPARecommendation) ProtoMessage() {} -func (x *HPABehavior) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[88] +func (x *VPARecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10233,53 +11800,48 @@ func (x *HPABehavior) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPABehavior.ProtoReflect.Descriptor instead. -func (*HPABehavior) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{88} -} - -func (x *HPABehavior) GetScaleUp() *HPAScalingRules { - if x != nil { - return x.ScaleUp - } - return nil +// Deprecated: Use VPARecommendation.ProtoReflect.Descriptor instead. +func (*VPARecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{102} } -func (x *HPABehavior) GetScaleDown() *HPAScalingRules { +func (x *VPARecommendation) GetContainerRecommendations() []*VPAContainerRecommendation { if x != nil { - return x.ScaleDown + return x.ContainerRecommendations } return nil } -// HPAScalingRules represents scaling behavior rules -type HPAScalingRules struct { +// VPAContainerRecommendation represents VPA recommendation for a container +type VPAContainerRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StabilizationWindowSeconds int32 `protobuf:"varint,1,opt,name=stabilization_window_seconds,json=stabilizationWindowSeconds,proto3" json:"stabilization_window_seconds,omitempty"` // Stabilization window - SelectPolicy string `protobuf:"bytes,2,opt,name=select_policy,json=selectPolicy,proto3" json:"select_policy,omitempty"` // Policy selection: "Max", "Min", "Disabled" - Policies []*HPAScalingPolicy `protobuf:"bytes,3,rep,name=policies,proto3" json:"policies,omitempty"` // Scaling policies + ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name + Target map[string]string `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Target recommendations + LowerBound map[string]string `protobuf:"bytes,3,rep,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Lower bound recommendations + UpperBound map[string]string `protobuf:"bytes,4,rep,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Upper bound recommendations + UncappedTarget map[string]string `protobuf:"bytes,5,rep,name=uncapped_target,json=uncappedTarget,proto3" json:"uncapped_target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Uncapped target recommendations } -func (x *HPAScalingRules) Reset() { - *x = HPAScalingRules{} +func (x *VPAContainerRecommendation) Reset() { + *x = VPAContainerRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[89] + mi := &file_api_v1_common_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAScalingRules) String() string { +func (x *VPAContainerRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAScalingRules) ProtoMessage() {} +func (*VPAContainerRecommendation) ProtoMessage() {} -func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[89] +func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10290,60 +11852,76 @@ func (x *HPAScalingRules) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAScalingRules.ProtoReflect.Descriptor instead. -func (*HPAScalingRules) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{89} +// Deprecated: Use VPAContainerRecommendation.ProtoReflect.Descriptor instead. +func (*VPAContainerRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{103} +} + +func (x *VPAContainerRecommendation) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *VPAContainerRecommendation) GetTarget() map[string]string { + if x != nil { + return x.Target + } + return nil } -func (x *HPAScalingRules) GetStabilizationWindowSeconds() int32 { +func (x *VPAContainerRecommendation) GetLowerBound() map[string]string { if x != nil { - return x.StabilizationWindowSeconds + return x.LowerBound } - return 0 + return nil } -func (x *HPAScalingRules) GetSelectPolicy() string { +func (x *VPAContainerRecommendation) GetUpperBound() map[string]string { if x != nil { - return x.SelectPolicy + return x.UpperBound } - return "" + return nil } -func (x *HPAScalingRules) GetPolicies() []*HPAScalingPolicy { +func (x *VPAContainerRecommendation) GetUncappedTarget() map[string]string { if x != nil { - return x.Policies + return x.UncappedTarget } return nil } -// HPAScalingPolicy represents a scaling policy -type HPAScalingPolicy struct { +// VPACondition represents a VPA condition +type VPACondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Policy type: "Pods", "Percent" - Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` // Policy value - PeriodSeconds int32 `protobuf:"varint,3,opt,name=period_seconds,json=periodSeconds,proto3" json:"period_seconds,omitempty"` // Period in seconds + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "RecommendationProvided", "LowConfidence", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *HPAScalingPolicy) Reset() { - *x = HPAScalingPolicy{} +func (x *VPACondition) Reset() { + *x = VPACondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[90] + mi := &file_api_v1_common_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HPAScalingPolicy) String() string { +func (x *VPACondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HPAScalingPolicy) ProtoMessage() {} +func (*VPACondition) ProtoMessage() {} -func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[90] +func (x *VPACondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10354,62 +11932,72 @@ func (x *HPAScalingPolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HPAScalingPolicy.ProtoReflect.Descriptor instead. -func (*HPAScalingPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{90} +// Deprecated: Use VPACondition.ProtoReflect.Descriptor instead. +func (*VPACondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{104} } -func (x *HPAScalingPolicy) GetType() string { +func (x *VPACondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *HPAScalingPolicy) GetValue() int32 { +func (x *VPACondition) GetStatus() string { if x != nil { - return x.Value + return x.Status } - return 0 + return "" } -func (x *HPAScalingPolicy) GetPeriodSeconds() int32 { +func (x *VPACondition) GetReason() string { if x != nil { - return x.PeriodSeconds + return x.Reason + } + return "" +} + +func (x *VPACondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *VPACondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime } return 0 } -// VPADetails contains detailed VerticalPodAutoscaler information for drill-down -type VPADetails struct { +// LimitRangeDetails contains detailed LimitRange information for drill-down +type LimitRangeDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetRef *VPATargetRef `protobuf:"bytes,1,opt,name=target_ref,json=targetRef,proto3" json:"target_ref,omitempty"` // Target reference for VPA - UpdatePolicy *VPAUpdatePolicy `protobuf:"bytes,2,opt,name=update_policy,json=updatePolicy,proto3" json:"update_policy,omitempty"` // Update policy configuration - ResourcePolicy *VPAResourcePolicy `protobuf:"bytes,3,opt,name=resource_policy,json=resourcePolicy,proto3" json:"resource_policy,omitempty"` // Resource policy configuration - Recommendation *VPARecommendation `protobuf:"bytes,4,opt,name=recommendation,proto3" json:"recommendation,omitempty"` // Current recommendations - Conditions []*VPACondition `protobuf:"bytes,5,rep,name=conditions,proto3" json:"conditions,omitempty"` // VPA conditions for debugging + Limits []*LimitRangeItem `protobuf:"bytes,1,rep,name=limits,proto3" json:"limits,omitempty"` // Limit range items } -func (x *VPADetails) Reset() { - *x = VPADetails{} +func (x *LimitRangeDetails) Reset() { + *x = LimitRangeDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[91] + mi := &file_api_v1_common_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPADetails) String() string { +func (x *LimitRangeDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPADetails) ProtoMessage() {} +func (*LimitRangeDetails) ProtoMessage() {} -func (x *VPADetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[91] +func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10420,74 +12008,49 @@ func (x *VPADetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPADetails.ProtoReflect.Descriptor instead. -func (*VPADetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{91} -} - -func (x *VPADetails) GetTargetRef() *VPATargetRef { - if x != nil { - return x.TargetRef - } - return nil -} - -func (x *VPADetails) GetUpdatePolicy() *VPAUpdatePolicy { - if x != nil { - return x.UpdatePolicy - } - return nil -} - -func (x *VPADetails) GetResourcePolicy() *VPAResourcePolicy { - if x != nil { - return x.ResourcePolicy - } - return nil -} - -func (x *VPADetails) GetRecommendation() *VPARecommendation { - if x != nil { - return x.Recommendation - } - return nil +// Deprecated: Use LimitRangeDetails.ProtoReflect.Descriptor instead. +func (*LimitRangeDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{105} } -func (x *VPADetails) GetConditions() []*VPACondition { +func (x *LimitRangeDetails) GetLimits() []*LimitRangeItem { if x != nil { - return x.Conditions + return x.Limits } return nil } -// VPATargetRef represents the target resource for VPA -type VPATargetRef struct { +// LimitRangeItem represents a single limit range item +type LimitRangeItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Target resource kind (e.g., "Deployment") - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Target resource name - ApiVersion string `protobuf:"bytes,3,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` // API version of the target resource + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Type: "Container", "Pod", "PersistentVolumeClaim" + DefaultLimits map[string]string `protobuf:"bytes,2,rep,name=default_limits,json=defaultLimits,proto3" json:"default_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default limits + DefaultRequest map[string]string `protobuf:"bytes,3,rep,name=default_request,json=defaultRequest,proto3" json:"default_request,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default requests + Max map[string]string `protobuf:"bytes,4,rep,name=max,proto3" json:"max,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum limits + Min map[string]string `protobuf:"bytes,5,rep,name=min,proto3" json:"min,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum limits + MaxLimitRequestRatio map[string]string `protobuf:"bytes,6,rep,name=max_limit_request_ratio,json=maxLimitRequestRatio,proto3" json:"max_limit_request_ratio,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Max limit/request ratio } -func (x *VPATargetRef) Reset() { - *x = VPATargetRef{} +func (x *LimitRangeItem) Reset() { + *x = LimitRangeItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[92] + mi := &file_api_v1_common_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPATargetRef) String() string { +func (x *LimitRangeItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPATargetRef) ProtoMessage() {} +func (*LimitRangeItem) ProtoMessage() {} -func (x *VPATargetRef) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[92] +func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10498,59 +12061,82 @@ func (x *VPATargetRef) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPATargetRef.ProtoReflect.Descriptor instead. -func (*VPATargetRef) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{92} +// Deprecated: Use LimitRangeItem.ProtoReflect.Descriptor instead. +func (*LimitRangeItem) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{106} } -func (x *VPATargetRef) GetKind() string { +func (x *LimitRangeItem) GetType() string { if x != nil { - return x.Kind + return x.Type } return "" } -func (x *VPATargetRef) GetName() string { +func (x *LimitRangeItem) GetDefaultLimits() map[string]string { if x != nil { - return x.Name + return x.DefaultLimits } - return "" + return nil } -func (x *VPATargetRef) GetApiVersion() string { +func (x *LimitRangeItem) GetDefaultRequest() map[string]string { if x != nil { - return x.ApiVersion + return x.DefaultRequest } - return "" + return nil } -// VPAUpdatePolicy represents VPA update policy -type VPAUpdatePolicy struct { +func (x *LimitRangeItem) GetMax() map[string]string { + if x != nil { + return x.Max + } + return nil +} + +func (x *LimitRangeItem) GetMin() map[string]string { + if x != nil { + return x.Min + } + return nil +} + +func (x *LimitRangeItem) GetMaxLimitRequestRatio() map[string]string { + if x != nil { + return x.MaxLimitRequestRatio + } + return nil +} + +// ServiceAccountDetails contains detailed ServiceAccount information for drill-down +type ServiceAccountDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UpdateMode string `protobuf:"bytes,1,opt,name=update_mode,json=updateMode,proto3" json:"update_mode,omitempty"` // Update mode: "Off", "Initial", "Recreation", "Auto" - MinReplicas int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum replicas during update (optional) + AutomountServiceAccountToken bool `protobuf:"varint,1,opt,name=automount_service_account_token,json=automountServiceAccountToken,proto3" json:"automount_service_account_token,omitempty"` // Whether to automatically mount service account token + Secrets []string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty"` // Names of secrets referenced by this service account + ImagePullSecrets []string `protobuf:"bytes,3,rep,name=image_pull_secrets,json=imagePullSecrets,proto3" json:"image_pull_secrets,omitempty"` // Names of image pull secrets + ResourceVersion string `protobuf:"bytes,4,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` } -func (x *VPAUpdatePolicy) Reset() { - *x = VPAUpdatePolicy{} +func (x *ServiceAccountDetails) Reset() { + *x = ServiceAccountDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[93] + mi := &file_api_v1_common_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAUpdatePolicy) String() string { +func (x *ServiceAccountDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAUpdatePolicy) ProtoMessage() {} +func (*ServiceAccountDetails) ProtoMessage() {} -func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[93] +func (x *ServiceAccountDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10561,51 +12147,65 @@ func (x *VPAUpdatePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAUpdatePolicy.ProtoReflect.Descriptor instead. -func (*VPAUpdatePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{93} +// Deprecated: Use ServiceAccountDetails.ProtoReflect.Descriptor instead. +func (*ServiceAccountDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{107} } -func (x *VPAUpdatePolicy) GetUpdateMode() string { +func (x *ServiceAccountDetails) GetAutomountServiceAccountToken() bool { if x != nil { - return x.UpdateMode + return x.AutomountServiceAccountToken + } + return false +} + +func (x *ServiceAccountDetails) GetSecrets() []string { + if x != nil { + return x.Secrets + } + return nil +} + +func (x *ServiceAccountDetails) GetImagePullSecrets() []string { + if x != nil { + return x.ImagePullSecrets } - return "" + return nil } -func (x *VPAUpdatePolicy) GetMinReplicas() int32 { +func (x *ServiceAccountDetails) GetResourceVersion() string { if x != nil { - return x.MinReplicas + return x.ResourceVersion } - return 0 + return "" } -// VPAResourcePolicy represents VPA resource policy -type VPAResourcePolicy struct { +// RoleDetails contains detailed Role information for drill-down +type RoleDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerPolicies []*VPAContainerResourcePolicy `protobuf:"bytes,1,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` // Per-container policies + Rules []*RoleRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Role rules defining permissions } -func (x *VPAResourcePolicy) Reset() { - *x = VPAResourcePolicy{} +func (x *RoleDetails) Reset() { + *x = RoleDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[94] + mi := &file_api_v1_common_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAResourcePolicy) String() string { +func (x *RoleDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAResourcePolicy) ProtoMessage() {} +func (*RoleDetails) ProtoMessage() {} -func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[94] +func (x *RoleDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10616,49 +12216,47 @@ func (x *VPAResourcePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAResourcePolicy.ProtoReflect.Descriptor instead. -func (*VPAResourcePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{94} +// Deprecated: Use RoleDetails.ProtoReflect.Descriptor instead. +func (*RoleDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{108} } -func (x *VPAResourcePolicy) GetContainerPolicies() []*VPAContainerResourcePolicy { +func (x *RoleDetails) GetRules() []*RoleRule { if x != nil { - return x.ContainerPolicies + return x.Rules } return nil } -// VPAContainerResourcePolicy represents VPA policy for a container -type VPAContainerResourcePolicy struct { +// RoleRule represents a single role rule +type RoleRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name - Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"` // Mode: "Auto", "Off" - MinAllowed map[string]string `protobuf:"bytes,3,rep,name=min_allowed,json=minAllowed,proto3" json:"min_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum allowed resources - MaxAllowed map[string]string `protobuf:"bytes,4,rep,name=max_allowed,json=maxAllowed,proto3" json:"max_allowed,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum allowed resources - ControlledResources []string `protobuf:"bytes,5,rep,name=controlled_resources,json=controlledResources,proto3" json:"controlled_resources,omitempty"` // Controlled resource types - ControlledValues string `protobuf:"bytes,6,opt,name=controlled_values,json=controlledValues,proto3" json:"controlled_values,omitempty"` // Controlled values: "RequestsAndLimits", "RequestsOnly" + ApiGroups []string `protobuf:"bytes,1,rep,name=api_groups,json=apiGroups,proto3" json:"api_groups,omitempty"` // API groups (e.g., "", "apps", "extensions") + Resources []string `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` // Resources (e.g., "pods", "deployments") + Verbs []string `protobuf:"bytes,3,rep,name=verbs,proto3" json:"verbs,omitempty"` // Verbs (e.g., "get", "list", "create", "update", "delete") + ResourceNames []string `protobuf:"bytes,4,rep,name=resource_names,json=resourceNames,proto3" json:"resource_names,omitempty"` // Specific resource names (optional) } -func (x *VPAContainerResourcePolicy) Reset() { - *x = VPAContainerResourcePolicy{} +func (x *RoleRule) Reset() { + *x = RoleRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[95] + mi := &file_api_v1_common_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAContainerResourcePolicy) String() string { +func (x *RoleRule) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAContainerResourcePolicy) ProtoMessage() {} +func (*RoleRule) ProtoMessage() {} -func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[95] +func (x *RoleRule) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10669,79 +12267,66 @@ func (x *VPAContainerResourcePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAContainerResourcePolicy.ProtoReflect.Descriptor instead. -func (*VPAContainerResourcePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{95} -} - -func (x *VPAContainerResourcePolicy) GetContainerName() string { - if x != nil { - return x.ContainerName - } - return "" -} - -func (x *VPAContainerResourcePolicy) GetMode() string { - if x != nil { - return x.Mode - } - return "" +// Deprecated: Use RoleRule.ProtoReflect.Descriptor instead. +func (*RoleRule) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{109} } -func (x *VPAContainerResourcePolicy) GetMinAllowed() map[string]string { +func (x *RoleRule) GetApiGroups() []string { if x != nil { - return x.MinAllowed + return x.ApiGroups } return nil } -func (x *VPAContainerResourcePolicy) GetMaxAllowed() map[string]string { +func (x *RoleRule) GetResources() []string { if x != nil { - return x.MaxAllowed + return x.Resources } return nil } -func (x *VPAContainerResourcePolicy) GetControlledResources() []string { +func (x *RoleRule) GetVerbs() []string { if x != nil { - return x.ControlledResources + return x.Verbs } return nil } -func (x *VPAContainerResourcePolicy) GetControlledValues() string { +func (x *RoleRule) GetResourceNames() []string { if x != nil { - return x.ControlledValues + return x.ResourceNames } - return "" + return nil } -// VPARecommendation represents VPA recommendations -type VPARecommendation struct { +// RoleBindingDetails contains detailed RoleBinding information for drill-down +type RoleBindingDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerRecommendations []*VPAContainerRecommendation `protobuf:"bytes,1,rep,name=container_recommendations,json=containerRecommendations,proto3" json:"container_recommendations,omitempty"` // Per-container recommendations + Subjects []*RoleBindingSubject `protobuf:"bytes,1,rep,name=subjects,proto3" json:"subjects,omitempty"` // Subjects that the role is bound to + RoleRef *RoleReference `protobuf:"bytes,2,opt,name=role_ref,json=roleRef,proto3" json:"role_ref,omitempty"` // Reference to the role being bound } -func (x *VPARecommendation) Reset() { - *x = VPARecommendation{} +func (x *RoleBindingDetails) Reset() { + *x = RoleBindingDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[96] + mi := &file_api_v1_common_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPARecommendation) String() string { +func (x *RoleBindingDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPARecommendation) ProtoMessage() {} +func (*RoleBindingDetails) ProtoMessage() {} -func (x *VPARecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[96] +func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10752,48 +12337,54 @@ func (x *VPARecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPARecommendation.ProtoReflect.Descriptor instead. -func (*VPARecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{96} +// Deprecated: Use RoleBindingDetails.ProtoReflect.Descriptor instead. +func (*RoleBindingDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{110} } -func (x *VPARecommendation) GetContainerRecommendations() []*VPAContainerRecommendation { +func (x *RoleBindingDetails) GetSubjects() []*RoleBindingSubject { if x != nil { - return x.ContainerRecommendations + return x.Subjects } return nil } -// VPAContainerRecommendation represents VPA recommendation for a container -type VPAContainerRecommendation struct { +func (x *RoleBindingDetails) GetRoleRef() *RoleReference { + if x != nil { + return x.RoleRef + } + return nil +} + +// RoleBindingSubject represents a subject in a role binding +type RoleBindingSubject struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` // Container name - Target map[string]string `protobuf:"bytes,2,rep,name=target,proto3" json:"target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Target recommendations - LowerBound map[string]string `protobuf:"bytes,3,rep,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Lower bound recommendations - UpperBound map[string]string `protobuf:"bytes,4,rep,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Upper bound recommendations - UncappedTarget map[string]string `protobuf:"bytes,5,rep,name=uncapped_target,json=uncappedTarget,proto3" json:"uncapped_target,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Uncapped target recommendations + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Subject kind: "User", "Group", "ServiceAccount" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Subject name + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Subject namespace (for ServiceAccount) + ApiGroup string `protobuf:"bytes,4,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (optional) } -func (x *VPAContainerRecommendation) Reset() { - *x = VPAContainerRecommendation{} +func (x *RoleBindingSubject) Reset() { + *x = RoleBindingSubject{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[97] + mi := &file_api_v1_common_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPAContainerRecommendation) String() string { +func (x *RoleBindingSubject) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPAContainerRecommendation) ProtoMessage() {} +func (*RoleBindingSubject) ProtoMessage() {} -func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[97] +func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10804,76 +12395,136 @@ func (x *VPAContainerRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPAContainerRecommendation.ProtoReflect.Descriptor instead. -func (*VPAContainerRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{97} +// Deprecated: Use RoleBindingSubject.ProtoReflect.Descriptor instead. +func (*RoleBindingSubject) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{111} } -func (x *VPAContainerRecommendation) GetContainerName() string { +func (x *RoleBindingSubject) GetKind() string { if x != nil { - return x.ContainerName + return x.Kind } return "" } -func (x *VPAContainerRecommendation) GetTarget() map[string]string { +func (x *RoleBindingSubject) GetName() string { if x != nil { - return x.Target + return x.Name } - return nil + return "" } -func (x *VPAContainerRecommendation) GetLowerBound() map[string]string { +func (x *RoleBindingSubject) GetNamespace() string { if x != nil { - return x.LowerBound + return x.Namespace } - return nil + return "" } -func (x *VPAContainerRecommendation) GetUpperBound() map[string]string { +func (x *RoleBindingSubject) GetApiGroup() string { if x != nil { - return x.UpperBound + return x.ApiGroup } - return nil + return "" } -func (x *VPAContainerRecommendation) GetUncappedTarget() map[string]string { +// RoleReference represents a reference to a role in a role binding +type RoleReference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Role kind: "Role", "ClusterRole" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Role name + ApiGroup string `protobuf:"bytes,3,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (typically "rbac.authorization.k8s.io") +} + +func (x *RoleReference) Reset() { + *x = RoleReference{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoleReference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoleReference) ProtoMessage() {} + +func (x *RoleReference) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[112] + 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 RoleReference.ProtoReflect.Descriptor instead. +func (*RoleReference) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{112} +} + +func (x *RoleReference) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *RoleReference) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RoleReference) GetApiGroup() string { if x != nil { - return x.UncappedTarget + return x.ApiGroup } - return nil + return "" } -// VPACondition represents a VPA condition -type VPACondition struct { +// KedaScaledObjectDetails contains detailed KEDA ScaledObject information +type KedaScaledObjectDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type: "RecommendationProvided", "LowConfidence", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` // Name of the scale target + TargetKind string `protobuf:"bytes,2,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"` // Kind of the scale target (e.g., "Deployment") + MinReplicas int32 `protobuf:"varint,3,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum number of replicas + MaxReplicas int32 `protobuf:"varint,4,opt,name=max_replicas,json=maxReplicas,proto3" json:"max_replicas,omitempty"` // Maximum number of replicas + CurrentReplicas int32 `protobuf:"varint,5,opt,name=current_replicas,json=currentReplicas,proto3" json:"current_replicas,omitempty"` // Current number of replicas + Triggers []*KedaScaledObjectTrigger `protobuf:"bytes,6,rep,name=triggers,proto3" json:"triggers,omitempty"` // List of scaling triggers + Conditions []*KedaScaledObjectCondition `protobuf:"bytes,7,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Active", "Unknown" } -func (x *VPACondition) Reset() { - *x = VPACondition{} +func (x *KedaScaledObjectDetails) Reset() { + *x = KedaScaledObjectDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[98] + mi := &file_api_v1_common_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VPACondition) String() string { +func (x *KedaScaledObjectDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VPACondition) ProtoMessage() {} +func (*KedaScaledObjectDetails) ProtoMessage() {} -func (x *VPACondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[98] +func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10884,72 +12535,94 @@ func (x *VPACondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VPACondition.ProtoReflect.Descriptor instead. -func (*VPACondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{98} +// Deprecated: Use KedaScaledObjectDetails.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{113} } -func (x *VPACondition) GetType() string { +func (x *KedaScaledObjectDetails) GetTargetName() string { if x != nil { - return x.Type + return x.TargetName } return "" } -func (x *VPACondition) GetStatus() string { +func (x *KedaScaledObjectDetails) GetTargetKind() string { if x != nil { - return x.Status + return x.TargetKind } return "" } -func (x *VPACondition) GetReason() string { +func (x *KedaScaledObjectDetails) GetMinReplicas() int32 { if x != nil { - return x.Reason + return x.MinReplicas } - return "" + return 0 } -func (x *VPACondition) GetMessage() string { +func (x *KedaScaledObjectDetails) GetMaxReplicas() int32 { if x != nil { - return x.Message + return x.MaxReplicas } - return "" + return 0 } -func (x *VPACondition) GetLastTransitionTime() int64 { +func (x *KedaScaledObjectDetails) GetCurrentReplicas() int32 { if x != nil { - return x.LastTransitionTime + return x.CurrentReplicas } return 0 } -// LimitRangeDetails contains detailed LimitRange information for drill-down -type LimitRangeDetails struct { +func (x *KedaScaledObjectDetails) GetTriggers() []*KedaScaledObjectTrigger { + if x != nil { + return x.Triggers + } + return nil +} + +func (x *KedaScaledObjectDetails) GetConditions() []*KedaScaledObjectCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *KedaScaledObjectDetails) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +// KedaScaledObjectTrigger represents a scaling trigger +type KedaScaledObjectTrigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Limits []*LimitRangeItem `protobuf:"bytes,1,rep,name=limits,proto3" json:"limits,omitempty"` // Limit range items + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Trigger type (e.g., "cpu", "memory", "prometheus") + Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Trigger-specific metadata } -func (x *LimitRangeDetails) Reset() { - *x = LimitRangeDetails{} +func (x *KedaScaledObjectTrigger) Reset() { + *x = KedaScaledObjectTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[99] + mi := &file_api_v1_common_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LimitRangeDetails) String() string { +func (x *KedaScaledObjectTrigger) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LimitRangeDetails) ProtoMessage() {} +func (*KedaScaledObjectTrigger) ProtoMessage() {} -func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[99] +func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10960,49 +12633,55 @@ func (x *LimitRangeDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LimitRangeDetails.ProtoReflect.Descriptor instead. -func (*LimitRangeDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{99} +// Deprecated: Use KedaScaledObjectTrigger.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectTrigger) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{114} } -func (x *LimitRangeDetails) GetLimits() []*LimitRangeItem { +func (x *KedaScaledObjectTrigger) GetType() string { if x != nil { - return x.Limits + return x.Type + } + return "" +} + +func (x *KedaScaledObjectTrigger) GetMetadata() map[string]string { + if x != nil { + return x.Metadata } return nil } -// LimitRangeItem represents a single limit range item -type LimitRangeItem struct { +// KedaScaledObjectCondition represents a condition of a KEDA ScaledObject +type KedaScaledObjectCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Type: "Container", "Pod", "PersistentVolumeClaim" - DefaultLimits map[string]string `protobuf:"bytes,2,rep,name=default_limits,json=defaultLimits,proto3" json:"default_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default limits - DefaultRequest map[string]string `protobuf:"bytes,3,rep,name=default_request,json=defaultRequest,proto3" json:"default_request,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Default requests - Max map[string]string `protobuf:"bytes,4,rep,name=max,proto3" json:"max,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Maximum limits - Min map[string]string `protobuf:"bytes,5,rep,name=min,proto3" json:"min,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Minimum limits - MaxLimitRequestRatio map[string]string `protobuf:"bytes,6,rep,name=max_limit_request_ratio,json=maxLimitRequestRatio,proto3" json:"max_limit_request_ratio,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Max limit/request ratio + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Active") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *LimitRangeItem) Reset() { - *x = LimitRangeItem{} +func (x *KedaScaledObjectCondition) Reset() { + *x = KedaScaledObjectCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[100] + mi := &file_api_v1_common_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LimitRangeItem) String() string { +func (x *KedaScaledObjectCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LimitRangeItem) ProtoMessage() {} +func (*KedaScaledObjectCondition) ProtoMessage() {} -func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[100] +func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11013,151 +12692,188 @@ func (x *LimitRangeItem) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LimitRangeItem.ProtoReflect.Descriptor instead. -func (*LimitRangeItem) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{100} +// Deprecated: Use KedaScaledObjectCondition.ProtoReflect.Descriptor instead. +func (*KedaScaledObjectCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{115} } -func (x *LimitRangeItem) GetType() string { +func (x *KedaScaledObjectCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *LimitRangeItem) GetDefaultLimits() map[string]string { - if x != nil { - return x.DefaultLimits - } - return nil -} - -func (x *LimitRangeItem) GetDefaultRequest() map[string]string { +func (x *KedaScaledObjectCondition) GetStatus() string { if x != nil { - return x.DefaultRequest + return x.Status } - return nil + return "" } -func (x *LimitRangeItem) GetMax() map[string]string { +func (x *KedaScaledObjectCondition) GetReason() string { if x != nil { - return x.Max + return x.Reason } - return nil + return "" } -func (x *LimitRangeItem) GetMin() map[string]string { +func (x *KedaScaledObjectCondition) GetMessage() string { if x != nil { - return x.Min + return x.Message } - return nil + return "" } -func (x *LimitRangeItem) GetMaxLimitRequestRatio() map[string]string { +func (x *KedaScaledObjectCondition) GetLastTransitionTime() int64 { if x != nil { - return x.MaxLimitRequestRatio + return x.LastTransitionTime } - return nil + return 0 } -// ServiceAccountDetails contains detailed ServiceAccount information for drill-down -type ServiceAccountDetails struct { +// KarpenterResourceDetails contains detailed Karpenter resource information +type KarpenterResourceDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AutomountServiceAccountToken bool `protobuf:"varint,1,opt,name=automount_service_account_token,json=automountServiceAccountToken,proto3" json:"automount_service_account_token,omitempty"` // Whether to automatically mount service account token - Secrets []string `protobuf:"bytes,2,rep,name=secrets,proto3" json:"secrets,omitempty"` // Names of secrets referenced by this service account - ImagePullSecrets []string `protobuf:"bytes,3,rep,name=image_pull_secrets,json=imagePullSecrets,proto3" json:"image_pull_secrets,omitempty"` // Names of image pull secrets - ResourceVersion string `protobuf:"bytes,4,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` // Type of Karpenter resource (NodePool, NodeClaim, Provisioner) + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Available", "Unknown" + Conditions []*KarpenterResourceCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + Capacity *KarpenterCapacity `protobuf:"bytes,4,opt,name=capacity,proto3" json:"capacity,omitempty"` // Resource capacity (for NodePool/NodeClaim) + Requirements []*KarpenterRequirement `protobuf:"bytes,5,rep,name=requirements,proto3" json:"requirements,omitempty"` // Instance requirements (for NodePool) + NodeClassRef string `protobuf:"bytes,6,opt,name=node_class_ref,json=nodeClassRef,proto3" json:"node_class_ref,omitempty"` // Reference to NodeClass (for NodePool) + NodeName string `protobuf:"bytes,7,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Associated node name (for NodeClaim) + Limits map[string]string `protobuf:"bytes,8,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (for Provisioner) + KarpenterVersion string `protobuf:"bytes,9,opt,name=karpenter_version,json=karpenterVersion,proto3" json:"karpenter_version,omitempty"` // Karpenter version } -func (x *ServiceAccountDetails) Reset() { - *x = ServiceAccountDetails{} +func (x *KarpenterResourceDetails) Reset() { + *x = KarpenterResourceDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[101] + mi := &file_api_v1_common_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ServiceAccountDetails) String() string { +func (x *KarpenterResourceDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceAccountDetails) ProtoMessage() {} - -func (x *ServiceAccountDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[101] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (*KarpenterResourceDetails) ProtoMessage() {} + +func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[116] + 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 KarpenterResourceDetails.ProtoReflect.Descriptor instead. +func (*KarpenterResourceDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{116} +} + +func (x *KarpenterResourceDetails) GetResourceType() string { + if x != nil { + return x.ResourceType + } + return "" +} + +func (x *KarpenterResourceDetails) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *KarpenterResourceDetails) GetConditions() []*KarpenterResourceCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *KarpenterResourceDetails) GetCapacity() *KarpenterCapacity { + if x != nil { + return x.Capacity } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ServiceAccountDetails.ProtoReflect.Descriptor instead. -func (*ServiceAccountDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{101} +func (x *KarpenterResourceDetails) GetRequirements() []*KarpenterRequirement { + if x != nil { + return x.Requirements + } + return nil } -func (x *ServiceAccountDetails) GetAutomountServiceAccountToken() bool { +func (x *KarpenterResourceDetails) GetNodeClassRef() string { if x != nil { - return x.AutomountServiceAccountToken + return x.NodeClassRef } - return false + return "" } -func (x *ServiceAccountDetails) GetSecrets() []string { +func (x *KarpenterResourceDetails) GetNodeName() string { if x != nil { - return x.Secrets + return x.NodeName } - return nil + return "" } -func (x *ServiceAccountDetails) GetImagePullSecrets() []string { +func (x *KarpenterResourceDetails) GetLimits() map[string]string { if x != nil { - return x.ImagePullSecrets + return x.Limits } return nil } -func (x *ServiceAccountDetails) GetResourceVersion() string { +func (x *KarpenterResourceDetails) GetKarpenterVersion() string { if x != nil { - return x.ResourceVersion + return x.KarpenterVersion } return "" } -// RoleDetails contains detailed Role information for drill-down -type RoleDetails struct { +// KarpenterResourceCondition represents a condition of a Karpenter resource +type KarpenterResourceCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rules []*RoleRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` // Role rules defining permissions + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Available") + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *RoleDetails) Reset() { - *x = RoleDetails{} +func (x *KarpenterResourceCondition) Reset() { + *x = KarpenterResourceCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[102] + mi := &file_api_v1_common_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleDetails) String() string { +func (x *KarpenterResourceCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleDetails) ProtoMessage() {} +func (*KarpenterResourceCondition) ProtoMessage() {} -func (x *RoleDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[102] +func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11168,47 +12884,74 @@ func (x *RoleDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleDetails.ProtoReflect.Descriptor instead. -func (*RoleDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{102} +// Deprecated: Use KarpenterResourceCondition.ProtoReflect.Descriptor instead. +func (*KarpenterResourceCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{117} } -func (x *RoleDetails) GetRules() []*RoleRule { +func (x *KarpenterResourceCondition) GetType() string { if x != nil { - return x.Rules + return x.Type } - return nil + return "" } -// RoleRule represents a single role rule -type RoleRule struct { +func (x *KarpenterResourceCondition) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *KarpenterResourceCondition) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *KarpenterResourceCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *KarpenterResourceCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime + } + return 0 +} + +// KarpenterCapacity represents capacity information +type KarpenterCapacity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ApiGroups []string `protobuf:"bytes,1,rep,name=api_groups,json=apiGroups,proto3" json:"api_groups,omitempty"` // API groups (e.g., "", "apps", "extensions") - Resources []string `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` // Resources (e.g., "pods", "deployments") - Verbs []string `protobuf:"bytes,3,rep,name=verbs,proto3" json:"verbs,omitempty"` // Verbs (e.g., "get", "list", "create", "update", "delete") - ResourceNames []string `protobuf:"bytes,4,rep,name=resource_names,json=resourceNames,proto3" json:"resource_names,omitempty"` // Specific resource names (optional) + Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` // CPU capacity (e.g., "4") + Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` // Memory capacity (e.g., "16Gi") + Other map[string]string `protobuf:"bytes,3,rep,name=other,proto3" json:"other,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Other resource capacities } -func (x *RoleRule) Reset() { - *x = RoleRule{} +func (x *KarpenterCapacity) Reset() { + *x = KarpenterCapacity{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[103] + mi := &file_api_v1_common_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleRule) String() string { +func (x *KarpenterCapacity) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleRule) ProtoMessage() {} +func (*KarpenterCapacity) ProtoMessage() {} -func (x *RoleRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[103] +func (x *KarpenterCapacity) 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 { @@ -11219,66 +12962,60 @@ func (x *RoleRule) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleRule.ProtoReflect.Descriptor instead. -func (*RoleRule) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{103} -} - -func (x *RoleRule) GetApiGroups() []string { - if x != nil { - return x.ApiGroups - } - return nil +// Deprecated: Use KarpenterCapacity.ProtoReflect.Descriptor instead. +func (*KarpenterCapacity) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{118} } -func (x *RoleRule) GetResources() []string { +func (x *KarpenterCapacity) GetCpu() string { if x != nil { - return x.Resources + return x.Cpu } - return nil + return "" } -func (x *RoleRule) GetVerbs() []string { +func (x *KarpenterCapacity) GetMemory() string { if x != nil { - return x.Verbs + return x.Memory } - return nil + return "" } -func (x *RoleRule) GetResourceNames() []string { +func (x *KarpenterCapacity) GetOther() map[string]string { if x != nil { - return x.ResourceNames + return x.Other } return nil } -// RoleBindingDetails contains detailed RoleBinding information for drill-down -type RoleBindingDetails struct { +// KarpenterRequirement represents an instance requirement +type KarpenterRequirement struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Subjects []*RoleBindingSubject `protobuf:"bytes,1,rep,name=subjects,proto3" json:"subjects,omitempty"` // Subjects that the role is bound to - RoleRef *RoleReference `protobuf:"bytes,2,opt,name=role_ref,json=roleRef,proto3" json:"role_ref,omitempty"` // Reference to the role being bound + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Requirement key (e.g., "node.kubernetes.io/instance-type") + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // Operator (e.g., "In", "NotIn", "Exists") + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Requirement values } -func (x *RoleBindingDetails) Reset() { - *x = RoleBindingDetails{} +func (x *KarpenterRequirement) Reset() { + *x = KarpenterRequirement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[104] + mi := &file_api_v1_common_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleBindingDetails) String() string { +func (x *KarpenterRequirement) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleBindingDetails) ProtoMessage() {} +func (*KarpenterRequirement) ProtoMessage() {} -func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[104] +func (x *KarpenterRequirement) 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 { @@ -11289,54 +13026,59 @@ func (x *RoleBindingDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleBindingDetails.ProtoReflect.Descriptor instead. -func (*RoleBindingDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{104} +// Deprecated: Use KarpenterRequirement.ProtoReflect.Descriptor instead. +func (*KarpenterRequirement) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{119} } -func (x *RoleBindingDetails) GetSubjects() []*RoleBindingSubject { +func (x *KarpenterRequirement) GetKey() string { if x != nil { - return x.Subjects + return x.Key } - return nil + return "" } -func (x *RoleBindingDetails) GetRoleRef() *RoleReference { +func (x *KarpenterRequirement) GetOperator() string { if x != nil { - return x.RoleRef + return x.Operator + } + return "" +} + +func (x *KarpenterRequirement) GetValues() []string { + if x != nil { + return x.Values } return nil } -// RoleBindingSubject represents a subject in a role binding -type RoleBindingSubject struct { +// ResourceFieldFilter filters resources on a single field; values are OR'd together. +type ResourceFieldFilter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Subject kind: "User", "Group", "ServiceAccount" - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Subject name - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // Subject namespace (for ServiceAccount) - ApiGroup string `protobuf:"bytes,4,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (optional) + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` // e.g. "type", "class", "kind", "namespace" + Values []string `protobuf:"bytes,2,rep,name=values,proto3" json:"values,omitempty"` // OR'd together } -func (x *RoleBindingSubject) Reset() { - *x = RoleBindingSubject{} +func (x *ResourceFieldFilter) Reset() { + *x = ResourceFieldFilter{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[105] + mi := &file_api_v1_common_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleBindingSubject) String() string { +func (x *ResourceFieldFilter) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleBindingSubject) ProtoMessage() {} +func (*ResourceFieldFilter) ProtoMessage() {} -func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[105] +func (x *ResourceFieldFilter) 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 { @@ -11347,67 +13089,54 @@ func (x *RoleBindingSubject) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleBindingSubject.ProtoReflect.Descriptor instead. -func (*RoleBindingSubject) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{105} -} - -func (x *RoleBindingSubject) GetKind() string { - if x != nil { - return x.Kind - } - return "" -} - -func (x *RoleBindingSubject) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use ResourceFieldFilter.ProtoReflect.Descriptor instead. +func (*ResourceFieldFilter) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{120} } -func (x *RoleBindingSubject) GetNamespace() string { +func (x *ResourceFieldFilter) GetField() string { if x != nil { - return x.Namespace + return x.Field } return "" } -func (x *RoleBindingSubject) GetApiGroup() string { +func (x *ResourceFieldFilter) GetValues() []string { if x != nil { - return x.ApiGroup + return x.Values } - return "" + return nil } -// RoleReference represents a reference to a role in a role binding -type RoleReference struct { +// ResourceFilterFieldOptions describes the distinct values available for a filterable field. +type ResourceFilterFieldOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Role kind: "Role", "ClusterRole" - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Role name - ApiGroup string `protobuf:"bytes,3,opt,name=api_group,json=apiGroup,proto3" json:"api_group,omitempty"` // API group (typically "rbac.authorization.k8s.io") + Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"` + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` + Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` + Truncated bool `protobuf:"varint,4,opt,name=truncated,proto3" json:"truncated,omitempty"` // true when the value list was capped and is incomplete } - -func (x *RoleReference) Reset() { - *x = RoleReference{} + +func (x *ResourceFilterFieldOptions) Reset() { + *x = ResourceFilterFieldOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[106] + mi := &file_api_v1_common_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RoleReference) String() string { +func (x *ResourceFilterFieldOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RoleReference) ProtoMessage() {} +func (*ResourceFilterFieldOptions) ProtoMessage() {} -func (x *RoleReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[106] +func (x *ResourceFilterFieldOptions) 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 { @@ -11418,65 +13147,84 @@ func (x *RoleReference) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RoleReference.ProtoReflect.Descriptor instead. -func (*RoleReference) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{106} +// Deprecated: Use ResourceFilterFieldOptions.ProtoReflect.Descriptor instead. +func (*ResourceFilterFieldOptions) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{121} } -func (x *RoleReference) GetKind() string { +func (x *ResourceFilterFieldOptions) GetField() string { if x != nil { - return x.Kind + return x.Field } return "" } -func (x *RoleReference) GetName() string { +func (x *ResourceFilterFieldOptions) GetLabel() string { if x != nil { - return x.Name + return x.Label } return "" } -func (x *RoleReference) GetApiGroup() string { +func (x *ResourceFilterFieldOptions) GetValues() []string { if x != nil { - return x.ApiGroup + return x.Values } - return "" + return nil } -// KedaScaledObjectDetails contains detailed KEDA ScaledObject information -type KedaScaledObjectDetails struct { +func (x *ResourceFilterFieldOptions) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +// WorkloadFilters provides optional filters for narrowing the GetWorkloads request. +// All fields are optional. When multiple fields are provided, they are ANDed together. +type WorkloadFilters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` // Name of the scale target - TargetKind string `protobuf:"bytes,2,opt,name=target_kind,json=targetKind,proto3" json:"target_kind,omitempty"` // Kind of the scale target (e.g., "Deployment") - MinReplicas int32 `protobuf:"varint,3,opt,name=min_replicas,json=minReplicas,proto3" json:"min_replicas,omitempty"` // Minimum number of replicas - MaxReplicas int32 `protobuf:"varint,4,opt,name=max_replicas,json=maxReplicas,proto3" json:"max_replicas,omitempty"` // Maximum number of replicas - CurrentReplicas int32 `protobuf:"varint,5,opt,name=current_replicas,json=currentReplicas,proto3" json:"current_replicas,omitempty"` // Current number of replicas - Triggers []*KedaScaledObjectTrigger `protobuf:"bytes,6,rep,name=triggers,proto3" json:"triggers,omitempty"` // List of scaling triggers - Conditions []*KedaScaledObjectCondition `protobuf:"bytes,7,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions - Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Active", "Unknown" + // Targeting criteria (AND logic between non-null fields) + NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels + KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds + // Match workloads with at least one container detected as one of these + // languages (e.g. "python", "go", "java"). ANY container matching is + // sufficient — containers do not all need to match. + LanguageFilter []string `protobuf:"bytes,17,rep,name=language_filter,json=languageFilter,proto3" json:"language_filter,omitempty"` + // Exact detected version strings (e.g. "3.11.4"). Only meaningful when + // language_filter is also set; ignored otherwise. + LanguageVersionFilter []string `protobuf:"bytes,18,rep,name=language_version_filter,json=languageVersionFilter,proto3" json:"language_version_filter,omitempty"` + NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes + NamespaceNames []string `protobuf:"bytes,22,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` // Target workloads in any of these namespaces by exact name (OR'd together; ANDed with other filter fields; no-op when empty) + NamespacePattern *RegexPattern `protobuf:"bytes,23,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Lifecycle status filter (overrides legacy show_deleted when set) + Status WorkloadStatusFilter `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.WorkloadStatusFilter" json:"status,omitempty"` // ACTIVE, DELETED, or BOTH } -func (x *KedaScaledObjectDetails) Reset() { - *x = KedaScaledObjectDetails{} +func (x *WorkloadFilters) Reset() { + *x = WorkloadFilters{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[107] + mi := &file_api_v1_common_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectDetails) String() string { +func (x *WorkloadFilters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectDetails) ProtoMessage() {} +func (*WorkloadFilters) ProtoMessage() {} -func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[107] +func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11487,94 +13235,129 @@ func (x *KedaScaledObjectDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectDetails.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{107} +// Deprecated: Use WorkloadFilters.ProtoReflect.Descriptor instead. +func (*WorkloadFilters) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{122} } -func (x *KedaScaledObjectDetails) GetTargetName() string { +func (x *WorkloadFilters) GetNamespaceSelector() *LabelSelector { if x != nil { - return x.TargetName + return x.NamespaceSelector } - return "" + return nil } -func (x *KedaScaledObjectDetails) GetTargetKind() string { +func (x *WorkloadFilters) GetWorkloadSelector() *LabelSelector { if x != nil { - return x.TargetKind + return x.WorkloadSelector } - return "" + return nil } -func (x *KedaScaledObjectDetails) GetMinReplicas() int32 { +func (x *WorkloadFilters) GetKindFilter() []K8SObjectKind { if x != nil { - return x.MinReplicas + return x.KindFilter } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetMaxReplicas() int32 { +func (x *WorkloadFilters) GetNamePattern() *RegexPattern { if x != nil { - return x.MaxReplicas + return x.NamePattern } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetCurrentReplicas() int32 { +func (x *WorkloadFilters) GetAnnotationSelector() *LabelSelector { if x != nil { - return x.CurrentReplicas + return x.AnnotationSelector } - return 0 + return nil } -func (x *KedaScaledObjectDetails) GetTriggers() []*KedaScaledObjectTrigger { +func (x *WorkloadFilters) GetWorkloadNames() []string { if x != nil { - return x.Triggers + return x.WorkloadNames } return nil } -func (x *KedaScaledObjectDetails) GetConditions() []*KedaScaledObjectCondition { +func (x *WorkloadFilters) GetLanguageFilter() []string { if x != nil { - return x.Conditions + return x.LanguageFilter } return nil } -func (x *KedaScaledObjectDetails) GetStatus() string { +func (x *WorkloadFilters) GetLanguageVersionFilter() []string { + if x != nil { + return x.LanguageVersionFilter + } + return nil +} + +func (x *WorkloadFilters) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *WorkloadFilters) GetNamespaceNames() []string { + if x != nil { + return x.NamespaceNames + } + return nil +} + +func (x *WorkloadFilters) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *WorkloadFilters) GetStatus() WorkloadStatusFilter { if x != nil { return x.Status } - return "" + return WorkloadStatusFilter_WORKLOAD_STATUS_FILTER_UNSPECIFIED } -// KedaScaledObjectTrigger represents a scaling trigger -type KedaScaledObjectTrigger struct { +// PodDisruptionBudgetDetails contains detailed PodDisruptionBudget information +type PodDisruptionBudgetDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Trigger type (e.g., "cpu", "memory", "prometheus") - Metadata map[string]string `protobuf:"bytes,2,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Trigger-specific metadata + MinAvailable int32 `protobuf:"varint,1,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum number of pods that should be available + MaxUnavailable int32 `protobuf:"varint,2,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // Maximum number of pods that can be unavailable + CurrentHealthy int32 `protobuf:"varint,3,opt,name=current_healthy,json=currentHealthy,proto3" json:"current_healthy,omitempty"` // Current number of healthy pods + DesiredHealthy int32 `protobuf:"varint,4,opt,name=desired_healthy,json=desiredHealthy,proto3" json:"desired_healthy,omitempty"` // Desired number of healthy pods + DisruptionsAllowed int32 `protobuf:"varint,5,opt,name=disruptions_allowed,json=disruptionsAllowed,proto3" json:"disruptions_allowed,omitempty"` // Number of disruptions currently allowed + ExpectedPods int32 `protobuf:"varint,6,opt,name=expected_pods,json=expectedPods,proto3" json:"expected_pods,omitempty"` // Expected number of pods + Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Healthy", "Disrupted", "Unknown" + SelectorLabels map[string]string `protobuf:"bytes,8,rep,name=selector_labels,json=selectorLabels,proto3" json:"selector_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector for target pods + Conditions []*PodDisruptionBudgetCondition `protobuf:"bytes,9,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions } -func (x *KedaScaledObjectTrigger) Reset() { - *x = KedaScaledObjectTrigger{} +func (x *PodDisruptionBudgetDetails) Reset() { + *x = PodDisruptionBudgetDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[108] + mi := &file_api_v1_common_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectTrigger) String() string { +func (x *PodDisruptionBudgetDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectTrigger) ProtoMessage() {} +func (*PodDisruptionBudgetDetails) ProtoMessage() {} -func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[108] +func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11585,55 +13368,104 @@ func (x *KedaScaledObjectTrigger) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectTrigger.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectTrigger) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{108} +// Deprecated: Use PodDisruptionBudgetDetails.ProtoReflect.Descriptor instead. +func (*PodDisruptionBudgetDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{123} } -func (x *KedaScaledObjectTrigger) GetType() string { +func (x *PodDisruptionBudgetDetails) GetMinAvailable() int32 { if x != nil { - return x.Type + return x.MinAvailable + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetMaxUnavailable() int32 { + if x != nil { + return x.MaxUnavailable + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetCurrentHealthy() int32 { + if x != nil { + return x.CurrentHealthy + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetDesiredHealthy() int32 { + if x != nil { + return x.DesiredHealthy + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetDisruptionsAllowed() int32 { + if x != nil { + return x.DisruptionsAllowed + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetExpectedPods() int32 { + if x != nil { + return x.ExpectedPods + } + return 0 +} + +func (x *PodDisruptionBudgetDetails) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (x *KedaScaledObjectTrigger) GetMetadata() map[string]string { +func (x *PodDisruptionBudgetDetails) GetSelectorLabels() map[string]string { if x != nil { - return x.Metadata + return x.SelectorLabels } return nil } -// KedaScaledObjectCondition represents a condition of a KEDA ScaledObject -type KedaScaledObjectCondition struct { +func (x *PodDisruptionBudgetDetails) GetConditions() []*PodDisruptionBudgetCondition { + if x != nil { + return x.Conditions + } + return nil +} + +// PodDisruptionBudgetCondition represents a condition of a PodDisruptionBudget +type PodDisruptionBudgetCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Active") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "DisruptionAllowed") Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *KedaScaledObjectCondition) Reset() { - *x = KedaScaledObjectCondition{} +func (x *PodDisruptionBudgetCondition) Reset() { + *x = PodDisruptionBudgetCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[109] + mi := &file_api_v1_common_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KedaScaledObjectCondition) String() string { +func (x *PodDisruptionBudgetCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KedaScaledObjectCondition) ProtoMessage() {} +func (*PodDisruptionBudgetCondition) ProtoMessage() {} -func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[109] +func (x *PodDisruptionBudgetCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11644,80 +13476,77 @@ func (x *KedaScaledObjectCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KedaScaledObjectCondition.ProtoReflect.Descriptor instead. -func (*KedaScaledObjectCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{109} +// Deprecated: Use PodDisruptionBudgetCondition.ProtoReflect.Descriptor instead. +func (*PodDisruptionBudgetCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{124} } -func (x *KedaScaledObjectCondition) GetType() string { +func (x *PodDisruptionBudgetCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *KedaScaledObjectCondition) GetStatus() string { +func (x *PodDisruptionBudgetCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *KedaScaledObjectCondition) GetReason() string { +func (x *PodDisruptionBudgetCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *KedaScaledObjectCondition) GetMessage() string { +func (x *PodDisruptionBudgetCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *KedaScaledObjectCondition) GetLastTransitionTime() int64 { +func (x *PodDisruptionBudgetCondition) GetLastTransitionTime() int64 { if x != nil { return x.LastTransitionTime } return 0 } -// KarpenterResourceDetails contains detailed Karpenter resource information -type KarpenterResourceDetails struct { +// ResourceQuotaDetails contains detailed ResourceQuota information +type ResourceQuotaDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` // Type of Karpenter resource (NodePool, NodeClaim, Provisioner) - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Ready", "Available", "Unknown" - Conditions []*KarpenterResourceCondition `protobuf:"bytes,3,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions - Capacity *KarpenterCapacity `protobuf:"bytes,4,opt,name=capacity,proto3" json:"capacity,omitempty"` // Resource capacity (for NodePool/NodeClaim) - Requirements []*KarpenterRequirement `protobuf:"bytes,5,rep,name=requirements,proto3" json:"requirements,omitempty"` // Instance requirements (for NodePool) - NodeClassRef string `protobuf:"bytes,6,opt,name=node_class_ref,json=nodeClassRef,proto3" json:"node_class_ref,omitempty"` // Reference to NodeClass (for NodePool) - NodeName string `protobuf:"bytes,7,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Associated node name (for NodeClaim) - Limits map[string]string `protobuf:"bytes,8,rep,name=limits,proto3" json:"limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Resource limits (for Provisioner) - KarpenterVersion string `protobuf:"bytes,9,opt,name=karpenter_version,json=karpenterVersion,proto3" json:"karpenter_version,omitempty"` // Karpenter version + HardLimits map[string]string `protobuf:"bytes,1,rep,name=hard_limits,json=hardLimits,proto3" json:"hard_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Hard resource limits (e.g., "requests.cpu": "4", "requests.memory": "8Gi") + Used map[string]string `protobuf:"bytes,2,rep,name=used,proto3" json:"used,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Currently used resources + Scopes []string `protobuf:"bytes,3,rep,name=scopes,proto3" json:"scopes,omitempty"` // Quota scopes: ["BestEffort", "NotBestEffort", "NotTerminating", "Terminating"] + ScopeSelector map[string]string `protobuf:"bytes,4,rep,name=scope_selector,json=scopeSelector,proto3" json:"scope_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Scope selector match labels + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Valid", "Invalid", "Unknown" + Conditions []*ResourceQuotaCondition `protobuf:"bytes,6,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions } -func (x *KarpenterResourceDetails) Reset() { - *x = KarpenterResourceDetails{} +func (x *ResourceQuotaDetails) Reset() { + *x = ResourceQuotaDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[110] + mi := &file_api_v1_common_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterResourceDetails) String() string { +func (x *ResourceQuotaDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterResourceDetails) ProtoMessage() {} +func (*ResourceQuotaDetails) ProtoMessage() {} -func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[110] +func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11728,104 +13557,83 @@ func (x *KarpenterResourceDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterResourceDetails.ProtoReflect.Descriptor instead. -func (*KarpenterResourceDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{110} -} - -func (x *KarpenterResourceDetails) GetResourceType() string { - if x != nil { - return x.ResourceType - } - return "" -} - -func (x *KarpenterResourceDetails) GetStatus() string { - if x != nil { - return x.Status - } - return "" +// Deprecated: Use ResourceQuotaDetails.ProtoReflect.Descriptor instead. +func (*ResourceQuotaDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{125} } -func (x *KarpenterResourceDetails) GetConditions() []*KarpenterResourceCondition { +func (x *ResourceQuotaDetails) GetHardLimits() map[string]string { if x != nil { - return x.Conditions + return x.HardLimits } return nil } -func (x *KarpenterResourceDetails) GetCapacity() *KarpenterCapacity { +func (x *ResourceQuotaDetails) GetUsed() map[string]string { if x != nil { - return x.Capacity + return x.Used } return nil } -func (x *KarpenterResourceDetails) GetRequirements() []*KarpenterRequirement { +func (x *ResourceQuotaDetails) GetScopes() []string { if x != nil { - return x.Requirements + return x.Scopes } return nil } -func (x *KarpenterResourceDetails) GetNodeClassRef() string { +func (x *ResourceQuotaDetails) GetScopeSelector() map[string]string { if x != nil { - return x.NodeClassRef + return x.ScopeSelector } - return "" + return nil } -func (x *KarpenterResourceDetails) GetNodeName() string { +func (x *ResourceQuotaDetails) GetStatus() string { if x != nil { - return x.NodeName + return x.Status } return "" } -func (x *KarpenterResourceDetails) GetLimits() map[string]string { +func (x *ResourceQuotaDetails) GetConditions() []*ResourceQuotaCondition { if x != nil { - return x.Limits + return x.Conditions } return nil } -func (x *KarpenterResourceDetails) GetKarpenterVersion() string { - if x != nil { - return x.KarpenterVersion - } - return "" -} - -// KarpenterResourceCondition represents a condition of a Karpenter resource -type KarpenterResourceCondition struct { +// ResourceQuotaCondition represents a condition of a ResourceQuota +type ResourceQuotaCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "Ready", "Available") + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (typically not used in core/v1) Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time } -func (x *KarpenterResourceCondition) Reset() { - *x = KarpenterResourceCondition{} +func (x *ResourceQuotaCondition) Reset() { + *x = ResourceQuotaCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[111] + mi := &file_api_v1_common_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterResourceCondition) String() string { +func (x *ResourceQuotaCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterResourceCondition) ProtoMessage() {} +func (*ResourceQuotaCondition) ProtoMessage() {} -func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[111] +func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11836,74 +13644,78 @@ func (x *KarpenterResourceCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterResourceCondition.ProtoReflect.Descriptor instead. -func (*KarpenterResourceCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{111} +// Deprecated: Use ResourceQuotaCondition.ProtoReflect.Descriptor instead. +func (*ResourceQuotaCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{126} } -func (x *KarpenterResourceCondition) GetType() string { +func (x *ResourceQuotaCondition) GetType() string { if x != nil { return x.Type } return "" } -func (x *KarpenterResourceCondition) GetStatus() string { +func (x *ResourceQuotaCondition) GetStatus() string { if x != nil { return x.Status } return "" } -func (x *KarpenterResourceCondition) GetReason() string { +func (x *ResourceQuotaCondition) GetReason() string { if x != nil { return x.Reason } return "" } -func (x *KarpenterResourceCondition) GetMessage() string { +func (x *ResourceQuotaCondition) GetMessage() string { if x != nil { return x.Message } return "" } -func (x *KarpenterResourceCondition) GetLastTransitionTime() int64 { +func (x *ResourceQuotaCondition) GetLastTransitionTime() int64 { if x != nil { return x.LastTransitionTime } return 0 } -// KarpenterCapacity represents capacity information -type KarpenterCapacity struct { +// VolcanoJobDetails contains detailed VolcanoJob information for drill-down +type VolcanoJobDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` // CPU capacity (e.g., "4") - Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` // Memory capacity (e.g., "16Gi") - Other map[string]string `protobuf:"bytes,3,rep,name=other,proto3" json:"other,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Other resource capacities + Containers []*ContainerTemplate `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates from pod spec + Conditions []*VolcanoJobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // VolcanoJob conditions for debugging + Queue string `protobuf:"bytes,3,opt,name=queue,proto3" json:"queue,omitempty"` // Queue name for scheduling + MinAvailable int32 `protobuf:"varint,4,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum available pods + SchedulePolicy string `protobuf:"bytes,5,opt,name=schedule_policy,json=schedulePolicy,proto3" json:"schedule_policy,omitempty"` // Schedule policy name + PriorityClass string `protobuf:"bytes,6,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name + Tasks []*VolcanoTask `protobuf:"bytes,7,rep,name=tasks,proto3" json:"tasks,omitempty"` // Tasks in the job } -func (x *KarpenterCapacity) Reset() { - *x = KarpenterCapacity{} +func (x *VolcanoJobDetails) Reset() { + *x = VolcanoJobDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[112] + mi := &file_api_v1_common_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterCapacity) String() string { +func (x *VolcanoJobDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterCapacity) ProtoMessage() {} +func (*VolcanoJobDetails) ProtoMessage() {} -func (x *KarpenterCapacity) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[112] +func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11914,60 +13726,90 @@ func (x *KarpenterCapacity) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterCapacity.ProtoReflect.Descriptor instead. -func (*KarpenterCapacity) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{112} +// Deprecated: Use VolcanoJobDetails.ProtoReflect.Descriptor instead. +func (*VolcanoJobDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{127} } -func (x *KarpenterCapacity) GetCpu() string { +func (x *VolcanoJobDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.Cpu + return x.Containers + } + return nil +} + +func (x *VolcanoJobDetails) GetConditions() []*VolcanoJobCondition { + if x != nil { + return x.Conditions + } + return nil +} + +func (x *VolcanoJobDetails) GetQueue() string { + if x != nil { + return x.Queue } return "" } -func (x *KarpenterCapacity) GetMemory() string { +func (x *VolcanoJobDetails) GetMinAvailable() int32 { if x != nil { - return x.Memory + return x.MinAvailable + } + return 0 +} + +func (x *VolcanoJobDetails) GetSchedulePolicy() string { + if x != nil { + return x.SchedulePolicy } return "" } -func (x *KarpenterCapacity) GetOther() map[string]string { +func (x *VolcanoJobDetails) GetPriorityClass() string { if x != nil { - return x.Other + return x.PriorityClass + } + return "" +} + +func (x *VolcanoJobDetails) GetTasks() []*VolcanoTask { + if x != nil { + return x.Tasks } return nil } -// KarpenterRequirement represents an instance requirement -type KarpenterRequirement struct { +// VolcanoJobCondition represents a volcano job condition +type VolcanoJobCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Requirement key (e.g., "node.kubernetes.io/instance-type") - Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` // Operator (e.g., "In", "NotIn", "Exists") - Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"` // Requirement values + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Pending", "Running", "Completed", "Failed", etc. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned } -func (x *KarpenterRequirement) Reset() { - *x = KarpenterRequirement{} +func (x *VolcanoJobCondition) Reset() { + *x = VolcanoJobCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[113] + mi := &file_api_v1_common_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterRequirement) String() string { +func (x *VolcanoJobCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterRequirement) ProtoMessage() {} +func (*VolcanoJobCondition) ProtoMessage() {} -func (x *KarpenterRequirement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[113] +func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11978,68 +13820,74 @@ func (x *KarpenterRequirement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterRequirement.ProtoReflect.Descriptor instead. -func (*KarpenterRequirement) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{113} +// Deprecated: Use VolcanoJobCondition.ProtoReflect.Descriptor instead. +func (*VolcanoJobCondition) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{128} } -func (x *KarpenterRequirement) GetKey() string { +func (x *VolcanoJobCondition) GetType() string { if x != nil { - return x.Key + return x.Type } return "" } -func (x *KarpenterRequirement) GetOperator() string { +func (x *VolcanoJobCondition) GetStatus() string { if x != nil { - return x.Operator + return x.Status } return "" } -func (x *KarpenterRequirement) GetValues() []string { +func (x *VolcanoJobCondition) GetReason() string { if x != nil { - return x.Values + return x.Reason + } + return "" +} + +func (x *VolcanoJobCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *VolcanoJobCondition) GetLastTransitionTime() int64 { + if x != nil { + return x.LastTransitionTime } - return nil + return 0 } -// WorkloadFilters provides optional filters for narrowing the GetWorkloads request. -// All fields are optional. When multiple fields are provided, they are ANDed together. -type WorkloadFilters struct { +// VolcanoTask represents a task in a VolcanoJob +type VolcanoTask struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Targeting criteria (AND logic between non-null fields) - NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels - KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds - NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes - // Lifecycle status filter (overrides legacy show_deleted when set) - Status WorkloadStatusFilter `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.WorkloadStatusFilter" json:"status,omitempty"` // ACTIVE, DELETED, or BOTH + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Task name + Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` // Number of replicas + Containers []*ContainerTemplate `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates } -func (x *WorkloadFilters) Reset() { - *x = WorkloadFilters{} +func (x *VolcanoTask) Reset() { + *x = VolcanoTask{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[114] + mi := &file_api_v1_common_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadFilters) String() string { +func (x *VolcanoTask) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadFilters) ProtoMessage() {} +func (*VolcanoTask) ProtoMessage() {} -func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[114] +func (x *VolcanoTask) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12050,101 +13898,73 @@ func (x *WorkloadFilters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadFilters.ProtoReflect.Descriptor instead. -func (*WorkloadFilters) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{114} -} - -func (x *WorkloadFilters) GetNamespaceSelector() *LabelSelector { - if x != nil { - return x.NamespaceSelector - } - return nil -} - -func (x *WorkloadFilters) GetWorkloadSelector() *LabelSelector { - if x != nil { - return x.WorkloadSelector - } - return nil -} - -func (x *WorkloadFilters) GetKindFilter() []K8SObjectKind { - if x != nil { - return x.KindFilter - } - return nil -} - -func (x *WorkloadFilters) GetNamePattern() *RegexPattern { - if x != nil { - return x.NamePattern - } - return nil +// Deprecated: Use VolcanoTask.ProtoReflect.Descriptor instead. +func (*VolcanoTask) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{129} } -func (x *WorkloadFilters) GetAnnotationSelector() *LabelSelector { +func (x *VolcanoTask) GetName() string { if x != nil { - return x.AnnotationSelector + return x.Name } - return nil + return "" } -func (x *WorkloadFilters) GetWorkloadNames() []string { +func (x *VolcanoTask) GetReplicas() int32 { if x != nil { - return x.WorkloadNames + return x.Replicas } - return nil + return 0 } -func (x *WorkloadFilters) GetNodeGroupNames() []string { +func (x *VolcanoTask) GetContainers() []*ContainerTemplate { if x != nil { - return x.NodeGroupNames + return x.Containers } return nil } -func (x *WorkloadFilters) GetStatus() WorkloadStatusFilter { - if x != nil { - return x.Status - } - return WorkloadStatusFilter_WORKLOAD_STATUS_FILTER_UNSPECIFIED -} - -// PodDisruptionBudgetDetails contains detailed PodDisruptionBudget information -type PodDisruptionBudgetDetails struct { +// SparkApplicationDetails contains detailed SparkApplication information for drill-down +type SparkApplicationDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MinAvailable int32 `protobuf:"varint,1,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum number of pods that should be available - MaxUnavailable int32 `protobuf:"varint,2,opt,name=max_unavailable,json=maxUnavailable,proto3" json:"max_unavailable,omitempty"` // Maximum number of pods that can be unavailable - CurrentHealthy int32 `protobuf:"varint,3,opt,name=current_healthy,json=currentHealthy,proto3" json:"current_healthy,omitempty"` // Current number of healthy pods - DesiredHealthy int32 `protobuf:"varint,4,opt,name=desired_healthy,json=desiredHealthy,proto3" json:"desired_healthy,omitempty"` // Desired number of healthy pods - DisruptionsAllowed int32 `protobuf:"varint,5,opt,name=disruptions_allowed,json=disruptionsAllowed,proto3" json:"disruptions_allowed,omitempty"` // Number of disruptions currently allowed - ExpectedPods int32 `protobuf:"varint,6,opt,name=expected_pods,json=expectedPods,proto3" json:"expected_pods,omitempty"` // Expected number of pods - Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Healthy", "Disrupted", "Unknown" - SelectorLabels map[string]string `protobuf:"bytes,8,rep,name=selector_labels,json=selectorLabels,proto3" json:"selector_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Label selector for target pods - Conditions []*PodDisruptionBudgetCondition `protobuf:"bytes,9,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + 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 (from spec.executor.instances) + ExecutorsReady int32 `protobuf:"varint,16,opt,name=executors_ready,json=executorsReady,proto3" json:"executors_ready,omitempty"` // Number of RUNNING executors (from status.executorState); only meaningful when app is running + 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 *PodDisruptionBudgetDetails) Reset() { - *x = PodDisruptionBudgetDetails{} +func (x *SparkApplicationDetails) Reset() { + *x = SparkApplicationDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[115] + mi := &file_api_v1_common_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PodDisruptionBudgetDetails) String() string { +func (x *SparkApplicationDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PodDisruptionBudgetDetails) ProtoMessage() {} +func (*SparkApplicationDetails) ProtoMessage() {} -func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[115] +func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12155,185 +13975,157 @@ func (x *PodDisruptionBudgetDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PodDisruptionBudgetDetails.ProtoReflect.Descriptor instead. -func (*PodDisruptionBudgetDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{115} -} - -func (x *PodDisruptionBudgetDetails) GetMinAvailable() int32 { - if x != nil { - return x.MinAvailable - } - return 0 +// Deprecated: Use SparkApplicationDetails.ProtoReflect.Descriptor instead. +func (*SparkApplicationDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{130} } -func (x *PodDisruptionBudgetDetails) GetMaxUnavailable() int32 { +func (x *SparkApplicationDetails) GetContainers() []*ContainerTemplate { if x != nil { - return x.MaxUnavailable + return x.Containers } - return 0 + return nil } -func (x *PodDisruptionBudgetDetails) GetCurrentHealthy() int32 { +func (x *SparkApplicationDetails) GetSparkVersion() string { if x != nil { - return x.CurrentHealthy + return x.SparkVersion } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetDesiredHealthy() int32 { +func (x *SparkApplicationDetails) GetApplicationType() string { if x != nil { - return x.DesiredHealthy + return x.ApplicationType } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetDisruptionsAllowed() int32 { +func (x *SparkApplicationDetails) GetDeployMode() string { if x != nil { - return x.DisruptionsAllowed + return x.DeployMode } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetExpectedPods() int32 { +func (x *SparkApplicationDetails) GetMainClass() string { if x != nil { - return x.ExpectedPods + return x.MainClass } - return 0 + return "" } -func (x *PodDisruptionBudgetDetails) GetStatus() string { +func (x *SparkApplicationDetails) GetMainApplicationFile() string { if x != nil { - return x.Status + return x.MainApplicationFile } return "" } -func (x *PodDisruptionBudgetDetails) GetSelectorLabels() map[string]string { +func (x *SparkApplicationDetails) GetArguments() []string { if x != nil { - return x.SelectorLabels + return x.Arguments } return nil } -func (x *PodDisruptionBudgetDetails) GetConditions() []*PodDisruptionBudgetCondition { +func (x *SparkApplicationDetails) GetSparkDriverInfo() *SparkDriverInfo { if x != nil { - return x.Conditions + return x.SparkDriverInfo } return nil } -// PodDisruptionBudgetCondition represents a condition of a PodDisruptionBudget -type PodDisruptionBudgetCondition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Condition type (e.g., "DisruptionAllowed") - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time -} - -func (x *PodDisruptionBudgetCondition) Reset() { - *x = PodDisruptionBudgetCondition{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[116] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *SparkApplicationDetails) GetExecutorInstances() int32 { + if x != nil { + return x.ExecutorInstances } + return 0 } -func (x *PodDisruptionBudgetCondition) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PodDisruptionBudgetCondition) ProtoMessage() {} - -func (x *PodDisruptionBudgetCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[116] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SparkApplicationDetails) GetExecutorsReady() int32 { + if x != nil { + return x.ExecutorsReady } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use PodDisruptionBudgetCondition.ProtoReflect.Descriptor instead. -func (*PodDisruptionBudgetCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{116} +func (x *SparkApplicationDetails) GetApplicationState() string { + if x != nil { + return x.ApplicationState + } + return "" } -func (x *PodDisruptionBudgetCondition) GetType() string { +func (x *SparkApplicationDetails) GetSparkApplicationId() string { if x != nil { - return x.Type + return x.SparkApplicationId } return "" } -func (x *PodDisruptionBudgetCondition) GetStatus() string { +func (x *SparkApplicationDetails) GetSubmissionId() string { if x != nil { - return x.Status + return x.SubmissionId } return "" } -func (x *PodDisruptionBudgetCondition) GetReason() string { +func (x *SparkApplicationDetails) GetSuspended() bool { if x != nil { - return x.Reason + return x.Suspended } - return "" + return false } -func (x *PodDisruptionBudgetCondition) GetMessage() string { +func (x *SparkApplicationDetails) GetRestartPolicy() *SparkRestartPolicyInfo { if x != nil { - return x.Message + return x.RestartPolicy } - return "" + return nil } -func (x *PodDisruptionBudgetCondition) GetLastTransitionTime() int64 { +func (x *SparkApplicationDetails) GetDynamicAllocation() *SparkDynamicAllocationInfo { if x != nil { - return x.LastTransitionTime + return x.DynamicAllocation } - return 0 + return nil } -// ResourceQuotaDetails contains detailed ResourceQuota information -type ResourceQuotaDetails struct { +// SparkDriverInfo represents information about the Spark driver +type SparkDriverInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - HardLimits map[string]string `protobuf:"bytes,1,rep,name=hard_limits,json=hardLimits,proto3" json:"hard_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Hard resource limits (e.g., "requests.cpu": "4", "requests.memory": "8Gi") - Used map[string]string `protobuf:"bytes,2,rep,name=used,proto3" json:"used,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Currently used resources - Scopes []string `protobuf:"bytes,3,rep,name=scopes,proto3" json:"scopes,omitempty"` // Quota scopes: ["BestEffort", "NotBestEffort", "NotTerminating", "Terminating"] - ScopeSelector map[string]string `protobuf:"bytes,4,rep,name=scope_selector,json=scopeSelector,proto3" json:"scope_selector,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Scope selector match labels - Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` // Overall status: "Valid", "Invalid", "Unknown" - Conditions []*ResourceQuotaCondition `protobuf:"bytes,6,rep,name=conditions,proto3" json:"conditions,omitempty"` // Current conditions + 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 *ResourceQuotaDetails) Reset() { - *x = ResourceQuotaDetails{} +func (x *SparkDriverInfo) Reset() { + *x = SparkDriverInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[117] + mi := &file_api_v1_common_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceQuotaDetails) String() string { +func (x *SparkDriverInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceQuotaDetails) ProtoMessage() {} +func (*SparkDriverInfo) ProtoMessage() {} -func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[117] +func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12344,83 +14136,104 @@ func (x *ResourceQuotaDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceQuotaDetails.ProtoReflect.Descriptor instead. -func (*ResourceQuotaDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{117} +// Deprecated: Use SparkDriverInfo.ProtoReflect.Descriptor instead. +func (*SparkDriverInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{131} } -func (x *ResourceQuotaDetails) GetHardLimits() map[string]string { +func (x *SparkDriverInfo) GetPodName() string { if x != nil { - return x.HardLimits + return x.PodName } - return nil + return "" } -func (x *ResourceQuotaDetails) GetUsed() map[string]string { +func (x *SparkDriverInfo) GetWebUiServiceName() string { if x != nil { - return x.Used + return x.WebUiServiceName } - return nil + return "" } -func (x *ResourceQuotaDetails) GetScopes() []string { +func (x *SparkDriverInfo) GetWebUiAddress() string { if x != nil { - return x.Scopes + return x.WebUiAddress } - return nil + return "" } -func (x *ResourceQuotaDetails) GetScopeSelector() map[string]string { +func (x *SparkDriverInfo) GetWebUiPort() int32 { if x != nil { - return x.ScopeSelector + return x.WebUiPort } - return nil + return 0 } -func (x *ResourceQuotaDetails) GetStatus() string { +func (x *SparkDriverInfo) GetWebUiIngressName() string { if x != nil { - return x.Status + return x.WebUiIngressName } return "" } -func (x *ResourceQuotaDetails) GetConditions() []*ResourceQuotaCondition { +func (x *SparkDriverInfo) GetWebUiIngressAddress() string { if x != nil { - return x.Conditions + return x.WebUiIngressAddress } - return nil + return "" } -// ResourceQuotaCondition represents a condition of a ResourceQuota -type ResourceQuotaCondition struct { +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"` // Condition type (typically not used in core/v1) - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Condition status: "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last transition time + 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 *ResourceQuotaCondition) Reset() { - *x = ResourceQuotaCondition{} +func (x *SparkRestartPolicyInfo) Reset() { + *x = SparkRestartPolicyInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[118] + mi := &file_api_v1_common_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceQuotaCondition) String() string { +func (x *SparkRestartPolicyInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceQuotaCondition) ProtoMessage() {} +func (*SparkRestartPolicyInfo) ProtoMessage() {} -func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[118] +func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12431,78 +14244,77 @@ func (x *ResourceQuotaCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceQuotaCondition.ProtoReflect.Descriptor instead. -func (*ResourceQuotaCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{118} +// Deprecated: Use SparkRestartPolicyInfo.ProtoReflect.Descriptor instead. +func (*SparkRestartPolicyInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{132} } -func (x *ResourceQuotaCondition) GetType() string { +func (x *SparkRestartPolicyInfo) GetType() string { if x != nil { return x.Type } return "" } -func (x *ResourceQuotaCondition) GetStatus() string { +func (x *SparkRestartPolicyInfo) GetOnFailureRetries() int32 { if x != nil { - return x.Status + return x.OnFailureRetries } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetReason() string { +func (x *SparkRestartPolicyInfo) GetOnFailureRetryInterval() int64 { if x != nil { - return x.Reason + return x.OnFailureRetryInterval } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetMessage() string { +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetries() int32 { if x != nil { - return x.Message + return x.OnSubmissionFailureRetries } - return "" + return 0 } -func (x *ResourceQuotaCondition) GetLastTransitionTime() int64 { +func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetryInterval() int64 { if x != nil { - return x.LastTransitionTime + return x.OnSubmissionFailureRetryInterval } return 0 } -// VolcanoJobDetails contains detailed VolcanoJob information for drill-down -type VolcanoJobDetails struct { +// SparkDynamicAllocationInfo represents dynamic allocation configuration +type SparkDynamicAllocationInfo 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 pod spec - Conditions []*VolcanoJobCondition `protobuf:"bytes,2,rep,name=conditions,proto3" json:"conditions,omitempty"` // VolcanoJob conditions for debugging - Queue string `protobuf:"bytes,3,opt,name=queue,proto3" json:"queue,omitempty"` // Queue name for scheduling - MinAvailable int32 `protobuf:"varint,4,opt,name=min_available,json=minAvailable,proto3" json:"min_available,omitempty"` // Minimum available pods - SchedulePolicy string `protobuf:"bytes,5,opt,name=schedule_policy,json=schedulePolicy,proto3" json:"schedule_policy,omitempty"` // Schedule policy name - PriorityClass string `protobuf:"bytes,6,opt,name=priority_class,json=priorityClass,proto3" json:"priority_class,omitempty"` // Priority class name - Tasks []*VolcanoTask `protobuf:"bytes,7,rep,name=tasks,proto3" json:"tasks,omitempty"` // Tasks in the job + 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 *VolcanoJobDetails) Reset() { - *x = VolcanoJobDetails{} +func (x *SparkDynamicAllocationInfo) Reset() { + *x = SparkDynamicAllocationInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[119] + mi := &file_api_v1_common_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolcanoJobDetails) String() string { +func (x *SparkDynamicAllocationInfo) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolcanoJobDetails) ProtoMessage() {} +func (*SparkDynamicAllocationInfo) ProtoMessage() {} -func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[119] +func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12513,90 +14325,93 @@ func (x *VolcanoJobDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolcanoJobDetails.ProtoReflect.Descriptor instead. -func (*VolcanoJobDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{119} -} - -func (x *VolcanoJobDetails) GetContainers() []*ContainerTemplate { - if x != nil { - return x.Containers - } - return nil +// Deprecated: Use SparkDynamicAllocationInfo.ProtoReflect.Descriptor instead. +func (*SparkDynamicAllocationInfo) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{133} } -func (x *VolcanoJobDetails) GetConditions() []*VolcanoJobCondition { +func (x *SparkDynamicAllocationInfo) GetEnabled() bool { if x != nil { - return x.Conditions + return x.Enabled } - return nil + return false } -func (x *VolcanoJobDetails) GetQueue() string { +func (x *SparkDynamicAllocationInfo) GetInitialExecutors() int32 { if x != nil { - return x.Queue + return x.InitialExecutors } - return "" + return 0 } -func (x *VolcanoJobDetails) GetMinAvailable() int32 { +func (x *SparkDynamicAllocationInfo) GetMinExecutors() int32 { if x != nil { - return x.MinAvailable + return x.MinExecutors } return 0 } -func (x *VolcanoJobDetails) GetSchedulePolicy() string { +func (x *SparkDynamicAllocationInfo) GetMaxExecutors() int32 { if x != nil { - return x.SchedulePolicy + return x.MaxExecutors } - return "" + return 0 } -func (x *VolcanoJobDetails) GetPriorityClass() string { +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingEnabled() bool { if x != nil { - return x.PriorityClass + return x.ShuffleTrackingEnabled } - return "" + return false } -func (x *VolcanoJobDetails) GetTasks() []*VolcanoTask { +func (x *SparkDynamicAllocationInfo) GetShuffleTrackingTimeout() int64 { if x != nil { - return x.Tasks + return x.ShuffleTrackingTimeout } - return nil + return 0 } -// VolcanoJobCondition represents a volcano job condition -type VolcanoJobCondition struct { +// ScheduledSparkApplicationDetails contains detailed ScheduledSparkApplication information for drill-down +type ScheduledSparkApplicationDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "Pending", "Running", "Completed", "Failed", etc. - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "True", "False", "Unknown" - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for the condition - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Human readable message - LastTransitionTime int64 `protobuf:"varint,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` // Last time condition transitioned + Schedule string `protobuf:"bytes,1,opt,name=schedule,proto3" json:"schedule,omitempty"` // Cron schedule expression (e.g., "@every 15m", "0 * * * *") + TimeZone string `protobuf:"bytes,2,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` // Time zone for schedule (e.g., "UTC", "America/New_York") + Suspended bool `protobuf:"varint,3,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether the schedule is suspended + ConcurrencyPolicy string `protobuf:"bytes,4,opt,name=concurrency_policy,json=concurrencyPolicy,proto3" json:"concurrency_policy,omitempty"` // Allow, Forbid, Replace + SuccessfulRunHistoryLimit int32 `protobuf:"varint,5,opt,name=successful_run_history_limit,json=successfulRunHistoryLimit,proto3" json:"successful_run_history_limit,omitempty"` // Number of successful runs to keep + FailedRunHistoryLimit int32 `protobuf:"varint,6,opt,name=failed_run_history_limit,json=failedRunHistoryLimit,proto3" json:"failed_run_history_limit,omitempty"` // Number of failed runs to keep + ScheduleState string `protobuf:"bytes,7,opt,name=schedule_state,json=scheduleState,proto3" json:"schedule_state,omitempty"` // Current state: Scheduled, Validating, FailedValidation + LastRunName string `protobuf:"bytes,8,opt,name=last_run_name,json=lastRunName,proto3" json:"last_run_name,omitempty"` // Name of the last SparkApplication created + LastRun *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_run,json=lastRun,proto3" json:"last_run,omitempty"` // Time of last run + NextRun *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=next_run,json=nextRun,proto3" json:"next_run,omitempty"` // Time of next scheduled run + PastSuccessfulRunNames []string `protobuf:"bytes,11,rep,name=past_successful_run_names,json=pastSuccessfulRunNames,proto3" json:"past_successful_run_names,omitempty"` // Names of past successful runs + PastFailedRunNames []string `protobuf:"bytes,12,rep,name=past_failed_run_names,json=pastFailedRunNames,proto3" json:"past_failed_run_names,omitempty"` // Names of past failed runs + Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for current schedule state + // Template fields (inherited from SparkApplication) + TemplateDetails *SparkApplicationDetails `protobuf:"bytes,14,opt,name=template_details,json=templateDetails,proto3" json:"template_details,omitempty"` // Details from the SparkApplication template } -func (x *VolcanoJobCondition) Reset() { - *x = VolcanoJobCondition{} +func (x *ScheduledSparkApplicationDetails) Reset() { + *x = ScheduledSparkApplicationDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[120] + mi := &file_api_v1_common_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *VolcanoJobCondition) String() string { +func (x *ScheduledSparkApplicationDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*VolcanoJobCondition) ProtoMessage() {} +func (*ScheduledSparkApplicationDetails) ProtoMessage() {} -func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[120] +func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12607,151 +14422,140 @@ func (x *VolcanoJobCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use VolcanoJobCondition.ProtoReflect.Descriptor instead. -func (*VolcanoJobCondition) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{120} +// Deprecated: Use ScheduledSparkApplicationDetails.ProtoReflect.Descriptor instead. +func (*ScheduledSparkApplicationDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{134} } -func (x *VolcanoJobCondition) GetType() string { +func (x *ScheduledSparkApplicationDetails) GetSchedule() string { if x != nil { - return x.Type + return x.Schedule } return "" } -func (x *VolcanoJobCondition) GetStatus() string { +func (x *ScheduledSparkApplicationDetails) GetTimeZone() string { if x != nil { - return x.Status + return x.TimeZone } return "" } -func (x *VolcanoJobCondition) GetReason() string { +func (x *ScheduledSparkApplicationDetails) GetSuspended() bool { if x != nil { - return x.Reason + return x.Suspended } - return "" + return false } -func (x *VolcanoJobCondition) GetMessage() string { +func (x *ScheduledSparkApplicationDetails) GetConcurrencyPolicy() string { if x != nil { - return x.Message + return x.ConcurrencyPolicy } return "" } -func (x *VolcanoJobCondition) GetLastTransitionTime() int64 { +func (x *ScheduledSparkApplicationDetails) GetSuccessfulRunHistoryLimit() int32 { if x != nil { - return x.LastTransitionTime + return x.SuccessfulRunHistoryLimit } return 0 } -// VolcanoTask represents a task in a VolcanoJob -type VolcanoTask struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Task name - Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` // Number of replicas - Containers []*ContainerTemplate `protobuf:"bytes,3,rep,name=containers,proto3" json:"containers,omitempty"` // Container templates +func (x *ScheduledSparkApplicationDetails) GetFailedRunHistoryLimit() int32 { + if x != nil { + return x.FailedRunHistoryLimit + } + return 0 } -func (x *VolcanoTask) Reset() { - *x = VolcanoTask{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[121] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ScheduledSparkApplicationDetails) GetScheduleState() string { + if x != nil { + return x.ScheduleState } + return "" } -func (x *VolcanoTask) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ScheduledSparkApplicationDetails) GetLastRunName() string { + if x != nil { + return x.LastRunName + } + return "" } -func (*VolcanoTask) ProtoMessage() {} +func (x *ScheduledSparkApplicationDetails) GetLastRun() *timestamppb.Timestamp { + if x != nil { + return x.LastRun + } + return nil +} -func (x *VolcanoTask) 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 +func (x *ScheduledSparkApplicationDetails) GetNextRun() *timestamppb.Timestamp { + if x != nil { + return x.NextRun } - return mi.MessageOf(x) + return nil } -// Deprecated: Use VolcanoTask.ProtoReflect.Descriptor instead. -func (*VolcanoTask) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{121} +func (x *ScheduledSparkApplicationDetails) GetPastSuccessfulRunNames() []string { + if x != nil { + return x.PastSuccessfulRunNames + } + return nil } -func (x *VolcanoTask) GetName() string { +func (x *ScheduledSparkApplicationDetails) GetPastFailedRunNames() []string { if x != nil { - return x.Name + return x.PastFailedRunNames } - return "" + return nil } -func (x *VolcanoTask) GetReplicas() int32 { +func (x *ScheduledSparkApplicationDetails) GetReason() string { if x != nil { - return x.Replicas + return x.Reason } - return 0 + return "" } -func (x *VolcanoTask) GetContainers() []*ContainerTemplate { +func (x *ScheduledSparkApplicationDetails) GetTemplateDetails() *SparkApplicationDetails { if x != nil { - return x.Containers + return x.TemplateDetails } return nil } -// SparkApplicationDetails contains detailed SparkApplication information for drill-down -type SparkApplicationDetails struct { +// KyvernoPolicyDetails contains detailed Kyverno Policy/ClusterPolicy information for drill-down +type KyvernoPolicyDetails 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 (from spec.executor.instances) - ExecutorsReady int32 `protobuf:"varint,16,opt,name=executors_ready,json=executorsReady,proto3" json:"executors_ready,omitempty"` // Number of RUNNING executors (from status.executorState); only meaningful when app is running - 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 + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Policy (namespaced) or ClusterPolicy + Background bool `protobuf:"varint,2,opt,name=background,proto3" json:"background,omitempty"` // Whether background scanning is enabled + ValidationFailureAction string `protobuf:"bytes,3,opt,name=validation_failure_action,json=validationFailureAction,proto3" json:"validation_failure_action,omitempty"` // Audit or Enforce (rule-level failureAction wins on kyverno 1.13+) + RuleCount int32 `protobuf:"varint,4,opt,name=rule_count,json=ruleCount,proto3" json:"rule_count,omitempty"` // Number of rules in the policy + RuleNames []string `protobuf:"bytes,5,rep,name=rule_names,json=ruleNames,proto3" json:"rule_names,omitempty"` // Rule names + SpecJson string `protobuf:"bytes,6,opt,name=spec_json,json=specJson,proto3" json:"spec_json,omitempty"` // Full policy spec as JSON for raw inspection } -func (x *SparkApplicationDetails) Reset() { - *x = SparkApplicationDetails{} +func (x *KyvernoPolicyDetails) Reset() { + *x = KyvernoPolicyDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[122] + mi := &file_api_v1_common_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkApplicationDetails) String() string { +func (x *KyvernoPolicyDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkApplicationDetails) ProtoMessage() {} +func (*KyvernoPolicyDetails) ProtoMessage() {} -func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[122] +func (x *KyvernoPolicyDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12762,157 +14566,194 @@ func (x *SparkApplicationDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkApplicationDetails.ProtoReflect.Descriptor instead. -func (*SparkApplicationDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{122} +// Deprecated: Use KyvernoPolicyDetails.ProtoReflect.Descriptor instead. +func (*KyvernoPolicyDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{135} } -func (x *SparkApplicationDetails) GetContainers() []*ContainerTemplate { +func (x *KyvernoPolicyDetails) GetKind() string { if x != nil { - return x.Containers + return x.Kind } - return nil + return "" } -func (x *SparkApplicationDetails) GetSparkVersion() string { +func (x *KyvernoPolicyDetails) GetBackground() bool { if x != nil { - return x.SparkVersion + return x.Background } - return "" + return false } -func (x *SparkApplicationDetails) GetApplicationType() string { +func (x *KyvernoPolicyDetails) GetValidationFailureAction() string { if x != nil { - return x.ApplicationType + return x.ValidationFailureAction } return "" } -func (x *SparkApplicationDetails) GetDeployMode() string { +func (x *KyvernoPolicyDetails) GetRuleCount() int32 { if x != nil { - return x.DeployMode + return x.RuleCount } - return "" + return 0 } -func (x *SparkApplicationDetails) GetMainClass() string { +func (x *KyvernoPolicyDetails) GetRuleNames() []string { if x != nil { - return x.MainClass + return x.RuleNames } - return "" + return nil } -func (x *SparkApplicationDetails) GetMainApplicationFile() string { +func (x *KyvernoPolicyDetails) GetSpecJson() string { if x != nil { - return x.MainApplicationFile + return x.SpecJson } return "" } -func (x *SparkApplicationDetails) GetArguments() []string { - if x != nil { - return x.Arguments +// PolicyReportResult is one per-resource result inside a Kyverno policy report +type PolicyReportResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy string `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` // Policy name + Rule string `protobuf:"bytes,2,opt,name=rule,proto3" json:"rule,omitempty"` // Rule name + Result string `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"` // pass, fail, warn, error, skip + Severity string `protobuf:"bytes,4,opt,name=severity,proto3" json:"severity,omitempty"` // critical, high, medium, low, info + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // Human readable message + ResourceKind string `protobuf:"bytes,6,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Kind of the evaluated resource + ResourceNamespace string `protobuf:"bytes,7,opt,name=resource_namespace,json=resourceNamespace,proto3" json:"resource_namespace,omitempty"` // Namespace of the evaluated resource + ResourceName string `protobuf:"bytes,8,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Name of the evaluated resource +} + +func (x *PolicyReportResult) Reset() { + *x = PolicyReportResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_common_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *SparkApplicationDetails) GetSparkDriverInfo() *SparkDriverInfo { - if x != nil { - return x.SparkDriverInfo +func (x *PolicyReportResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PolicyReportResult) ProtoMessage() {} + +func (x *PolicyReportResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[136] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *SparkApplicationDetails) GetExecutorInstances() int32 { +// Deprecated: Use PolicyReportResult.ProtoReflect.Descriptor instead. +func (*PolicyReportResult) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{136} +} + +func (x *PolicyReportResult) GetPolicy() string { if x != nil { - return x.ExecutorInstances + return x.Policy } - return 0 + return "" } -func (x *SparkApplicationDetails) GetExecutorsReady() int32 { +func (x *PolicyReportResult) GetRule() string { if x != nil { - return x.ExecutorsReady + return x.Rule } - return 0 + return "" } -func (x *SparkApplicationDetails) GetApplicationState() string { +func (x *PolicyReportResult) GetResult() string { if x != nil { - return x.ApplicationState + return x.Result } return "" } -func (x *SparkApplicationDetails) GetSparkApplicationId() string { +func (x *PolicyReportResult) GetSeverity() string { if x != nil { - return x.SparkApplicationId + return x.Severity } return "" } -func (x *SparkApplicationDetails) GetSubmissionId() string { +func (x *PolicyReportResult) GetMessage() string { if x != nil { - return x.SubmissionId + return x.Message } return "" } -func (x *SparkApplicationDetails) GetSuspended() bool { +func (x *PolicyReportResult) GetResourceKind() string { if x != nil { - return x.Suspended + return x.ResourceKind } - return false + return "" } -func (x *SparkApplicationDetails) GetRestartPolicy() *SparkRestartPolicyInfo { +func (x *PolicyReportResult) GetResourceNamespace() string { if x != nil { - return x.RestartPolicy + return x.ResourceNamespace } - return nil + return "" } -func (x *SparkApplicationDetails) GetDynamicAllocation() *SparkDynamicAllocationInfo { +func (x *PolicyReportResult) GetResourceName() string { if x != nil { - return x.DynamicAllocation + return x.ResourceName } - return nil + return "" } -// SparkDriverInfo represents information about the Spark driver -type SparkDriverInfo struct { +// KyvernoPolicyReportDetails contains detailed policy report information for drill-down. +// The results list is capped at collection time (50); the counts always cover the full report. +type KyvernoPolicyReportDetails 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{} + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // PolicyReport (namespaced) or ClusterPolicyReport + ScopeKind string `protobuf:"bytes,2,opt,name=scope_kind,json=scopeKind,proto3" json:"scope_kind,omitempty"` // Kind of the resource the report applies to + ScopeName string `protobuf:"bytes,3,opt,name=scope_name,json=scopeName,proto3" json:"scope_name,omitempty"` // Name of the resource the report applies to + ScopeNamespace string `protobuf:"bytes,4,opt,name=scope_namespace,json=scopeNamespace,proto3" json:"scope_namespace,omitempty"` // Namespace of the resource the report applies to + Pass int32 `protobuf:"varint,5,opt,name=pass,proto3" json:"pass,omitempty"` // Passing result count + Fail int32 `protobuf:"varint,6,opt,name=fail,proto3" json:"fail,omitempty"` // Failing result count + Warn int32 `protobuf:"varint,7,opt,name=warn,proto3" json:"warn,omitempty"` // Warning result count + Error int32 `protobuf:"varint,8,opt,name=error,proto3" json:"error,omitempty"` // Error result count + Skip int32 `protobuf:"varint,9,opt,name=skip,proto3" json:"skip,omitempty"` // Skipped result count + Results []*PolicyReportResult `protobuf:"bytes,10,rep,name=results,proto3" json:"results,omitempty"` // Capped per-resource results + TotalResults int32 `protobuf:"varint,11,opt,name=total_results,json=totalResults,proto3" json:"total_results,omitempty"` // Full result count before capping +} + +func (x *KyvernoPolicyReportDetails) Reset() { + *x = KyvernoPolicyReportDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[123] + mi := &file_api_v1_common_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkDriverInfo) String() string { +func (x *KyvernoPolicyReportDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkDriverInfo) ProtoMessage() {} +func (*KyvernoPolicyReportDetails) ProtoMessage() {} -func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[123] +func (x *KyvernoPolicyReportDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12923,104 +14764,117 @@ func (x *SparkDriverInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkDriverInfo.ProtoReflect.Descriptor instead. -func (*SparkDriverInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{123} +// Deprecated: Use KyvernoPolicyReportDetails.ProtoReflect.Descriptor instead. +func (*KyvernoPolicyReportDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{137} +} + +func (x *KyvernoPolicyReportDetails) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *KyvernoPolicyReportDetails) GetScopeKind() string { + if x != nil { + return x.ScopeKind + } + return "" } -func (x *SparkDriverInfo) GetPodName() string { +func (x *KyvernoPolicyReportDetails) GetScopeName() string { if x != nil { - return x.PodName + return x.ScopeName } return "" } -func (x *SparkDriverInfo) GetWebUiServiceName() string { +func (x *KyvernoPolicyReportDetails) GetScopeNamespace() string { if x != nil { - return x.WebUiServiceName + return x.ScopeNamespace } return "" } -func (x *SparkDriverInfo) GetWebUiAddress() string { +func (x *KyvernoPolicyReportDetails) GetPass() int32 { if x != nil { - return x.WebUiAddress + return x.Pass } - return "" + return 0 } -func (x *SparkDriverInfo) GetWebUiPort() int32 { +func (x *KyvernoPolicyReportDetails) GetFail() int32 { if x != nil { - return x.WebUiPort + return x.Fail } return 0 } -func (x *SparkDriverInfo) GetWebUiIngressName() string { +func (x *KyvernoPolicyReportDetails) GetWarn() int32 { if x != nil { - return x.WebUiIngressName + return x.Warn } - return "" + return 0 } -func (x *SparkDriverInfo) GetWebUiIngressAddress() string { +func (x *KyvernoPolicyReportDetails) GetError() int32 { if x != nil { - return x.WebUiIngressAddress + return x.Error } - return "" + return 0 } -func (x *SparkDriverInfo) GetCores() string { +func (x *KyvernoPolicyReportDetails) GetSkip() int32 { if x != nil { - return x.Cores + return x.Skip } - return "" + return 0 } -func (x *SparkDriverInfo) GetMemory() string { +func (x *KyvernoPolicyReportDetails) GetResults() []*PolicyReportResult { if x != nil { - return x.Memory + return x.Results } - return "" + return nil } -func (x *SparkDriverInfo) GetServiceAccount() string { +func (x *KyvernoPolicyReportDetails) GetTotalResults() int32 { if x != nil { - return x.ServiceAccount + return x.TotalResults } - return "" + return 0 } -// SparkRestartPolicyInfo represents restart policy information -type SparkRestartPolicyInfo struct { +// GatekeeperConstraintTemplateDetails contains detailed ConstraintTemplate information for drill-down +type GatekeeperConstraintTemplateDetails 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 + CrdKind string `protobuf:"bytes,1,opt,name=crd_kind,json=crdKind,proto3" json:"crd_kind,omitempty"` // Constraint kind this template generates (e.g. K8sRequiredLabels) + Targets []string `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` // Enforcement targets (e.g. admission.k8s.gatekeeper.sh) + Created bool `protobuf:"varint,3,opt,name=created,proto3" json:"created,omitempty"` // Whether the constraint CRD has been created + SpecJson string `protobuf:"bytes,4,opt,name=spec_json,json=specJson,proto3" json:"spec_json,omitempty"` // Full template spec as JSON for raw inspection } -func (x *SparkRestartPolicyInfo) Reset() { - *x = SparkRestartPolicyInfo{} +func (x *GatekeeperConstraintTemplateDetails) Reset() { + *x = GatekeeperConstraintTemplateDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[124] + mi := &file_api_v1_common_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkRestartPolicyInfo) String() string { +func (x *GatekeeperConstraintTemplateDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkRestartPolicyInfo) ProtoMessage() {} +func (*GatekeeperConstraintTemplateDetails) ProtoMessage() {} -func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[124] +func (x *GatekeeperConstraintTemplateDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13031,77 +14885,69 @@ func (x *SparkRestartPolicyInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkRestartPolicyInfo.ProtoReflect.Descriptor instead. -func (*SparkRestartPolicyInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{124} +// Deprecated: Use GatekeeperConstraintTemplateDetails.ProtoReflect.Descriptor instead. +func (*GatekeeperConstraintTemplateDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{138} } -func (x *SparkRestartPolicyInfo) GetType() string { +func (x *GatekeeperConstraintTemplateDetails) GetCrdKind() string { if x != nil { - return x.Type + return x.CrdKind } return "" } -func (x *SparkRestartPolicyInfo) GetOnFailureRetries() int32 { - if x != nil { - return x.OnFailureRetries - } - return 0 -} - -func (x *SparkRestartPolicyInfo) GetOnFailureRetryInterval() int64 { +func (x *GatekeeperConstraintTemplateDetails) GetTargets() []string { if x != nil { - return x.OnFailureRetryInterval + return x.Targets } - return 0 + return nil } -func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetries() int32 { +func (x *GatekeeperConstraintTemplateDetails) GetCreated() bool { if x != nil { - return x.OnSubmissionFailureRetries + return x.Created } - return 0 + return false } -func (x *SparkRestartPolicyInfo) GetOnSubmissionFailureRetryInterval() int64 { +func (x *GatekeeperConstraintTemplateDetails) GetSpecJson() string { if x != nil { - return x.OnSubmissionFailureRetryInterval + return x.SpecJson } - return 0 + return "" } -// SparkDynamicAllocationInfo represents dynamic allocation configuration -type SparkDynamicAllocationInfo struct { +// ConstraintViolation is one audit violation on a Gatekeeper constraint status +type ConstraintViolation 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 + ResourceKind string `protobuf:"bytes,1,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` // Kind of the violating resource + ResourceNamespace string `protobuf:"bytes,2,opt,name=resource_namespace,json=resourceNamespace,proto3" json:"resource_namespace,omitempty"` // Namespace of the violating resource + ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` // Name of the violating resource + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` // Violation message + EnforcementAction string `protobuf:"bytes,5,opt,name=enforcement_action,json=enforcementAction,proto3" json:"enforcement_action,omitempty"` // Action recorded on the violation } -func (x *SparkDynamicAllocationInfo) Reset() { - *x = SparkDynamicAllocationInfo{} +func (x *ConstraintViolation) Reset() { + *x = ConstraintViolation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[125] + mi := &file_api_v1_common_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SparkDynamicAllocationInfo) String() string { +func (x *ConstraintViolation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SparkDynamicAllocationInfo) ProtoMessage() {} +func (*ConstraintViolation) ProtoMessage() {} -func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[125] +func (x *ConstraintViolation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13112,93 +14958,79 @@ func (x *SparkDynamicAllocationInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SparkDynamicAllocationInfo.ProtoReflect.Descriptor instead. -func (*SparkDynamicAllocationInfo) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{125} -} - -func (x *SparkDynamicAllocationInfo) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false +// Deprecated: Use ConstraintViolation.ProtoReflect.Descriptor instead. +func (*ConstraintViolation) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{139} } -func (x *SparkDynamicAllocationInfo) GetInitialExecutors() int32 { +func (x *ConstraintViolation) GetResourceKind() string { if x != nil { - return x.InitialExecutors + return x.ResourceKind } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetMinExecutors() int32 { +func (x *ConstraintViolation) GetResourceNamespace() string { if x != nil { - return x.MinExecutors + return x.ResourceNamespace } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetMaxExecutors() int32 { +func (x *ConstraintViolation) GetResourceName() string { if x != nil { - return x.MaxExecutors + return x.ResourceName } - return 0 + return "" } -func (x *SparkDynamicAllocationInfo) GetShuffleTrackingEnabled() bool { +func (x *ConstraintViolation) GetMessage() string { if x != nil { - return x.ShuffleTrackingEnabled + return x.Message } - return false + return "" } -func (x *SparkDynamicAllocationInfo) GetShuffleTrackingTimeout() int64 { +func (x *ConstraintViolation) GetEnforcementAction() string { if x != nil { - return x.ShuffleTrackingTimeout + return x.EnforcementAction } - return 0 + return "" } -// ScheduledSparkApplicationDetails contains detailed ScheduledSparkApplication information for drill-down -type ScheduledSparkApplicationDetails struct { +// GatekeeperConstraintDetails contains detailed constraint information for drill-down. +// The violations list is capped by gatekeeper (default 20); total_violations covers the full audit. +type GatekeeperConstraintDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Schedule string `protobuf:"bytes,1,opt,name=schedule,proto3" json:"schedule,omitempty"` // Cron schedule expression (e.g., "@every 15m", "0 * * * *") - TimeZone string `protobuf:"bytes,2,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"` // Time zone for schedule (e.g., "UTC", "America/New_York") - Suspended bool `protobuf:"varint,3,opt,name=suspended,proto3" json:"suspended,omitempty"` // Whether the schedule is suspended - ConcurrencyPolicy string `protobuf:"bytes,4,opt,name=concurrency_policy,json=concurrencyPolicy,proto3" json:"concurrency_policy,omitempty"` // Allow, Forbid, Replace - SuccessfulRunHistoryLimit int32 `protobuf:"varint,5,opt,name=successful_run_history_limit,json=successfulRunHistoryLimit,proto3" json:"successful_run_history_limit,omitempty"` // Number of successful runs to keep - FailedRunHistoryLimit int32 `protobuf:"varint,6,opt,name=failed_run_history_limit,json=failedRunHistoryLimit,proto3" json:"failed_run_history_limit,omitempty"` // Number of failed runs to keep - ScheduleState string `protobuf:"bytes,7,opt,name=schedule_state,json=scheduleState,proto3" json:"schedule_state,omitempty"` // Current state: Scheduled, Validating, FailedValidation - LastRunName string `protobuf:"bytes,8,opt,name=last_run_name,json=lastRunName,proto3" json:"last_run_name,omitempty"` // Name of the last SparkApplication created - LastRun *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_run,json=lastRun,proto3" json:"last_run,omitempty"` // Time of last run - NextRun *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=next_run,json=nextRun,proto3" json:"next_run,omitempty"` // Time of next scheduled run - PastSuccessfulRunNames []string `protobuf:"bytes,11,rep,name=past_successful_run_names,json=pastSuccessfulRunNames,proto3" json:"past_successful_run_names,omitempty"` // Names of past successful runs - PastFailedRunNames []string `protobuf:"bytes,12,rep,name=past_failed_run_names,json=pastFailedRunNames,proto3" json:"past_failed_run_names,omitempty"` // Names of past failed runs - Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` // Reason for current schedule state - // Template fields (inherited from SparkApplication) - TemplateDetails *SparkApplicationDetails `protobuf:"bytes,14,opt,name=template_details,json=templateDetails,proto3" json:"template_details,omitempty"` // Details from the SparkApplication template + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // Template-generated constraint kind + EnforcementAction string `protobuf:"bytes,2,opt,name=enforcement_action,json=enforcementAction,proto3" json:"enforcement_action,omitempty"` // deny, warn, or dryrun + MatchJson string `protobuf:"bytes,3,opt,name=match_json,json=matchJson,proto3" json:"match_json,omitempty"` // Match criteria as JSON + ParametersJson string `protobuf:"bytes,4,opt,name=parameters_json,json=parametersJson,proto3" json:"parameters_json,omitempty"` // Constraint parameters as JSON + TotalViolations int64 `protobuf:"varint,5,opt,name=total_violations,json=totalViolations,proto3" json:"total_violations,omitempty"` // Full audit violation count + AuditTimestamp *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=audit_timestamp,json=auditTimestamp,proto3" json:"audit_timestamp,omitempty"` // When gatekeeper last audited + Violations []*ConstraintViolation `protobuf:"bytes,7,rep,name=violations,proto3" json:"violations,omitempty"` // Capped audit violations } -func (x *ScheduledSparkApplicationDetails) Reset() { - *x = ScheduledSparkApplicationDetails{} +func (x *GatekeeperConstraintDetails) Reset() { + *x = GatekeeperConstraintDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[126] + mi := &file_api_v1_common_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ScheduledSparkApplicationDetails) String() string { +func (x *GatekeeperConstraintDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ScheduledSparkApplicationDetails) ProtoMessage() {} +func (*GatekeeperConstraintDetails) ProtoMessage() {} -func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[126] +func (x *GatekeeperConstraintDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_common_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13209,105 +15041,56 @@ func (x *ScheduledSparkApplicationDetails) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ScheduledSparkApplicationDetails.ProtoReflect.Descriptor instead. -func (*ScheduledSparkApplicationDetails) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{126} -} - -func (x *ScheduledSparkApplicationDetails) GetSchedule() string { - if x != nil { - return x.Schedule - } - return "" +// Deprecated: Use GatekeeperConstraintDetails.ProtoReflect.Descriptor instead. +func (*GatekeeperConstraintDetails) Descriptor() ([]byte, []int) { + return file_api_v1_common_proto_rawDescGZIP(), []int{140} } -func (x *ScheduledSparkApplicationDetails) GetTimeZone() string { +func (x *GatekeeperConstraintDetails) GetKind() string { if x != nil { - return x.TimeZone + return x.Kind } return "" } -func (x *ScheduledSparkApplicationDetails) GetSuspended() bool { - if x != nil { - return x.Suspended - } - return false -} - -func (x *ScheduledSparkApplicationDetails) GetConcurrencyPolicy() string { +func (x *GatekeeperConstraintDetails) GetEnforcementAction() string { if x != nil { - return x.ConcurrencyPolicy + return x.EnforcementAction } return "" } -func (x *ScheduledSparkApplicationDetails) GetSuccessfulRunHistoryLimit() int32 { - if x != nil { - return x.SuccessfulRunHistoryLimit - } - return 0 -} - -func (x *ScheduledSparkApplicationDetails) GetFailedRunHistoryLimit() int32 { - if x != nil { - return x.FailedRunHistoryLimit - } - return 0 -} - -func (x *ScheduledSparkApplicationDetails) GetScheduleState() string { +func (x *GatekeeperConstraintDetails) GetMatchJson() string { if x != nil { - return x.ScheduleState + return x.MatchJson } return "" } -func (x *ScheduledSparkApplicationDetails) GetLastRunName() string { +func (x *GatekeeperConstraintDetails) GetParametersJson() string { if x != nil { - return x.LastRunName + return x.ParametersJson } return "" } -func (x *ScheduledSparkApplicationDetails) GetLastRun() *timestamppb.Timestamp { - if x != nil { - return x.LastRun - } - return nil -} - -func (x *ScheduledSparkApplicationDetails) GetNextRun() *timestamppb.Timestamp { - if x != nil { - return x.NextRun - } - return nil -} - -func (x *ScheduledSparkApplicationDetails) GetPastSuccessfulRunNames() []string { +func (x *GatekeeperConstraintDetails) GetTotalViolations() int64 { if x != nil { - return x.PastSuccessfulRunNames + return x.TotalViolations } - return nil + return 0 } -func (x *ScheduledSparkApplicationDetails) GetPastFailedRunNames() []string { +func (x *GatekeeperConstraintDetails) GetAuditTimestamp() *timestamppb.Timestamp { if x != nil { - return x.PastFailedRunNames + return x.AuditTimestamp } return nil } -func (x *ScheduledSparkApplicationDetails) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *ScheduledSparkApplicationDetails) GetTemplateDetails() *SparkApplicationDetails { +func (x *GatekeeperConstraintDetails) GetViolations() []*ConstraintViolation { if x != nil { - return x.TemplateDetails + return x.Violations } return nil } @@ -13317,43 +15100,53 @@ type Event struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - OwnerUid string `protobuf:"bytes,7,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` - OwnerKind string `protobuf:"bytes,8,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` - OwnerName string `protobuf:"bytes,9,opt,name=owner_name,json=ownerName,proto3" json:"owner_name,omitempty"` - ApiVersion string `protobuf:"bytes,10,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` - ResourceVersion string `protobuf:"bytes,11,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - Count int32 `protobuf:"varint,12,opt,name=count,proto3" json:"count,omitempty"` - Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` - Message string `protobuf:"bytes,14,opt,name=message,proto3" json:"message,omitempty"` - Type string `protobuf:"bytes,15,opt,name=type,proto3" json:"type,omitempty"` - Action string `protobuf:"bytes,16,opt,name=action,proto3" json:"action,omitempty"` - Source string `protobuf:"bytes,17,opt,name=source,proto3" json:"source,omitempty"` - InvolvedObjectKind string `protobuf:"bytes,18,opt,name=involved_object_kind,json=involvedObjectKind,proto3" json:"involved_object_kind,omitempty"` - InvolvedObjectName string `protobuf:"bytes,19,opt,name=involved_object_name,json=involvedObjectName,proto3" json:"involved_object_name,omitempty"` - InvolvedObjectNamespace string `protobuf:"bytes,20,opt,name=involved_object_namespace,json=involvedObjectNamespace,proto3" json:"involved_object_namespace,omitempty"` - ReportingController string `protobuf:"bytes,21,opt,name=reporting_controller,json=reportingController,proto3" json:"reporting_controller,omitempty"` - ReportingInstance string `protobuf:"bytes,22,opt,name=reporting_instance,json=reportingInstance,proto3" json:"reporting_instance,omitempty"` - Annotations map[string]string `protobuf:"bytes,23,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Labels map[string]string `protobuf:"bytes,24,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - InvolvedObjectUid string `protobuf:"bytes,25,opt,name=involved_object_uid,json=involvedObjectUid,proto3" json:"involved_object_uid,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - LastSeen *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` - CreatedAtAge string `protobuf:"bytes,44,opt,name=created_at_age,json=createdAtAge,proto3" json:"created_at_age,omitempty"` - UpdatedAtAge string `protobuf:"bytes,45,opt,name=updated_at_age,json=updatedAtAge,proto3" json:"updated_at_age,omitempty"` - LastSeenAge string `protobuf:"bytes,46,opt,name=last_seen_age,json=lastSeenAge,proto3" json:"last_seen_age,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,47,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + OwnerUid string `protobuf:"bytes,7,opt,name=owner_uid,json=ownerUid,proto3" json:"owner_uid,omitempty"` + OwnerKind string `protobuf:"bytes,8,opt,name=owner_kind,json=ownerKind,proto3" json:"owner_kind,omitempty"` + OwnerName string `protobuf:"bytes,9,opt,name=owner_name,json=ownerName,proto3" json:"owner_name,omitempty"` + ApiVersion string `protobuf:"bytes,10,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` + ResourceVersion string `protobuf:"bytes,11,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + Count int32 `protobuf:"varint,12,opt,name=count,proto3" json:"count,omitempty"` + Reason string `protobuf:"bytes,13,opt,name=reason,proto3" json:"reason,omitempty"` + Message string `protobuf:"bytes,14,opt,name=message,proto3" json:"message,omitempty"` + Type string `protobuf:"bytes,15,opt,name=type,proto3" json:"type,omitempty"` + Action string `protobuf:"bytes,16,opt,name=action,proto3" json:"action,omitempty"` + Source string `protobuf:"bytes,17,opt,name=source,proto3" json:"source,omitempty"` + InvolvedObjectKind string `protobuf:"bytes,18,opt,name=involved_object_kind,json=involvedObjectKind,proto3" json:"involved_object_kind,omitempty"` + InvolvedObjectName string `protobuf:"bytes,19,opt,name=involved_object_name,json=involvedObjectName,proto3" json:"involved_object_name,omitempty"` + InvolvedObjectNamespace string `protobuf:"bytes,20,opt,name=involved_object_namespace,json=involvedObjectNamespace,proto3" json:"involved_object_namespace,omitempty"` + ReportingController string `protobuf:"bytes,21,opt,name=reporting_controller,json=reportingController,proto3" json:"reporting_controller,omitempty"` + ReportingInstance string `protobuf:"bytes,22,opt,name=reporting_instance,json=reportingInstance,proto3" json:"reporting_instance,omitempty"` + Annotations map[string]string `protobuf:"bytes,23,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Labels map[string]string `protobuf:"bytes,24,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + InvolvedObjectUid string `protobuf:"bytes,25,opt,name=involved_object_uid,json=involvedObjectUid,proto3" json:"involved_object_uid,omitempty"` + // Set only on Karpenter `DisruptionBlocked` events; UNSPECIFIED on every other event. + DisruptionBlockReason DisruptionBlockReason `protobuf:"varint,26,opt,name=disruption_block_reason,json=disruptionBlockReason,proto3,enum=api.v1.DisruptionBlockReason" json:"disruption_block_reason,omitempty"` + // The PodDisruptionBudget that blocked eviction, as "namespace/name". Set only + // alongside DISRUPTION_BLOCK_REASON_PDB_VIOLATION; absent — not empty-string — + // otherwise, since "no PDB was involved" is not the same as "a PDB with no name". + BlockingPdbName *string `protobuf:"bytes,27,opt,name=blocking_pdb_name,json=blockingPdbName,proto3,oneof" json:"blocking_pdb_name,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + LastSeen *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` + CreatedAtAge string `protobuf:"bytes,44,opt,name=created_at_age,json=createdAtAge,proto3" json:"created_at_age,omitempty"` + UpdatedAtAge string `protobuf:"bytes,45,opt,name=updated_at_age,json=updatedAtAge,proto3" json:"updated_at_age,omitempty"` + LastSeenAge string `protobuf:"bytes,46,opt,name=last_seen_age,json=lastSeenAge,proto3" json:"last_seen_age,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,47,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // The pod behind a DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION or + // DISRUPTION_BLOCK_REASON_POD_NOMINATED classification, as "namespace/name". Same + // absent-means-not-applicable contract as blocking_pdb_name. + RelatedPodName *string `protobuf:"bytes,48,opt,name=related_pod_name,json=relatedPodName,proto3,oneof" json:"related_pod_name,omitempty"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[127] + mi := &file_api_v1_common_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13366,7 +15159,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[127] + mi := &file_api_v1_common_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13379,7 +15172,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{127} + return file_api_v1_common_proto_rawDescGZIP(), []int{141} } func (x *Event) GetId() string { @@ -13550,6 +15343,20 @@ func (x *Event) GetInvolvedObjectUid() string { return "" } +func (x *Event) GetDisruptionBlockReason() DisruptionBlockReason { + if x != nil { + return x.DisruptionBlockReason + } + return DisruptionBlockReason_DISRUPTION_BLOCK_REASON_UNSPECIFIED +} + +func (x *Event) GetBlockingPdbName() string { + if x != nil && x.BlockingPdbName != nil { + return *x.BlockingPdbName + } + return "" +} + func (x *Event) GetCreatedAt() *timestamppb.Timestamp { if x != nil { return x.CreatedAt @@ -13599,6 +15406,13 @@ func (x *Event) GetDeletedAt() *timestamppb.Timestamp { return nil } +func (x *Event) GetRelatedPodName() string { + if x != nil && x.RelatedPodName != nil { + return *x.RelatedPodName + } + return "" +} + type EventDatapointInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13616,7 +15430,7 @@ type EventDatapointInfo struct { func (x *EventDatapointInfo) Reset() { *x = EventDatapointInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[128] + mi := &file_api_v1_common_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13629,7 +15443,7 @@ func (x *EventDatapointInfo) String() string { func (*EventDatapointInfo) ProtoMessage() {} func (x *EventDatapointInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[128] + mi := &file_api_v1_common_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13642,7 +15456,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{128} + return file_api_v1_common_proto_rawDescGZIP(), []int{142} } func (x *EventDatapointInfo) GetName() string { @@ -13710,7 +15524,7 @@ type EventDatapoint struct { func (x *EventDatapoint) Reset() { *x = EventDatapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[129] + mi := &file_api_v1_common_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13723,7 +15537,7 @@ func (x *EventDatapoint) String() string { func (*EventDatapoint) ProtoMessage() {} func (x *EventDatapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[129] + mi := &file_api_v1_common_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13736,7 +15550,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{129} + return file_api_v1_common_proto_rawDescGZIP(), []int{143} } func (x *EventDatapoint) GetUtcTime() string { @@ -13794,7 +15608,7 @@ type DimensionCount struct { func (x *DimensionCount) Reset() { *x = DimensionCount{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[130] + mi := &file_api_v1_common_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13807,7 +15621,7 @@ func (x *DimensionCount) String() string { func (*DimensionCount) ProtoMessage() {} func (x *DimensionCount) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[130] + mi := &file_api_v1_common_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13820,7 +15634,7 @@ func (x *DimensionCount) ProtoReflect() protoreflect.Message { // Deprecated: Use DimensionCount.ProtoReflect.Descriptor instead. func (*DimensionCount) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{130} + return file_api_v1_common_proto_rawDescGZIP(), []int{144} } func (x *DimensionCount) GetValue() string { @@ -13864,7 +15678,7 @@ type EventGroup struct { func (x *EventGroup) Reset() { *x = EventGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_common_proto_msgTypes[131] + mi := &file_api_v1_common_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13877,7 +15691,7 @@ func (x *EventGroup) String() string { func (*EventGroup) ProtoMessage() {} func (x *EventGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_common_proto_msgTypes[131] + mi := &file_api_v1_common_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13890,7 +15704,7 @@ func (x *EventGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use EventGroup.ProtoReflect.Descriptor instead. func (*EventGroup) Descriptor() ([]byte, []int) { - return file_api_v1_common_proto_rawDescGZIP(), []int{131} + return file_api_v1_common_proto_rawDescGZIP(), []int{145} } func (x *EventGroup) GetReason() string { @@ -14031,7 +15845,7 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x82, 0x1b, 0x0a, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x6f, 0x6e, 0x22, 0xe1, 0x1b, 0x0a, 0x08, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x33, @@ -14192,500 +16006,695 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x6f, 0x64, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, - 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x43, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x6e, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x25, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x6c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, + 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x5d, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, + 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, + 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x70, + 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x12, 0x6e, 0x0a, 0x2b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x24, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x64, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x25, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x12, 0x6c, 0x0a, 0x2a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, + 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x24, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, + 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x74, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, + 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, + 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x75, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x68, 0x0a, 0x28, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x74, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x55, 0x0a, 0x1e, 0x6d, - 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x75, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x12, 0x48, 0x0a, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x76, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x5b, 0x0a, 0x21, - 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, - 0x72, 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, - 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x58, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x76, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x78, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x48, - 0x6f, 0x75, 0x72, 0x12, 0x5c, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, - 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, - 0x72, 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x22, 0xd8, 0x16, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, - 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, - 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, - 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, - 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, - 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, - 0x6d, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, - 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x64, 0x12, 0x48, 0x0a, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, + 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x76, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x5b, 0x0a, 0x21, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, + 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, + 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x58, 0x0a, 0x20, 0x6d, 0x6f, 0x6e, 0x65, + 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x78, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, 0x75, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x48, 0x6f, + 0x75, 0x72, 0x12, 0x5c, 0x0a, 0x22, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x1c, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, + 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, + 0x4a, 0x04, 0x08, 0x17, 0x10, 0x18, 0x22, 0xf7, 0x1d, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, + 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, + 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, + 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, + 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, + 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, + 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x12, 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x43, + 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, + 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, + 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, + 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x21, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x5c, 0x0a, 0x29, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x22, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x24, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, + 0x5f, 0x72, 0x63, 0x76, 0x18, 0x29, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x74, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, + 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x33, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, + 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x47, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, + 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x4c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x18, 0x56, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x46, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, + 0x51, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x5c, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, + 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, + 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5e, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x5f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, + 0x63, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, + 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, + 0x76, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x61, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x44, 0x72, 0x6f, 0x70, 0x70, + 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, + 0x62, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x2b, 0x0a, + 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x65, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x46, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x66, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x24, 0x0a, + 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, + 0x68, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x6f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x2d, 0x0a, 0x13, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x79, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6a, + 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x55, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x2b, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6a, 0x76, 0x6d, + 0x48, 0x65, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x1a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x72, 0x73, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x52, 0x73, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x23, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x7e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x6e, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x7f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x21, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x73, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x46, + 0x0a, 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, + 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x73, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x64, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x66, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x55, 0x73, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x47, 0x0a, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, + 0x72, 0x65, 0x5f, 0x73, 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x84, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, + 0x75, 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x55, 0x73, 0x65, + 0x63, 0x12, 0x4d, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x73, + 0x6f, 0x6d, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x85, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x1f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x50, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x55, 0x73, 0x65, 0x63, + 0x12, 0x4d, 0x0a, 0x23, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x75, + 0x6c, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x63, 0x18, 0x86, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, + 0x72, 0x65, 0x73, 0x73, 0x75, 0x72, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x63, 0x42, + 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, + 0x21, 0x0a, 0x1f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, - 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, - 0x52, 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x41, 0x0a, 0x1b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x21, - 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x5c, 0x0a, 0x29, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x22, 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x24, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, - 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x29, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x34, 0x0a, 0x16, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, - 0x69, 0x74, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, - 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x47, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, - 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x4c, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x56, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x46, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, - 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x18, - 0x5c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, - 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5d, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x50, 0x63, - 0x6b, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x63, 0x6b, 0x74, 0x73, 0x18, 0x5e, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x50, 0x63, 0x6b, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, 0x63, 0x76, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, - 0x52, 0x63, 0x76, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, - 0x65, 0x4e, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, 0x72, - 0x63, 0x76, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0x61, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x52, 0x63, 0x76, 0x44, 0x72, 0x6f, 0x70, - 0x70, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, - 0x18, 0x62, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x65, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x44, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x2b, - 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x65, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x66, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x52, 0x65, 0x61, 0x64, 0x73, 0x12, 0x24, - 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x68, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x73, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, - 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6f, 0x64, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x22, 0xf9, 0x03, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x30, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x31, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, - 0x35, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x37, 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x70, 0x39, 0x39, 0x39, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x02, 0x70, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x02, 0x70, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x31, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x30, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x30, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, - 0x35, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x34, 0x30, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x30, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x34, 0x35, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x35, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x35, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x35, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x30, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x36, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x35, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x36, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x30, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, - 0x35, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x39, 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x37, 0x22, 0xa2, - 0x08, 0x0a, 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, - 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6f, 0x64, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x22, 0xf9, 0x03, 0x0a, 0x11, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x30, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x31, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x35, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, + 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x39, 0x30, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, + 0x39, 0x39, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x31, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, + 0x70, 0x31, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, + 0x70, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x31, 0x35, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x31, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x30, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x32, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x30, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x33, 0x35, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x33, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x34, + 0x30, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x34, 0x35, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x34, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x35, 0x35, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x35, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x30, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x36, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x36, 0x35, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x36, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x37, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x35, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x38, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, + 0x37, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x37, 0x22, 0xa2, 0x08, 0x0a, + 0x1a, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3c, + 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, 0x0a, 0x09, + 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x36, - 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, - 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, - 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, - 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x16, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x66, - 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x43, - 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, - 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xf2, 0x0c, 0x0a, 0x17, 0x46, 0x6f, - 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 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, - 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, 0x12, 0x25, - 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, - 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, + 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x14, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x73, 0x5f, + 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0e, + 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x22, 0x9d, 0x05, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x76, 0x6d, 0x5f, 0x6a, + 0x61, 0x76, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6a, 0x76, 0x6d, 0x4a, 0x61, 0x76, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6a, 0x76, 0x6d, 0x5f, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6a, 0x76, 0x6d, + 0x4a, 0x61, 0x76, 0x61, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6a, + 0x76, 0x6d, 0x5f, 0x78, 0x6d, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x78, 0x6d, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x73, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x61, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x13, 0x6a, 0x76, 0x6d, 0x4d, 0x61, 0x78, 0x52, 0x61, 0x6d, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x19, 0x6a, 0x76, 0x6d, 0x5f, + 0x75, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x16, 0x6a, + 0x76, 0x6d, 0x55, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, + 0x70, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0e, 0x6a, 0x76, 0x6d, 0x5f, + 0x78, 0x6d, 0x78, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6a, 0x76, 0x6d, 0x58, 0x6d, 0x78, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x43, + 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x75, 0x73, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x22, 0x8a, 0x03, 0x0a, 0x0e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, + 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, + 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0c, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x34, 0x0a, 0x16, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x67, + 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x14, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x65, + 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xfa, + 0x03, 0x0a, 0x13, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x0a, + 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x42, 0x0a, 0x1d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x1b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6d, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x73, 0x6d, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x5f, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xd6, 0x01, 0x0a, 0x1d, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x42, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x77, 0x5f, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x61, 0x77, 0x43, 0x6d, 0x64, 0x6c, + 0x69, 0x6e, 0x65, 0x22, 0xf2, 0x0c, 0x0a, 0x17, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 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, 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, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, + 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, + 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x43, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, + 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3a, - 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, - 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, - 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, - 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, - 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x18, 0x1d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, - 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x19, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3f, 0x0a, - 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x47, - 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0xe8, - 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, - 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x64, - 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, - 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, - 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, - 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, - 0x64, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x75, 0x6e, - 0x64, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x14, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xf1, 0x0a, 0x0a, 0x0c, 0x57, 0x6f, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, + 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, + 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, + 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, + 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, + 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x45, 0x0a, 0x1f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0xe8, 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x66, 0x75, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, + 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, + 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x6f, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x64, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x6f, + 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x16, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6f, + 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x0f, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd2, 0x02, 0x0a, 0x12, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, + 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x13, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x12, 0x26, + 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x76, + 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x56, 0x32, 0x12, 0x40, 0x0a, 0x0f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xdb, 0x0b, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, @@ -14762,1025 +16771,1242 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x69, 0x6e, 0x64, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x1a, 0x39, - 0x0a, 0x0b, 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, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, - 0x6f, 0x74, 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, - 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, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x53, 0x0a, - 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xdb, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, - 0x0a, 0x0f, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, - 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x73, 0x70, 0x6f, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, - 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x57, 0x0a, 0x13, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xe5, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x1a, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x9c, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, - 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, - 0x12, 0x4e, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x28, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x2c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0b, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, - 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, - 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, - 0x32, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x63, 0x70, 0x75, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, - 0x75, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, - 0x69, 0x62, 0x18, 0x34, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x35, 0x20, 0x01, 0x28, 0x01, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, - 0x75, 0x12, 0x1f, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x36, - 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x37, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x09, 0x67, 0x70, 0x75, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x08, 0x67, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, - 0x50, 0x0a, 0x1b, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x65, 0x66, 0x66, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x3a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x45, - 0x66, 0x66, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, - 0x74, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x63, 0x70, 0x75, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, - 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x50, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x69, 0x62, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, - 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, - 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x3a, 0x0a, 0x0f, - 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, - 0x43, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x65, - 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x53, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, - 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x54, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, - 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, - 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, - 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x56, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x75, - 0x72, 0x61, 0x63, 0x79, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, - 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, - 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x69, 0x64, 0x12, - 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x41, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x65, - 0x12, 0x41, 0x0a, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x18, 0x42, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, - 0x18, 0x46, 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, 0x3d, 0x0a, 0x0c, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x47, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x49, 0x0a, 0x12, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x48, 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, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 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, 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, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x0e, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xae, - 0x03, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x22, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x52, 0x0c, 0x72, 0x6f, 0x6f, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x69, 0x64, 0x12, 0x50, + 0x0a, 0x13, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x02, 0x52, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, + 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3e, 0x0a, 0x10, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 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, 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, 0x0d, 0x0a, 0x0b, 0x5f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x53, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xdb, 0x02, 0x0a, + 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, 0x5f, 0x64, + 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x6f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x70, 0x6f, 0x74, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x70, 0x6f, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x43, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x0c, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, + 0x0a, 0x1a, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x18, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, + 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x9c, 0x12, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, - 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, - 0x5c, 0x0a, 0x0d, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, - 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x75, 0x0a, - 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x22, 0xc8, 0x03, 0x0a, 0x0b, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x14, 0x63, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x68, 0x69, - 0x67, 0x68, 0x5f, 0x77, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x70, 0x75, 0x48, 0x69, 0x67, 0x68, 0x57, 0x61, 0x74, 0x65, - 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, - 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x10, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x21, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1e, - 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, - 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x6f, - 0x75, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x6f, 0x75, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x26, 0x0a, - 0x0f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x10, 0x53, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, - 0x0c, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, - 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x83, 0x02, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x73, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x11, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x69, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x4e, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, + 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x2b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x2c, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x32, 0x20, 0x01, 0x28, 0x01, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, + 0x72, 0x12, 0x28, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x18, 0x33, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, 0x12, 0x26, 0x0a, 0x0d, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x34, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, + 0x47, 0x69, 0x62, 0x12, 0x26, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x67, 0x70, 0x75, 0x18, 0x35, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x1f, 0x0a, 0x09, 0x63, + 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x08, 0x63, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0c, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x37, 0x20, 0x01, + 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x38, 0x20, 0x01, 0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x67, 0x70, 0x75, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x14, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x50, 0x0a, 0x1b, 0x6d, 0x6f, 0x6e, + 0x65, 0x79, 0x5f, 0x65, 0x66, 0x66, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x17, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x45, 0x66, 0x66, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x14, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, + 0x63, 0x70, 0x75, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x11, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, 0x56, 0x63, 0x70, 0x75, + 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x65, 0x72, + 0x47, 0x69, 0x62, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, + 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x47, 0x70, 0x75, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, + 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x43, 0x70, 0x75, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x40, 0x0a, 0x12, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x10, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x47, 0x70, 0x75, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x55, 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6d, + 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, + 0x75, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x6d, 0x6f, + 0x6e, 0x65, 0x79, 0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, + 0x69, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x72, 0x61, 0x63, 0x79, 0x18, 0x57, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, + 0x75, 0x72, 0x61, 0x63, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, + 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x5f, 0x75, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x55, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x3f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, + 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x65, 0x18, 0x41, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x49, 0x6e, 0x55, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x10, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x42, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x0f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x12, 0x37, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x46, 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, 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x49, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x48, 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, 0x11, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3e, 0x0a, 0x10, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 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, 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, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x22, 0x45, 0x0a, 0x0e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xae, 0x03, 0x0a, 0x09, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x42, + 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, + 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, + 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x5c, 0x0a, 0x0d, 0x43, 0x6f, 0x73, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, + 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x75, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x89, + 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, + 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x0b, 0x53, + 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, - 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, - 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x7f, 0x0a, 0x18, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x05, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x22, 0x94, 0x02, - 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x29, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0xe0, 0x47, 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, 0x7a, 0x0a, - 0x23, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x73, 0x70, 0x61, 0x72, 0x6b, + 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x70, 0x75, 0x53, + 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, + 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x77, 0x61, 0x74, + 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, + 0x70, 0x75, 0x48, 0x69, 0x67, 0x68, 0x57, 0x61, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x12, + 0x2c, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x61, 0x63, 0x74, + 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x49, 0x0a, + 0x21, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1e, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x70, 0x75, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x18, 0x63, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x41, 0x75, 0x74, + 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x75, 0x61, + 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0d, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x12, + 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x0c, 0x73, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x0b, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, + 0x83, 0x02, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x73, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x3f, + 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x53, 0x61, + 0x76, 0x69, 0x6e, 0x67, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, + 0x33, 0x0a, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x53, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x77, 0x61, 0x73, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x74, 0x65, 0x22, 0x7f, 0x0a, 0x18, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x22, 0x94, 0x02, 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x4d, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3e, + 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0x93, + 0x4b, 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, 0xf3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 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, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x53, 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, + 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, 0x7a, 0x0a, 0x23, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x64, 0x5f, 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, 0xf3, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 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, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, + 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf4, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x79, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x68, 0x0a, 0x1d, 0x6b, 0x79, + 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf5, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x79, 0x76, 0x65, + 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6b, 0x79, 0x76, 0x65, 0x72, 0x6e, + 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x83, 0x01, 0x0a, 0x26, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, + 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x5f, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0xf6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x23, 0x67, 0x61, 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x6a, 0x0a, 0x1d, 0x67, 0x61, + 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0xf7, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x1b, 0x67, 0x61, 0x74, 0x65, 0x6b, + 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 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, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x62, 0x79, + 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, + 0x65, 0x64, 0x42, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x29, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2a, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x2b, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x2f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x30, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x70, 0x6f, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x76, 0x63, 0x5f, 0x72, 0x65, 0x74, 0x65, + 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x40, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x63, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x46, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x47, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x49, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x73, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x4d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x50, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x6a, 0x6f, + 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x6a, + 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x6a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, + 0x2a, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, 0x6f, 0x62, 0x42, + 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6a, + 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6a, + 0x6f, 0x62, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6a, 0x6f, 0x62, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, + 0x62, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x59, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50, 0x6f, + 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x28, + 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x72, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3b, + 0x0a, 0x1a, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x60, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, 0x0a, 0x16, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x61, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x72, 0x6f, + 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x62, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x70, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x66, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x61, + 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x45, 0x0a, 0x1f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x6b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x4c, 0x0a, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, + 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x6e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, + 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x78, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x79, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x7a, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x7b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x73, 0x18, 0x7c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x54, 0x6c, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x7d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, + 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x69, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x72, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x7e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x69, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, + 0x49, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x5f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, + 0x81, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, + 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x70, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, + 0x13, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x76, 0x63, + 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x29, + 0x0a, 0x10, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0x85, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, 0x63, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x86, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, + 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x76, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x76, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x76, 0x63, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x89, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, + 0x0a, 0x19, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x8a, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x70, 0x76, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, + 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x69, 0x65, 0x73, 0x18, 0x8b, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x70, 0x76, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x76, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x98, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x70, 0x76, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x99, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x76, + 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2a, 0x0a, + 0x11, 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x9a, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, 0x43, 0x6c, 0x61, + 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x5f, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x9c, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x76, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x9d, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x76, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x25, + 0x0a, 0x0e, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x76, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x76, 0x5f, 0x63, 0x73, 0x69, 0x5f, + 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x76, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, + 0x0a, 0x16, 0x70, 0x76, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0xa1, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x13, 0x70, 0x76, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5a, + 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x63, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0xab, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x63, 0x52, 0x65, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x63, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x3a, 0x0a, 0x19, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xad, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0d, 0x73, + 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0xae, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x63, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x73, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x15, + 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0xaf, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x73, 0x63, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x63, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb0, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x73, + 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0xb2, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, + 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, + 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0xb5, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, + 0x12, 0x33, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0xb6, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x54, + 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0xb7, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb8, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, + 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xba, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xbb, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6f, 0x73, 0x18, 0xbc, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x4f, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0xbe, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, + 0x61, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc8, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x69, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc9, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x12, 0x68, 0x70, 0x61, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xcb, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xcc, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x68, 0x70, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x70, 0x61, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xce, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x68, 0x70, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x55, 0x70, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, + 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x68, 0x70, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x70, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, + 0x70, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, + 0x76, 0x70, 0x61, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0xd3, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x70, 0x61, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x19, 0x76, + 0x70, 0x61, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x17, 0x76, 0x70, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x70, 0x61, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd5, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x43, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x2b, 0x0a, 0x11, 0x76, 0x70, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0xd6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x70, 0x61, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x76, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xd7, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x76, 0x70, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x17, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0xdd, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0xde, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x70, 0x75, 0x18, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xe1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, 0x6e, 0x43, 0x70, + 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe2, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, + 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x47, 0x0a, 0x20, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe4, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe5, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x22, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xe7, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf0, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0xf1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x63, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 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, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, + 0x8b, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 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, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8d, 0x02, + 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 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, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x15, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, - 0x65, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x1e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x42, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x20, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x44, 0x65, 0x73, - 0x69, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x29, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x2d, 0x0a, 0x12, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x2b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x73, 0x18, 0x30, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x70, 0x6f, 0x64, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x76, 0x63, 0x5f, 0x72, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x63, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x18, 0x46, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, - 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0x47, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x49, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, - 0x6d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x18, 0x4d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x18, 0x50, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x3a, 0x0a, - 0x19, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x17, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x52, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x6a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, - 0x73, 0x6d, 0x12, 0x2a, 0x0a, 0x11, 0x6a, 0x6f, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, - 0x66, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6a, - 0x6f, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2e, - 0x0a, 0x13, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x6f, 0x62, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, - 0x55, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6a, 0x6f, 0x62, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x6a, 0x6f, 0x62, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x6a, 0x6f, 0x62, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, - 0x18, 0x59, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6a, 0x6f, 0x62, 0x46, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x72, - 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x5b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x72, 0x6f, - 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, - 0x72, 0x6f, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, - 0x6f, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x5e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x63, 0x72, 0x6f, 0x6e, 0x4e, 0x65, 0x78, 0x74, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x72, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x60, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x66, 0x75, 0x6c, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x33, - 0x0a, 0x16, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6a, 0x6f, - 0x62, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x61, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, - 0x63, 0x72, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x62, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1b, 0x63, 0x72, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, - 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x70, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, - 0x73, 0x18, 0x66, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x73, 0x12, 0x38, 0x0a, 0x0d, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x67, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x68, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x38, - 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x16, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x45, 0x0a, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4c, 0x0a, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x6c, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x1f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x6e, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, - 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x0a, 0x12, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x78, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x79, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, - 0x18, 0x7a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, - 0x61, 0x74, 0x68, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x7b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x18, 0x7c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x18, 0x7d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x6c, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x69, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x7e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, - 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x72, 0x49, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x7f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x80, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x68, - 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x69, 0x6e, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x82, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x70, 0x76, 0x63, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x76, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x70, 0x76, 0x63, 0x41, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x85, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, - 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x86, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, 0x63, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x76, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x88, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x76, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x76, 0x63, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x89, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x76, 0x63, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x8a, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x70, 0x76, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x0a, - 0x16, 0x70, 0x76, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0x8b, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, - 0x70, 0x76, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x96, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x76, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x70, 0x76, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x76, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x98, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x76, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, - 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x99, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x76, 0x52, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x9a, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x76, - 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, - 0x70, 0x76, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, - 0x76, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x76, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x9c, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x76, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x76, 0x5f, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, - 0x9d, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x70, 0x76, 0x49, 0x73, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x9e, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x76, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x76, 0x5f, 0x63, - 0x73, 0x69, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x76, 0x43, 0x73, 0x69, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x32, 0x0a, - 0x15, 0x70, 0x76, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, - 0x76, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x76, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0xa1, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x13, 0x70, 0x76, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x63, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0xaa, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x63, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, - 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x5f, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x18, 0xab, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x63, 0x52, - 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x16, - 0x73, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x73, - 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0xad, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, - 0x0a, 0x0d, 0x73, 0x63, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0xae, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, - 0x53, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x73, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x33, 0x0a, 0x15, 0x73, 0x63, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0xaf, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x13, 0x73, 0x63, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x63, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb0, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x63, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xb1, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, - 0x0d, 0x6e, 0x73, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0xb2, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x73, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb3, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x31, 0x0a, 0x14, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x18, 0xb5, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x12, 0x33, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0xb6, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x6e, 0x6f, - 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0xb7, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x6f, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb8, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x70, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x12, 0x22, - 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xba, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xbb, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6f, 0x73, 0x18, 0xbc, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x4f, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xbe, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, - 0x10, 0x68, 0x70, 0x61, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x69, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x5f, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xc9, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xca, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x68, 0x70, 0x61, 0x5f, 0x64, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0xcb, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x68, 0x70, 0x61, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x68, 0x70, 0x61, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xcc, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x68, 0x70, 0x61, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0xcd, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x70, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xce, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x68, 0x70, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x68, 0x70, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xcf, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x68, 0x70, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x53, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x70, 0x61, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xd2, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x76, 0x70, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x2d, 0x0a, 0x12, 0x76, 0x70, 0x61, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd3, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x70, - 0x61, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x19, 0x76, 0x70, 0x61, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xd4, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x17, 0x76, 0x70, 0x61, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x76, - 0x70, 0x61, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd5, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x43, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x70, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0xd6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x76, 0x70, 0x61, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x76, 0x70, 0x61, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xd7, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x70, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x36, 0x0a, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xdc, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0xdd, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0xde, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x48, 0x61, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2e, - 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xdf, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x34, - 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe0, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0xe1, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x69, - 0x6e, 0x43, 0x70, 0x75, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0xe2, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x4d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0xe3, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x47, 0x0a, - 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0xe4, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x63, 0x70, - 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0xe5, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, - 0x22, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0xe6, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0xe7, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf0, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0xf1, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x42, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, - 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 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, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x9d, 0x01, + 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc0, 0x01, + 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, 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, + 0x51, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, + 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, + 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x14, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x22, 0xc2, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, 0x74, 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, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x74, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x53, 0x65, 0x74, 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, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, + 0x62, 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, 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, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x8d, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x36, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x70, 0x75, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x22, 0xc0, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x53, 0x65, 0x74, - 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, 0x51, 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, - 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x22, 0xc2, 0x01, 0x0a, 0x10, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 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, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xc6, 0x01, 0x0a, + 0x0c, 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, 0x26, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x54, + 0x69, 0x6d, 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, 0x06, 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, 0xc0, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x6e, 0x4a, 0x6f, + 0x62, 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, 0x38, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, - 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 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, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, 0x01, 0x0a, - 0x0a, 0x4a, 0x6f, 0x62, 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, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 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, 0x31, 0x0a, 0x08, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0xc6, 0x01, 0x0a, 0x0c, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6a, 0x6f, + 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x36, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x6a, 0x6f, 0x62, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x12, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x61, 0x63, 0x6b, 0x6f, + 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x27, 0x0a, 0x0f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x11, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 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, 0xdc, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x61, 0x70, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x22, 0x70, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, + 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x70, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x70, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x24, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, + 0x53, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4c, 0x0a, 0x0b, 0x49, 0x6e, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x70, + 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x70, 0x0a, 0x0b, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, + 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x0a, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, 0x53, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd0, + 0x02, 0x0a, 0x1c, 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, 0x12, + 0x51, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x52, + 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x79, 0x50, 0x6f, 0x64, + 0x73, 0x22, 0x98, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 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, 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, 0x90, 0x01, 0x0a, + 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, + 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x12, 0x3d, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x22, + 0xc6, 0x01, 0x0a, 0x0c, 0x50, 0x56, 0x43, 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, @@ -15792,933 +18018,571 @@ var file_api_v1_common_proto_rawDesc = []byte{ 0x62, 0x65, 0x54, 0x69, 0x6d, 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, 0x06, 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, 0xc0, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, - 0x6e, 0x4a, 0x6f, 0x62, 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, 0x3b, 0x0a, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, - 0x6f, 0x62, 0x73, 0x12, 0x36, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x0b, - 0x6a, 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x7d, 0x0a, 0x12, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x0b, 0x4a, - 0x6f, 0x62, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 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, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x61, - 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x27, - 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 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, 0xdc, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, - 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x70, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x22, 0x70, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, - 0x69, 0x70, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, - 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xf3, 0x01, 0x0a, 0x0e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x4c, 0x53, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x15, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x72, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x4c, 0x0a, 0x0b, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x70, 0x0a, 0x0b, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x62, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x0e, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x70, 0x69, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x0a, - 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x4c, 0x53, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xd0, 0x02, 0x0a, 0x1c, 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, 0x12, 0x51, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x52, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x43, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x50, 0x6f, 0x64, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x46, 0x0a, - 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 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, 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, - 0x90, 0x01, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x0c, 0x50, 0x56, 0x43, 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, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, - 0x50, 0x72, 0x6f, 0x62, 0x65, 0x54, 0x69, 0x6d, 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, 0x06, 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, 0xf5, 0x02, 0x0a, 0x17, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xf5, 0x02, 0x0a, 0x17, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 0x12, 0x49, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x12, 0x35, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, - 0x08, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x3b, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, - 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 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, 0xa2, 0x01, 0x0a, 0x10, 0x50, 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x0e, 0x50, 0x56, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x29, 0x0a, 0x03, 0x63, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x63, 0x73, 0x69, 0x12, 0x39, 0x0a, 0x09, 0x68, 0x6f, - 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x29, 0x0a, 0x03, 0x6e, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x46, 0x53, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x6e, 0x66, 0x73, - 0x12, 0x59, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x63, 0x6c, + 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x3b, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x66, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x23, + 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 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, 0xa5, 0x02, 0x0a, 0x0f, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5a, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x22, 0xa2, 0x01, 0x0a, 0x10, 0x50, 0x56, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x0e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x03, + 0x63, 0x73, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x03, 0x63, 0x73, 0x69, 0x12, 0x39, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x29, 0x0a, 0x03, 0x6e, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x46, 0x53, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x6e, 0x66, 0x73, 0x12, 0x59, 0x0a, + 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x56, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x73, 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 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, 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, 0x14, 0x48, 0x6f, 0x73, 0x74, - 0x50, 0x61, 0x74, 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5a, 0x0a, 0x0f, 0x4e, 0x46, 0x53, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xbe, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 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, 0x2e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x69, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, - 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 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, 0xa5, 0x02, + 0x0a, 0x0f, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x17, + 0x0a, 0x07, 0x66, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x5a, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x53, 0x49, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, + 0x1a, 0x43, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 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, 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, 0xd1, 0x01, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, - 0x12, 0x48, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x14, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, + 0x68, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x5a, 0x0a, 0x0f, 0x4e, 0x46, 0x53, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x22, 0xbe, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 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, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x72, 0x65, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, + 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x10, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 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, 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, 0xb7, 0x04, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x09, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x37, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, + 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x69, 0x67, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 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, 0x6a, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 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, 0xdf, 0x03, 0x0a, 0x0b, 0x4e, 0x6f, - 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x08, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x46, 0x0a, 0x0b, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 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, 0x6a, 0x0a, 0x09, 0x4e, - 0x6f, 0x64, 0x65, 0x54, 0x61, 0x69, 0x6e, 0x74, 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, - 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x22, 0x3b, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 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, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, - 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x54, 0x69, 0x6d, 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, 0x06, 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, 0x8d, 0x03, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6f, 0x6f, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6f, 0x6f, 0x74, - 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x73, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x73, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x6c, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x6b, 0x75, 0x62, - 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x75, 0x62, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x40, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, - 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x68, 0x0a, 0x10, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x17, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x15, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x50, 0x0a, 0x0c, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3e, 0x0a, - 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0x9b, 0x01, - 0x0a, 0x0e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x0a, 0x12, - 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x0c, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x54, 0x65, 0x72, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x10, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, - 0x12, 0x4c, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, - 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x0a, 0x48, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, - 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x59, 0x0a, 0x0e, 0x53, - 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe9, 0x01, 0x0a, 0x09, 0x48, 0x50, 0x41, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x29, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x22, 0x6b, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x86, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x45, 0x0a, 0x10, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x11, 0x48, - 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 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, 0x7b, 0x0a, 0x12, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 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, - 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x41, 0x64, 0x64, 0x65, 0x64, 0x22, 0x3b, 0x0a, 0x0b, + 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x0d, 0x4e, 0x6f, + 0x64, 0x65, 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, 0x2e, 0x0a, 0x13, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x54, 0x69, 0x6d, 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, 0x06, 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, 0x8d, 0x03, 0x0a, 0x0e, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x55, 0x75, 0x69, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x6f, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x6b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x6f, 0x73, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x73, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, + 0x0a, 0x12, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x75, 0x62, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, + 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, + 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x40, 0x0a, 0x09, 0x4e, + 0x6f, 0x64, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x68, 0x0a, + 0x10, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x54, 0x0a, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x52, 0x15, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x14, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x12, 0x50, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0x9b, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x22, 0x3e, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x22, 0xa4, 0x01, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x4c, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x5f, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x0a, 0x48, 0x50, 0x41, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a, 0x07, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x08, + 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x41, 0x0a, + 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x22, 0x59, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, + 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe9, 0x01, 0x0a, 0x09, + 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x50, + 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, + 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x35, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x6b, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, - 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x16, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, - 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x50, 0x6f, 0x64, 0x73, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa6, - 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x01, + 0x0a, 0x0f, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x12, 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8a, 0x01, 0x0a, 0x11, 0x48, 0x50, 0x41, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa9, 0x01, 0x0a, + 0x11, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x7b, 0x0a, 0x12, 0x48, 0x50, 0x41, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x04, + 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, + 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x12, 0x36, + 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x48, 0x50, + 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x16, 0x48, 0x50, + 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x12, 0x45, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x06, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x48, 0x50, 0x41, 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, 0x79, 0x0a, 0x0b, 0x48, 0x50, 0x41, 0x42, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x5f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x07, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x12, 0x36, 0x0a, 0x0a, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, - 0x6f, 0x77, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x73, 0x74, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x73, - 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x34, - 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xbc, 0x02, 0x0a, 0x0a, 0x56, 0x50, - 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x66, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x3c, 0x0a, - 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0c, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x42, 0x0a, 0x0f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x57, 0x0a, 0x0c, 0x56, 0x50, 0x41, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x55, 0x0a, 0x0f, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x66, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x51, 0x0a, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x22, 0xdf, 0x03, 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x53, 0x0a, 0x0b, 0x6d, 0x69, - 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, - 0x53, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, - 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, - 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 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, 0x74, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x05, 0x0a, 0x1a, 0x56, 0x50, 0x41, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x18, 0x48, 0x50, 0x41, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x12, 0x31, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9e, 0x01, 0x0a, + 0x0c, 0x48, 0x50, 0x41, 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, 0x79, 0x0a, + 0x0b, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x08, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, + 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x07, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, + 0x12, 0x36, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, + 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x0f, 0x48, 0x50, 0x41, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x1c, + 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x63, 0x0a, 0x10, 0x48, 0x50, 0x41, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xbc, + 0x02, 0x0a, 0x0a, 0x56, 0x50, 0x41, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x33, 0x0a, + 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x66, 0x12, 0x3c, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x42, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x57, 0x0a, + 0x0c, 0x56, 0x50, 0x41, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x66, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0f, 0x56, 0x50, 0x41, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x66, 0x0a, + 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x51, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x53, 0x0a, 0x0b, 0x75, - 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x5f, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x6e, - 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, - 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x55, - 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x55, 0x6e, - 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x9e, 0x01, - 0x0a, 0x0c, 0x56, 0x50, 0x41, 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, 0x43, - 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x22, 0xd8, 0x05, 0x0a, 0x0e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a, 0x0e, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x03, 0x6d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x69, 0x6e, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x67, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, - 0x2e, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, - 0x1a, 0x40, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xdf, 0x03, 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x53, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x61, + 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6d, + 0x61, 0x78, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x69, 0x6e, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4d, 0x61, 0x78, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 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, 0x74, 0x0a, 0x11, 0x56, 0x50, 0x41, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x19, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x05, + 0x0a, 0x1a, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0b, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x53, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x5f, 0x0a, 0x0f, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x55, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x75, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3d, 0x0a, 0x0f, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x41, 0x0a, 0x13, 0x55, 0x6e, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, - 0x08, 0x4d, 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, 0x1a, 0x47, 0x0a, 0x19, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, - 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x1f, 0x61, 0x75, 0x74, 0x6f, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1c, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x75, 0x6c, 0x6c, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x70, 0x69, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x22, 0x7e, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x30, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, - 0x22, 0x77, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x0d, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, - 0xe4, 0x02, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x3b, - 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 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, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, - 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, - 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 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, 0xab, - 0x01, 0x0a, 0x19, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 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, 0x85, 0x04, 0x0a, - 0x18, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 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, 0x42, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x65, 0x66, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, - 0x69, 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, 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, 0xac, 0x01, 0x0a, 0x1a, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x38, 0x01, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x56, 0x50, 0x41, 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, @@ -16728,140 +18592,181 @@ var file_api_v1_common_proto_rawDesc = []byte{ 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, 0xb3, 0x01, 0x0a, 0x11, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2e, 0x4f, 0x74, - 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x1a, - 0x38, 0x0a, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 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, 0x5c, 0x0a, 0x14, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xc5, 0x04, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, - 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, - 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x94, 0x04, 0x0a, 0x1a, 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, 0x12, 0x23, - 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, - 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x2f, - 0x0a, 0x13, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, 0x69, 0x73, - 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5f, 0x0a, 0x0f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 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, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x44, 0x0a, - 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 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, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0xae, 0x01, 0x0a, 0x1c, 0x50, 0x6f, 0x64, 0x44, 0x69, - 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 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, 0xa3, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x4d, 0x0a, 0x0b, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, - 0x3a, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 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, 0x2e, 0x55, 0x73, 0x65, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x63, - 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x69, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xd8, 0x05, 0x0a, 0x0e, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x50, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x53, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x03, 0x6d, 0x69, 0x6e, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, + 0x69, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x67, 0x0a, 0x17, + 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x14, 0x6d, 0x61, 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x61, 0x74, 0x69, 0x6f, 0x1a, 0x40, 0x0a, 0x12, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 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, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 0x61, + 0x78, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0xa8, 0x01, - 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x43, + 0x38, 0x01, 0x1a, 0x36, 0x0a, 0x08, 0x4d, 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, 0x1a, 0x47, 0x0a, 0x19, 0x4d, 0x61, + 0x78, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, + 0x69, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x15, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, + 0x1f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x2c, + 0x0a, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x50, 0x75, 0x6c, 0x6c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x0b, 0x52, 0x6f, 0x6c, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x84, + 0x01, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x65, 0x72, 0x62, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x65, 0x72, 0x62, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x7e, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x07, 0x72, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x66, 0x22, 0x77, 0x0a, 0x12, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, + 0x0a, 0x0d, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x22, 0xe4, 0x02, 0x0a, 0x17, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 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, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x41, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, + 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb5, 0x01, 0x0a, 0x17, + 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 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, 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, 0xab, 0x01, 0x0a, 0x19, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, + 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 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, 0x85, 0x04, 0x0a, 0x18, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 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, 0x42, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x35, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x65, 0x66, 0x12, 0x1b, + 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 0x2e, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x39, + 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 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, + 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, 0xac, 0x01, 0x0a, 0x1a, 0x4b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, @@ -16871,461 +18776,784 @@ var file_api_v1_common_proto_rawDesc = []byte{ 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, 0xc1, 0x02, 0x0a, 0x11, 0x56, 0x6f, 0x6c, - 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 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, 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, 0x8f, - 0x06, 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, 0x27, 0x0a, 0x0f, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x61, 0x64, 0x79, 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, 0xad, - 0x05, 0x0a, 0x20, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, 0x61, 0x72, - 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x75, 0x6e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, 0x18, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x6c, 0x61, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x72, 0x75, - 0x6e, 0x18, 0x0a, 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, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, 0x0a, 0x19, - 0x70, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, - 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x16, 0x70, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, - 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x70, 0x61, 0x73, 0x74, 0x5f, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 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, 0x4a, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 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, 0x52, 0x0f, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xab, - 0x0a, 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, 0x40, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x18, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x6f, 0x6c, - 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 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, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xb3, 0x01, 0x0a, 0x11, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x2e, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6f, + 0x74, 0x68, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0a, 0x4f, 0x74, 0x68, 0x65, 0x72, 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, 0x5c, + 0x0a, 0x14, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x22, 0x7e, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x22, 0xad, 0x06, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, + 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x6c, + 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x27, + 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0x94, 0x04, 0x0a, 0x1a, 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, + 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x6e, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, + 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, + 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5f, + 0x0a, 0x0f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 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, 0x2e, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x44, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 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, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 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, 0xae, 0x01, 0x0a, 0x1c, 0x50, 0x6f, 0x64, + 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, + 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, 0xa3, 0x04, 0x0a, 0x14, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x12, 0x4d, 0x0a, 0x0b, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x68, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x3a, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 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, 0x2e, 0x55, 0x73, + 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x2e, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, 0x61, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x48, 0x61, 0x72, 0x64, 0x4c, 0x69, 0x6d, + 0x69, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, + 0x12, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, + 0xa8, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x51, 0x75, 0x6f, 0x74, + 0x61, 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, 0xc1, 0x02, 0x0a, 0x11, 0x56, + 0x6f, 0x6c, 0x63, 0x61, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 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, 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, 0x8f, 0x06, 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, 0x27, 0x0a, + 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 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, 0xad, 0x05, 0x0a, 0x20, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x53, 0x70, + 0x61, 0x72, 0x6b, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x73, 0x75, 0x73, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x12, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x19, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x52, 0x75, 0x6e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x37, 0x0a, 0x18, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x6c, 0x61, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x35, 0x0a, 0x08, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x72, 0x75, 0x6e, 0x18, 0x0a, 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, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x39, + 0x0a, 0x19, 0x70, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x16, 0x70, 0x61, 0x73, 0x74, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, + 0x6c, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x70, 0x61, 0x73, + 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x73, 0x74, 0x46, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 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, 0x4a, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0e, 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, 0x52, + 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x22, 0xe1, 0x01, 0x0a, 0x14, 0x4b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, + 0x19, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x75, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, + 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, + 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x87, 0x02, 0x0a, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd8, + 0x02, 0x0a, 0x1a, 0x4b, 0x79, 0x76, 0x65, 0x72, 0x6e, 0x6f, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x73, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x66, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x66, 0x61, 0x69, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x77, 0x61, 0x72, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x77, 0x61, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, + 0x69, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x34, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x23, 0x47, 0x61, + 0x74, 0x65, 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x72, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x72, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x70, 0x65, 0x63, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0xd7, 0x01, + 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x02, 0x0a, 0x1b, 0x47, 0x61, 0x74, 0x65, + 0x6b, 0x65, 0x65, 0x70, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x65, + 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x4a, 0x73, + 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x69, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, + 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 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, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x39, 0x0a, 0x0b, 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, 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, 0xe4, 0x01, 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, - 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x77, 0x61, 0x72, 0x6e, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x69, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x5c, 0x0a, 0x0e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0xe9, 0x02, - 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6d, 0x70, 0x52, 0x0e, 0x61, 0x75, 0x64, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x3b, 0x0a, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x8d, 0x0c, 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, 0x40, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x6f, + 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x69, 0x64, 0x12, 0x55, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x15, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x2f, 0x0a, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x64, 0x62, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x50, 0x64, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, + 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, 0x08, 0x6c, 0x61, 0x73, - 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0xc5, 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, + 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, 0x12, 0x2d, 0x0a, 0x10, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x50, + 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, + 0x6f, 0x74, 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, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 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, 0x14, 0x0a, 0x12, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x70, 0x64, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 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, 0xe4, 0x01, 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, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x0e, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x22, 0xe9, 0x02, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x66, 0x66, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, + 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, + 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0xf3, 0x0b, 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, 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, + 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, 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, 0x20, 0x0a, 0x1c, 0x4b, 0x38, + 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4e, + 0x50, 0x47, 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, - 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, 0x20, 0x0a, 0x1c, 0x4b, 0x38, 0x53, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4e, 0x50, 0x47, 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, - 0x12, 0x2f, 0x0a, 0x2b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 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, - 0x25, 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, 0x50, 0x41, 0x52, 0x4b, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x24, 0x12, 0x2f, 0x0a, 0x2b, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 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, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, + 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x59, 0x56, 0x45, 0x52, 0x4e, 0x4f, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x26, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x59, 0x56, 0x45, + 0x52, 0x4e, 0x4f, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, + 0x54, 0x10, 0x27, 0x12, 0x32, 0x0a, 0x2e, 0x4b, 0x38, 0x53, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x4b, 0x45, 0x45, 0x50, 0x45, + 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, 0x5f, 0x54, 0x45, 0x4d, + 0x50, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x28, 0x12, 0x29, 0x0a, 0x25, 0x4b, 0x38, 0x53, 0x5f, 0x4f, + 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x4b, + 0x45, 0x45, 0x50, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, 0x4e, 0x54, + 0x10, 0x29, 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, 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, + 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, 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, 0x89, 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, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, - 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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, + 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x2a, 0xea, 0x03, 0x0a, + 0x15, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x29, 0x0a, 0x25, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, + 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x44, 0x42, 0x5f, 0x56, + 0x49, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x35, 0x0a, 0x31, 0x44, 0x49, + 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x49, 0x53, + 0x52, 0x55, 0x50, 0x54, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x02, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, + 0x0a, 0x1d, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, + 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x55, 0x4e, 0x4e, 0x45, 0x45, 0x44, 0x45, 0x44, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x45, + 0x4e, 0x4f, 0x55, 0x47, 0x48, 0x10, 0x05, 0x12, 0x31, 0x0a, 0x2d, 0x44, 0x49, 0x53, 0x52, 0x55, + 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x4d, + 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x53, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x44, 0x49, + 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x4d, 0x49, 0x4e, 0x41, + 0x54, 0x45, 0x44, 0x10, 0x07, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, + 0x45, 0x54, 0x10, 0x08, 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x50, 0x4f, 0x44, 0x53, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, + 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x09, 0x42, 0x89, 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, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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 ( @@ -17340,455 +19568,485 @@ func file_api_v1_common_proto_rawDescGZIP() []byte { return file_api_v1_common_proto_rawDescData } -var file_api_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 172) +var file_api_v1_common_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_api_v1_common_proto_msgTypes = make([]protoimpl.MessageInfo, 186) var file_api_v1_common_proto_goTypes = []interface{}{ - (K8SObjectKind)(0), // 0: api.v1.K8sObjectKind - (OrderByEnum)(0), // 1: api.v1.OrderByEnum - (LabelSelectorOperator)(0), // 2: api.v1.LabelSelectorOperator - (WorkloadStatusFilter)(0), // 3: api.v1.WorkloadStatusFilter - (*AuditLogEntry)(nil), // 4: api.v1.AuditLogEntry - (*Pagination)(nil), // 5: api.v1.Pagination - (*CostInfo)(nil), // 6: api.v1.CostInfo - (*ResourceMetrics)(nil), // 7: api.v1.ResourceMetrics - (*MetricPercentiles)(nil), // 8: api.v1.MetricPercentiles - (*ContainerPercentileSummary)(nil), // 9: api.v1.ContainerPercentileSummary - (*ContainerRequestLimits)(nil), // 10: api.v1.ContainerRequestLimits - (*ForecastResourceMetrics)(nil), // 11: api.v1.ForecastResourceMetrics - (*ResourceSummary)(nil), // 12: api.v1.ResourceSummary - (*WorkloadItem)(nil), // 13: api.v1.WorkloadItem - (*ContainerRuntimeInfo)(nil), // 14: api.v1.ContainerRuntimeInfo - (*NodeInfo)(nil), // 15: api.v1.NodeInfo - (*ResourceInfo)(nil), // 16: api.v1.ResourceInfo - (*Node)(nil), // 17: api.v1.Node - (*AttachedVolume)(nil), // 18: api.v1.AttachedVolume - (*NodeGroup)(nil), // 19: api.v1.NodeGroup - (*CostDataPoint)(nil), // 20: api.v1.CostDataPoint - (*ResourceDataPoint)(nil), // 21: api.v1.ResourceDataPoint - (*ContainerTimeSeries)(nil), // 22: api.v1.ContainerTimeSeries - (*SavingsData)(nil), // 23: api.v1.SavingsData - (*SavingsDataPoint)(nil), // 24: api.v1.SavingsDataPoint - (*SavingsTimeSeries)(nil), // 25: api.v1.SavingsTimeSeries - (*LabelSelectorRequirement)(nil), // 26: api.v1.LabelSelectorRequirement - (*Label)(nil), // 27: api.v1.Label - (*LabelSelector)(nil), // 28: api.v1.LabelSelector - (*RegexPattern)(nil), // 29: api.v1.RegexPattern - (*ResourceDetails)(nil), // 30: api.v1.ResourceDetails - (*PodDetails)(nil), // 31: api.v1.PodDetails - (*ContainerSummary)(nil), // 32: api.v1.ContainerSummary - (*DeploymentDetails)(nil), // 33: api.v1.DeploymentDetails - (*ContainerTemplate)(nil), // 34: api.v1.ContainerTemplate - (*DeploymentCondition)(nil), // 35: api.v1.DeploymentCondition - (*StatefulSetDetails)(nil), // 36: api.v1.StatefulSetDetails - (*VolumeClaimTemplate)(nil), // 37: api.v1.VolumeClaimTemplate - (*DaemonSetDetails)(nil), // 38: api.v1.DaemonSetDetails - (*ReplicaSetDetails)(nil), // 39: api.v1.ReplicaSetDetails - (*JobDetails)(nil), // 40: api.v1.JobDetails - (*JobCondition)(nil), // 41: api.v1.JobCondition - (*CronJobDetails)(nil), // 42: api.v1.CronJobDetails - (*ActiveJobReference)(nil), // 43: api.v1.ActiveJobReference - (*JobTemplate)(nil), // 44: api.v1.JobTemplate - (*ServiceDetails)(nil), // 45: api.v1.ServiceDetails - (*ServicePort)(nil), // 46: api.v1.ServicePort - (*LoadBalancerIngress)(nil), // 47: api.v1.LoadBalancerIngress - (*IngressDetails)(nil), // 48: api.v1.IngressDetails - (*IngressRule)(nil), // 49: api.v1.IngressRule - (*IngressPath)(nil), // 50: api.v1.IngressPath - (*IngressBackend)(nil), // 51: api.v1.IngressBackend - (*IngressTLS)(nil), // 52: api.v1.IngressTLS - (*PersistentVolumeClaimDetails)(nil), // 53: api.v1.PersistentVolumeClaimDetails - (*ResourceRequirements)(nil), // 54: api.v1.ResourceRequirements - (*VolumeNodeAffinity)(nil), // 55: api.v1.VolumeNodeAffinity - (*PVCCondition)(nil), // 56: api.v1.PVCCondition - (*PersistentVolumeDetails)(nil), // 57: api.v1.PersistentVolumeDetails - (*PVClaimReference)(nil), // 58: api.v1.PVClaimReference - (*PVVolumeSource)(nil), // 59: api.v1.PVVolumeSource - (*CSIVolumeSource)(nil), // 60: api.v1.CSIVolumeSource - (*HostPathVolumeSource)(nil), // 61: api.v1.HostPathVolumeSource - (*NFSVolumeSource)(nil), // 62: api.v1.NFSVolumeSource - (*StorageClassDetails)(nil), // 63: api.v1.StorageClassDetails - (*NamespaceDetails)(nil), // 64: api.v1.NamespaceDetails - (*NodeDetails)(nil), // 65: api.v1.NodeDetails - (*NodeTaint)(nil), // 66: api.v1.NodeTaint - (*NodeAddress)(nil), // 67: api.v1.NodeAddress - (*NodeCondition)(nil), // 68: api.v1.NodeCondition - (*NodeSystemInfo)(nil), // 69: api.v1.NodeSystemInfo - (*NodeImage)(nil), // 70: api.v1.NodeImage - (*TopologySelector)(nil), // 71: api.v1.TopologySelector - (*TopologySelectorTerm)(nil), // 72: api.v1.TopologySelectorTerm - (*TolerationInfo)(nil), // 73: api.v1.TolerationInfo - (*NodeSelector)(nil), // 74: api.v1.NodeSelector - (*NodeSelectorTerm)(nil), // 75: api.v1.NodeSelectorTerm - (*NodeSelectorRequirement)(nil), // 76: api.v1.NodeSelectorRequirement - (*HPADetails)(nil), // 77: api.v1.HPADetails - (*ScaleTargetRef)(nil), // 78: api.v1.ScaleTargetRef - (*HPAMetric)(nil), // 79: api.v1.HPAMetric - (*HPAResourceMetric)(nil), // 80: api.v1.HPAResourceMetric - (*HPAPodsMetric)(nil), // 81: api.v1.HPAPodsMetric - (*HPAObjectMetric)(nil), // 82: api.v1.HPAObjectMetric - (*HPAExternalMetric)(nil), // 83: api.v1.HPAExternalMetric - (*HPAMetricSelector)(nil), // 84: api.v1.HPAMetricSelector - (*HPAObjectReference)(nil), // 85: api.v1.HPAObjectReference - (*HPACurrentMetric)(nil), // 86: api.v1.HPACurrentMetric - (*HPACurrentResourceMetric)(nil), // 87: api.v1.HPACurrentResourceMetric - (*HPACurrentPodsMetric)(nil), // 88: api.v1.HPACurrentPodsMetric - (*HPACurrentObjectMetric)(nil), // 89: api.v1.HPACurrentObjectMetric - (*HPACurrentExternalMetric)(nil), // 90: api.v1.HPACurrentExternalMetric - (*HPACondition)(nil), // 91: api.v1.HPACondition - (*HPABehavior)(nil), // 92: api.v1.HPABehavior - (*HPAScalingRules)(nil), // 93: api.v1.HPAScalingRules - (*HPAScalingPolicy)(nil), // 94: api.v1.HPAScalingPolicy - (*VPADetails)(nil), // 95: api.v1.VPADetails - (*VPATargetRef)(nil), // 96: api.v1.VPATargetRef - (*VPAUpdatePolicy)(nil), // 97: api.v1.VPAUpdatePolicy - (*VPAResourcePolicy)(nil), // 98: api.v1.VPAResourcePolicy - (*VPAContainerResourcePolicy)(nil), // 99: api.v1.VPAContainerResourcePolicy - (*VPARecommendation)(nil), // 100: api.v1.VPARecommendation - (*VPAContainerRecommendation)(nil), // 101: api.v1.VPAContainerRecommendation - (*VPACondition)(nil), // 102: api.v1.VPACondition - (*LimitRangeDetails)(nil), // 103: api.v1.LimitRangeDetails - (*LimitRangeItem)(nil), // 104: api.v1.LimitRangeItem - (*ServiceAccountDetails)(nil), // 105: api.v1.ServiceAccountDetails - (*RoleDetails)(nil), // 106: api.v1.RoleDetails - (*RoleRule)(nil), // 107: api.v1.RoleRule - (*RoleBindingDetails)(nil), // 108: api.v1.RoleBindingDetails - (*RoleBindingSubject)(nil), // 109: api.v1.RoleBindingSubject - (*RoleReference)(nil), // 110: api.v1.RoleReference - (*KedaScaledObjectDetails)(nil), // 111: api.v1.KedaScaledObjectDetails - (*KedaScaledObjectTrigger)(nil), // 112: api.v1.KedaScaledObjectTrigger - (*KedaScaledObjectCondition)(nil), // 113: api.v1.KedaScaledObjectCondition - (*KarpenterResourceDetails)(nil), // 114: api.v1.KarpenterResourceDetails - (*KarpenterResourceCondition)(nil), // 115: api.v1.KarpenterResourceCondition - (*KarpenterCapacity)(nil), // 116: api.v1.KarpenterCapacity - (*KarpenterRequirement)(nil), // 117: api.v1.KarpenterRequirement - (*WorkloadFilters)(nil), // 118: api.v1.WorkloadFilters - (*PodDisruptionBudgetDetails)(nil), // 119: api.v1.PodDisruptionBudgetDetails - (*PodDisruptionBudgetCondition)(nil), // 120: api.v1.PodDisruptionBudgetCondition - (*ResourceQuotaDetails)(nil), // 121: api.v1.ResourceQuotaDetails - (*ResourceQuotaCondition)(nil), // 122: api.v1.ResourceQuotaCondition - (*VolcanoJobDetails)(nil), // 123: api.v1.VolcanoJobDetails - (*VolcanoJobCondition)(nil), // 124: api.v1.VolcanoJobCondition - (*VolcanoTask)(nil), // 125: api.v1.VolcanoTask - (*SparkApplicationDetails)(nil), // 126: api.v1.SparkApplicationDetails - (*SparkDriverInfo)(nil), // 127: api.v1.SparkDriverInfo - (*SparkRestartPolicyInfo)(nil), // 128: api.v1.SparkRestartPolicyInfo - (*SparkDynamicAllocationInfo)(nil), // 129: api.v1.SparkDynamicAllocationInfo - (*ScheduledSparkApplicationDetails)(nil), // 130: api.v1.ScheduledSparkApplicationDetails - (*Event)(nil), // 131: api.v1.Event - (*EventDatapointInfo)(nil), // 132: api.v1.EventDatapointInfo - (*EventDatapoint)(nil), // 133: api.v1.EventDatapoint - (*DimensionCount)(nil), // 134: api.v1.DimensionCount - (*EventGroup)(nil), // 135: api.v1.EventGroup - nil, // 136: api.v1.WorkloadItem.LabelsEntry - nil, // 137: api.v1.WorkloadItem.AnnotationsEntry - nil, // 138: api.v1.NodeInfo.PriceSourceCountsEntry - nil, // 139: api.v1.Node.LabelsEntry - nil, // 140: api.v1.Node.AnnotationsEntry - nil, // 141: api.v1.LabelSelector.MatchLabelsEntry - nil, // 142: api.v1.ResourceDetails.ServiceSelectorEntry - nil, // 143: api.v1.ResourceDetails.ScParametersEntry - nil, // 144: api.v1.ServiceDetails.SelectorEntry - nil, // 145: api.v1.ResourceRequirements.RequestsEntry - nil, // 146: api.v1.ResourceRequirements.LimitsEntry - nil, // 147: api.v1.PersistentVolumeDetails.CapacityEntry - nil, // 148: api.v1.PVVolumeSource.VolumeAttributesEntry - nil, // 149: api.v1.CSIVolumeSource.VolumeAttributesEntry - nil, // 150: api.v1.StorageClassDetails.ParametersEntry - nil, // 151: api.v1.NamespaceDetails.ConditionsEntry - nil, // 152: api.v1.NodeDetails.CapacityEntry - nil, // 153: api.v1.NodeDetails.AllocatableEntry - nil, // 154: api.v1.TopologySelectorTerm.MatchLabelsEntry - nil, // 155: api.v1.HPAMetricSelector.SelectorEntry - nil, // 156: api.v1.VPAContainerResourcePolicy.MinAllowedEntry - nil, // 157: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - nil, // 158: api.v1.VPAContainerRecommendation.TargetEntry - nil, // 159: api.v1.VPAContainerRecommendation.LowerBoundEntry - nil, // 160: api.v1.VPAContainerRecommendation.UpperBoundEntry - nil, // 161: api.v1.VPAContainerRecommendation.UncappedTargetEntry - nil, // 162: api.v1.LimitRangeItem.DefaultLimitsEntry - nil, // 163: api.v1.LimitRangeItem.DefaultRequestEntry - nil, // 164: api.v1.LimitRangeItem.MaxEntry - nil, // 165: api.v1.LimitRangeItem.MinEntry - nil, // 166: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - nil, // 167: api.v1.KedaScaledObjectTrigger.MetadataEntry - nil, // 168: api.v1.KarpenterResourceDetails.LimitsEntry - nil, // 169: api.v1.KarpenterCapacity.OtherEntry - nil, // 170: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - nil, // 171: api.v1.ResourceQuotaDetails.HardLimitsEntry - nil, // 172: api.v1.ResourceQuotaDetails.UsedEntry - nil, // 173: api.v1.ResourceQuotaDetails.ScopeSelectorEntry - nil, // 174: api.v1.Event.AnnotationsEntry - nil, // 175: api.v1.Event.LabelsEntry - (*timestamppb.Timestamp)(nil), // 176: google.protobuf.Timestamp - (*money.Money)(nil), // 177: google.type.Money + (K8SObjectKind)(0), // 0: api.v1.K8sObjectKind + (OrderByEnum)(0), // 1: api.v1.OrderByEnum + (LabelSelectorOperator)(0), // 2: api.v1.LabelSelectorOperator + (WorkloadStatusFilter)(0), // 3: api.v1.WorkloadStatusFilter + (DisruptionBlockReason)(0), // 4: api.v1.DisruptionBlockReason + (*AuditLogEntry)(nil), // 5: api.v1.AuditLogEntry + (*Pagination)(nil), // 6: api.v1.Pagination + (*CostInfo)(nil), // 7: api.v1.CostInfo + (*ResourceMetrics)(nil), // 8: api.v1.ResourceMetrics + (*MetricPercentiles)(nil), // 9: api.v1.MetricPercentiles + (*ContainerPercentileSummary)(nil), // 10: api.v1.ContainerPercentileSummary + (*ContainerRequestLimits)(nil), // 11: api.v1.ContainerRequestLimits + (*GPUMigInstance)(nil), // 12: api.v1.GPUMigInstance + (*IndividualGPUMetric)(nil), // 13: api.v1.IndividualGPUMetric + (*ContainerIndividualGPUMetrics)(nil), // 14: api.v1.ContainerIndividualGPUMetrics + (*RuntimeProcess)(nil), // 15: api.v1.RuntimeProcess + (*ForecastResourceMetrics)(nil), // 16: api.v1.ForecastResourceMetrics + (*ResourceSummary)(nil), // 17: api.v1.ResourceSummary + (*LegacyPolicyRef)(nil), // 18: api.v1.LegacyPolicyRef + (*OptimizationStatus)(nil), // 19: api.v1.OptimizationStatus + (*WorkloadItem)(nil), // 20: api.v1.WorkloadItem + (*ContainerRuntimeInfo)(nil), // 21: api.v1.ContainerRuntimeInfo + (*NodeInfo)(nil), // 22: api.v1.NodeInfo + (*ResourceInfo)(nil), // 23: api.v1.ResourceInfo + (*Node)(nil), // 24: api.v1.Node + (*AttachedVolume)(nil), // 25: api.v1.AttachedVolume + (*NodeGroup)(nil), // 26: api.v1.NodeGroup + (*CostDataPoint)(nil), // 27: api.v1.CostDataPoint + (*ResourceDataPoint)(nil), // 28: api.v1.ResourceDataPoint + (*ContainerTimeSeries)(nil), // 29: api.v1.ContainerTimeSeries + (*SavingsData)(nil), // 30: api.v1.SavingsData + (*SavingsDataPoint)(nil), // 31: api.v1.SavingsDataPoint + (*SavingsTimeSeries)(nil), // 32: api.v1.SavingsTimeSeries + (*LabelSelectorRequirement)(nil), // 33: api.v1.LabelSelectorRequirement + (*Label)(nil), // 34: api.v1.Label + (*LabelSelector)(nil), // 35: api.v1.LabelSelector + (*RegexPattern)(nil), // 36: api.v1.RegexPattern + (*ResourceDetails)(nil), // 37: api.v1.ResourceDetails + (*PodDetails)(nil), // 38: api.v1.PodDetails + (*ContainerSummary)(nil), // 39: api.v1.ContainerSummary + (*DeploymentDetails)(nil), // 40: api.v1.DeploymentDetails + (*ContainerTemplate)(nil), // 41: api.v1.ContainerTemplate + (*DeploymentCondition)(nil), // 42: api.v1.DeploymentCondition + (*StatefulSetDetails)(nil), // 43: api.v1.StatefulSetDetails + (*VolumeClaimTemplate)(nil), // 44: api.v1.VolumeClaimTemplate + (*DaemonSetDetails)(nil), // 45: api.v1.DaemonSetDetails + (*ReplicaSetDetails)(nil), // 46: api.v1.ReplicaSetDetails + (*JobDetails)(nil), // 47: api.v1.JobDetails + (*JobCondition)(nil), // 48: api.v1.JobCondition + (*CronJobDetails)(nil), // 49: api.v1.CronJobDetails + (*ActiveJobReference)(nil), // 50: api.v1.ActiveJobReference + (*JobTemplate)(nil), // 51: api.v1.JobTemplate + (*ServiceDetails)(nil), // 52: api.v1.ServiceDetails + (*ServicePort)(nil), // 53: api.v1.ServicePort + (*LoadBalancerIngress)(nil), // 54: api.v1.LoadBalancerIngress + (*IngressDetails)(nil), // 55: api.v1.IngressDetails + (*IngressRule)(nil), // 56: api.v1.IngressRule + (*IngressPath)(nil), // 57: api.v1.IngressPath + (*IngressBackend)(nil), // 58: api.v1.IngressBackend + (*IngressTLS)(nil), // 59: api.v1.IngressTLS + (*PersistentVolumeClaimDetails)(nil), // 60: api.v1.PersistentVolumeClaimDetails + (*ResourceRequirements)(nil), // 61: api.v1.ResourceRequirements + (*VolumeNodeAffinity)(nil), // 62: api.v1.VolumeNodeAffinity + (*PVCCondition)(nil), // 63: api.v1.PVCCondition + (*PersistentVolumeDetails)(nil), // 64: api.v1.PersistentVolumeDetails + (*PVClaimReference)(nil), // 65: api.v1.PVClaimReference + (*PVVolumeSource)(nil), // 66: api.v1.PVVolumeSource + (*CSIVolumeSource)(nil), // 67: api.v1.CSIVolumeSource + (*HostPathVolumeSource)(nil), // 68: api.v1.HostPathVolumeSource + (*NFSVolumeSource)(nil), // 69: api.v1.NFSVolumeSource + (*StorageClassDetails)(nil), // 70: api.v1.StorageClassDetails + (*NamespaceDetails)(nil), // 71: api.v1.NamespaceDetails + (*NodeDetails)(nil), // 72: api.v1.NodeDetails + (*NodeTaint)(nil), // 73: api.v1.NodeTaint + (*NodeAddress)(nil), // 74: api.v1.NodeAddress + (*NodeCondition)(nil), // 75: api.v1.NodeCondition + (*NodeSystemInfo)(nil), // 76: api.v1.NodeSystemInfo + (*NodeImage)(nil), // 77: api.v1.NodeImage + (*TopologySelector)(nil), // 78: api.v1.TopologySelector + (*TopologySelectorTerm)(nil), // 79: api.v1.TopologySelectorTerm + (*TolerationInfo)(nil), // 80: api.v1.TolerationInfo + (*NodeSelector)(nil), // 81: api.v1.NodeSelector + (*NodeSelectorTerm)(nil), // 82: api.v1.NodeSelectorTerm + (*NodeSelectorRequirement)(nil), // 83: api.v1.NodeSelectorRequirement + (*HPADetails)(nil), // 84: api.v1.HPADetails + (*ScaleTargetRef)(nil), // 85: api.v1.ScaleTargetRef + (*HPAMetric)(nil), // 86: api.v1.HPAMetric + (*HPAResourceMetric)(nil), // 87: api.v1.HPAResourceMetric + (*HPAPodsMetric)(nil), // 88: api.v1.HPAPodsMetric + (*HPAObjectMetric)(nil), // 89: api.v1.HPAObjectMetric + (*HPAExternalMetric)(nil), // 90: api.v1.HPAExternalMetric + (*HPAMetricSelector)(nil), // 91: api.v1.HPAMetricSelector + (*HPAObjectReference)(nil), // 92: api.v1.HPAObjectReference + (*HPACurrentMetric)(nil), // 93: api.v1.HPACurrentMetric + (*HPACurrentResourceMetric)(nil), // 94: api.v1.HPACurrentResourceMetric + (*HPACurrentPodsMetric)(nil), // 95: api.v1.HPACurrentPodsMetric + (*HPACurrentObjectMetric)(nil), // 96: api.v1.HPACurrentObjectMetric + (*HPACurrentExternalMetric)(nil), // 97: api.v1.HPACurrentExternalMetric + (*HPACondition)(nil), // 98: api.v1.HPACondition + (*HPABehavior)(nil), // 99: api.v1.HPABehavior + (*HPAScalingRules)(nil), // 100: api.v1.HPAScalingRules + (*HPAScalingPolicy)(nil), // 101: api.v1.HPAScalingPolicy + (*VPADetails)(nil), // 102: api.v1.VPADetails + (*VPATargetRef)(nil), // 103: api.v1.VPATargetRef + (*VPAUpdatePolicy)(nil), // 104: api.v1.VPAUpdatePolicy + (*VPAResourcePolicy)(nil), // 105: api.v1.VPAResourcePolicy + (*VPAContainerResourcePolicy)(nil), // 106: api.v1.VPAContainerResourcePolicy + (*VPARecommendation)(nil), // 107: api.v1.VPARecommendation + (*VPAContainerRecommendation)(nil), // 108: api.v1.VPAContainerRecommendation + (*VPACondition)(nil), // 109: api.v1.VPACondition + (*LimitRangeDetails)(nil), // 110: api.v1.LimitRangeDetails + (*LimitRangeItem)(nil), // 111: api.v1.LimitRangeItem + (*ServiceAccountDetails)(nil), // 112: api.v1.ServiceAccountDetails + (*RoleDetails)(nil), // 113: api.v1.RoleDetails + (*RoleRule)(nil), // 114: api.v1.RoleRule + (*RoleBindingDetails)(nil), // 115: api.v1.RoleBindingDetails + (*RoleBindingSubject)(nil), // 116: api.v1.RoleBindingSubject + (*RoleReference)(nil), // 117: api.v1.RoleReference + (*KedaScaledObjectDetails)(nil), // 118: api.v1.KedaScaledObjectDetails + (*KedaScaledObjectTrigger)(nil), // 119: api.v1.KedaScaledObjectTrigger + (*KedaScaledObjectCondition)(nil), // 120: api.v1.KedaScaledObjectCondition + (*KarpenterResourceDetails)(nil), // 121: api.v1.KarpenterResourceDetails + (*KarpenterResourceCondition)(nil), // 122: api.v1.KarpenterResourceCondition + (*KarpenterCapacity)(nil), // 123: api.v1.KarpenterCapacity + (*KarpenterRequirement)(nil), // 124: api.v1.KarpenterRequirement + (*ResourceFieldFilter)(nil), // 125: api.v1.ResourceFieldFilter + (*ResourceFilterFieldOptions)(nil), // 126: api.v1.ResourceFilterFieldOptions + (*WorkloadFilters)(nil), // 127: api.v1.WorkloadFilters + (*PodDisruptionBudgetDetails)(nil), // 128: api.v1.PodDisruptionBudgetDetails + (*PodDisruptionBudgetCondition)(nil), // 129: api.v1.PodDisruptionBudgetCondition + (*ResourceQuotaDetails)(nil), // 130: api.v1.ResourceQuotaDetails + (*ResourceQuotaCondition)(nil), // 131: api.v1.ResourceQuotaCondition + (*VolcanoJobDetails)(nil), // 132: api.v1.VolcanoJobDetails + (*VolcanoJobCondition)(nil), // 133: api.v1.VolcanoJobCondition + (*VolcanoTask)(nil), // 134: api.v1.VolcanoTask + (*SparkApplicationDetails)(nil), // 135: api.v1.SparkApplicationDetails + (*SparkDriverInfo)(nil), // 136: api.v1.SparkDriverInfo + (*SparkRestartPolicyInfo)(nil), // 137: api.v1.SparkRestartPolicyInfo + (*SparkDynamicAllocationInfo)(nil), // 138: api.v1.SparkDynamicAllocationInfo + (*ScheduledSparkApplicationDetails)(nil), // 139: api.v1.ScheduledSparkApplicationDetails + (*KyvernoPolicyDetails)(nil), // 140: api.v1.KyvernoPolicyDetails + (*PolicyReportResult)(nil), // 141: api.v1.PolicyReportResult + (*KyvernoPolicyReportDetails)(nil), // 142: api.v1.KyvernoPolicyReportDetails + (*GatekeeperConstraintTemplateDetails)(nil), // 143: api.v1.GatekeeperConstraintTemplateDetails + (*ConstraintViolation)(nil), // 144: api.v1.ConstraintViolation + (*GatekeeperConstraintDetails)(nil), // 145: api.v1.GatekeeperConstraintDetails + (*Event)(nil), // 146: api.v1.Event + (*EventDatapointInfo)(nil), // 147: api.v1.EventDatapointInfo + (*EventDatapoint)(nil), // 148: api.v1.EventDatapoint + (*DimensionCount)(nil), // 149: api.v1.DimensionCount + (*EventGroup)(nil), // 150: api.v1.EventGroup + nil, // 151: api.v1.WorkloadItem.LabelsEntry + nil, // 152: api.v1.WorkloadItem.AnnotationsEntry + nil, // 153: api.v1.NodeInfo.PriceSourceCountsEntry + nil, // 154: api.v1.Node.LabelsEntry + nil, // 155: api.v1.Node.AnnotationsEntry + nil, // 156: api.v1.LabelSelector.MatchLabelsEntry + nil, // 157: api.v1.ResourceDetails.ServiceSelectorEntry + nil, // 158: api.v1.ResourceDetails.ScParametersEntry + nil, // 159: api.v1.ServiceDetails.SelectorEntry + nil, // 160: api.v1.ResourceRequirements.RequestsEntry + nil, // 161: api.v1.ResourceRequirements.LimitsEntry + nil, // 162: api.v1.PersistentVolumeDetails.CapacityEntry + nil, // 163: api.v1.PVVolumeSource.VolumeAttributesEntry + nil, // 164: api.v1.CSIVolumeSource.VolumeAttributesEntry + nil, // 165: api.v1.StorageClassDetails.ParametersEntry + nil, // 166: api.v1.NamespaceDetails.ConditionsEntry + nil, // 167: api.v1.NodeDetails.CapacityEntry + nil, // 168: api.v1.NodeDetails.AllocatableEntry + nil, // 169: api.v1.TopologySelectorTerm.MatchLabelsEntry + nil, // 170: api.v1.HPAMetricSelector.SelectorEntry + nil, // 171: api.v1.VPAContainerResourcePolicy.MinAllowedEntry + nil, // 172: api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + nil, // 173: api.v1.VPAContainerRecommendation.TargetEntry + nil, // 174: api.v1.VPAContainerRecommendation.LowerBoundEntry + nil, // 175: api.v1.VPAContainerRecommendation.UpperBoundEntry + nil, // 176: api.v1.VPAContainerRecommendation.UncappedTargetEntry + nil, // 177: api.v1.LimitRangeItem.DefaultLimitsEntry + nil, // 178: api.v1.LimitRangeItem.DefaultRequestEntry + nil, // 179: api.v1.LimitRangeItem.MaxEntry + nil, // 180: api.v1.LimitRangeItem.MinEntry + nil, // 181: api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + nil, // 182: api.v1.KedaScaledObjectTrigger.MetadataEntry + nil, // 183: api.v1.KarpenterResourceDetails.LimitsEntry + nil, // 184: api.v1.KarpenterCapacity.OtherEntry + nil, // 185: api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + nil, // 186: api.v1.ResourceQuotaDetails.HardLimitsEntry + nil, // 187: api.v1.ResourceQuotaDetails.UsedEntry + nil, // 188: api.v1.ResourceQuotaDetails.ScopeSelectorEntry + nil, // 189: api.v1.Event.AnnotationsEntry + nil, // 190: api.v1.Event.LabelsEntry + (*timestamppb.Timestamp)(nil), // 191: google.protobuf.Timestamp + (*money.Money)(nil), // 192: google.type.Money } var file_api_v1_common_proto_depIdxs = []int32{ 0, // 0: api.v1.AuditLogEntry.workload_type:type_name -> api.v1.K8sObjectKind - 176, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp - 176, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp + 191, // 1: api.v1.AuditLogEntry.created_at:type_name -> google.protobuf.Timestamp + 191, // 2: api.v1.AuditLogEntry.updated_at:type_name -> google.protobuf.Timestamp 1, // 3: api.v1.Pagination.order_by:type_name -> api.v1.OrderByEnum - 177, // 4: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money - 177, // 5: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money - 177, // 6: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money - 177, // 7: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money - 177, // 8: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money - 177, // 9: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money - 177, // 10: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money - 177, // 11: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money - 177, // 12: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money - 177, // 13: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money - 177, // 14: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money - 177, // 15: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money - 177, // 16: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money - 177, // 17: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money - 177, // 18: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money - 177, // 19: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money - 177, // 20: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money - 177, // 21: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money - 177, // 22: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money - 177, // 23: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money - 177, // 24: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money - 177, // 25: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money - 8, // 26: api.v1.ContainerPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles - 8, // 27: api.v1.ContainerPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles - 8, // 28: api.v1.ContainerPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles - 8, // 29: api.v1.ContainerPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles - 8, // 30: api.v1.ContainerPercentileSummary.cpu_limit:type_name -> api.v1.MetricPercentiles - 8, // 31: api.v1.ContainerPercentileSummary.memory_limit:type_name -> api.v1.MetricPercentiles - 8, // 32: api.v1.ContainerPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles - 8, // 33: api.v1.ContainerPercentileSummary.gpu_vram_usage:type_name -> api.v1.MetricPercentiles - 8, // 34: api.v1.ContainerPercentileSummary.network_receive_bytes:type_name -> api.v1.MetricPercentiles - 8, // 35: api.v1.ContainerPercentileSummary.network_transmit_bytes:type_name -> api.v1.MetricPercentiles - 8, // 36: api.v1.ContainerPercentileSummary.fs_read_bytes:type_name -> api.v1.MetricPercentiles - 8, // 37: api.v1.ContainerPercentileSummary.fs_write_bytes:type_name -> api.v1.MetricPercentiles - 176, // 38: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp - 13, // 39: api.v1.WorkloadItem.children:type_name -> api.v1.WorkloadItem - 136, // 40: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry - 137, // 41: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry - 7, // 42: api.v1.WorkloadItem.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 43: api.v1.WorkloadItem.cost_info:type_name -> api.v1.CostInfo - 20, // 44: api.v1.WorkloadItem.cost_data_points:type_name -> api.v1.CostDataPoint - 21, // 45: api.v1.WorkloadItem.resource_data_points:type_name -> api.v1.ResourceDataPoint - 176, // 46: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp - 176, // 47: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp - 30, // 48: api.v1.WorkloadItem.resource_details:type_name -> api.v1.ResourceDetails - 138, // 49: api.v1.NodeInfo.price_source_counts:type_name -> api.v1.NodeInfo.PriceSourceCountsEntry - 7, // 50: api.v1.Node.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 51: api.v1.Node.cost_info:type_name -> api.v1.CostInfo - 14, // 52: api.v1.Node.container_runtime:type_name -> api.v1.ContainerRuntimeInfo - 30, // 53: api.v1.Node.resource_details:type_name -> api.v1.ResourceDetails - 13, // 54: api.v1.Node.children:type_name -> api.v1.WorkloadItem - 139, // 55: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry - 140, // 56: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry - 177, // 57: api.v1.Node.money_price_per_hour:type_name -> google.type.Money - 177, // 58: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money - 177, // 59: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money - 177, // 60: api.v1.Node.money_price_per_gib:type_name -> google.type.Money - 177, // 61: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money - 177, // 62: api.v1.Node.money_cpu_price:type_name -> google.type.Money - 177, // 63: api.v1.Node.money_memory_price:type_name -> google.type.Money - 177, // 64: api.v1.Node.money_gpu_price:type_name -> google.type.Money - 177, // 65: api.v1.Node.money_on_demand_price_per_hour:type_name -> google.type.Money - 18, // 66: api.v1.Node.volumes_attached:type_name -> api.v1.AttachedVolume - 176, // 67: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp - 176, // 68: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp - 176, // 69: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp - 17, // 70: api.v1.NodeGroup.nodes:type_name -> api.v1.Node - 7, // 71: api.v1.NodeGroup.resource_metrics:type_name -> api.v1.ResourceMetrics - 6, // 72: api.v1.NodeGroup.cost_info:type_name -> api.v1.CostInfo - 15, // 73: api.v1.NodeGroup.node_info:type_name -> api.v1.NodeInfo - 16, // 74: api.v1.NodeGroup.resource_info:type_name -> api.v1.ResourceInfo - 20, // 75: api.v1.NodeGroup.cost_data_points:type_name -> api.v1.CostDataPoint - 21, // 76: api.v1.NodeGroup.resource_data_points:type_name -> api.v1.ResourceDataPoint - 6, // 77: api.v1.CostDataPoint.cost_info:type_name -> api.v1.CostInfo - 7, // 78: api.v1.ResourceDataPoint.resource_metrics:type_name -> api.v1.ResourceMetrics - 21, // 79: api.v1.ContainerTimeSeries.resource_data_points:type_name -> api.v1.ResourceDataPoint - 23, // 80: api.v1.SavingsDataPoint.savings_data:type_name -> api.v1.SavingsData - 24, // 81: api.v1.SavingsTimeSeries.savings_datapoints:type_name -> api.v1.SavingsDataPoint - 2, // 82: api.v1.LabelSelectorRequirement.operator:type_name -> api.v1.LabelSelectorOperator - 27, // 83: api.v1.LabelSelector.labels:type_name -> api.v1.Label - 141, // 84: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry - 26, // 85: api.v1.LabelSelector.match_expressions:type_name -> api.v1.LabelSelectorRequirement - 31, // 86: api.v1.ResourceDetails.pod_details:type_name -> api.v1.PodDetails - 33, // 87: api.v1.ResourceDetails.deployment_details:type_name -> api.v1.DeploymentDetails - 36, // 88: api.v1.ResourceDetails.stateful_set_details:type_name -> api.v1.StatefulSetDetails - 38, // 89: api.v1.ResourceDetails.daemon_set_details:type_name -> api.v1.DaemonSetDetails - 39, // 90: api.v1.ResourceDetails.replica_set_details:type_name -> api.v1.ReplicaSetDetails - 40, // 91: api.v1.ResourceDetails.job_details:type_name -> api.v1.JobDetails - 42, // 92: api.v1.ResourceDetails.cron_job_details:type_name -> api.v1.CronJobDetails - 45, // 93: api.v1.ResourceDetails.service_details:type_name -> api.v1.ServiceDetails - 48, // 94: api.v1.ResourceDetails.ingress_details:type_name -> api.v1.IngressDetails - 53, // 95: api.v1.ResourceDetails.pvc_details:type_name -> api.v1.PersistentVolumeClaimDetails - 57, // 96: api.v1.ResourceDetails.pv_details:type_name -> api.v1.PersistentVolumeDetails - 63, // 97: api.v1.ResourceDetails.sc_details:type_name -> api.v1.StorageClassDetails - 64, // 98: api.v1.ResourceDetails.ns_details:type_name -> api.v1.NamespaceDetails - 65, // 99: api.v1.ResourceDetails.node_details:type_name -> api.v1.NodeDetails - 77, // 100: api.v1.ResourceDetails.hpa_details:type_name -> api.v1.HPADetails - 95, // 101: api.v1.ResourceDetails.vpa_details:type_name -> api.v1.VPADetails - 103, // 102: api.v1.ResourceDetails.limit_range_details:type_name -> api.v1.LimitRangeDetails - 105, // 103: api.v1.ResourceDetails.service_account_details:type_name -> api.v1.ServiceAccountDetails - 106, // 104: api.v1.ResourceDetails.role_details:type_name -> api.v1.RoleDetails - 108, // 105: api.v1.ResourceDetails.role_binding_details:type_name -> api.v1.RoleBindingDetails - 111, // 106: api.v1.ResourceDetails.keda_scaled_object_details:type_name -> api.v1.KedaScaledObjectDetails - 114, // 107: api.v1.ResourceDetails.karpenter_resource_details:type_name -> api.v1.KarpenterResourceDetails - 119, // 108: api.v1.ResourceDetails.pod_disruption_budget_details:type_name -> api.v1.PodDisruptionBudgetDetails - 121, // 109: api.v1.ResourceDetails.resource_quota_details:type_name -> api.v1.ResourceQuotaDetails - 123, // 110: api.v1.ResourceDetails.volcano_job_details:type_name -> api.v1.VolcanoJobDetails - 126, // 111: api.v1.ResourceDetails.spark_application_details:type_name -> api.v1.SparkApplicationDetails - 130, // 112: api.v1.ResourceDetails.scheduled_spark_application_details:type_name -> api.v1.ScheduledSparkApplicationDetails - 46, // 113: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort - 142, // 114: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry - 143, // 115: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry - 66, // 116: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint - 32, // 117: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary - 34, // 118: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate - 35, // 119: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition - 34, // 120: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate - 37, // 121: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate - 34, // 122: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate - 73, // 123: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo - 74, // 124: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector - 34, // 125: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate - 28, // 126: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector - 34, // 127: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate - 41, // 128: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition - 28, // 129: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector - 34, // 130: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate - 43, // 131: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference - 44, // 132: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate - 34, // 133: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate - 46, // 134: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort - 144, // 135: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry - 47, // 136: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 49, // 137: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule - 52, // 138: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS - 51, // 139: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend - 47, // 140: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress - 50, // 141: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath - 51, // 142: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend - 54, // 143: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements - 28, // 144: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector - 55, // 145: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity - 56, // 146: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition - 145, // 147: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry - 146, // 148: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry - 76, // 149: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement - 76, // 150: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement - 147, // 151: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry - 58, // 152: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference - 59, // 153: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource - 74, // 154: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector - 60, // 155: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource - 61, // 156: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource - 62, // 157: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource - 148, // 158: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry - 149, // 159: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry - 150, // 160: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry - 71, // 161: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector - 151, // 162: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry - 67, // 163: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress - 68, // 164: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition - 69, // 165: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo - 152, // 166: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry - 153, // 167: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry - 70, // 168: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage - 72, // 169: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm - 154, // 170: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry - 75, // 171: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm - 76, // 172: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement - 76, // 173: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement - 78, // 174: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef - 79, // 175: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric - 91, // 176: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition - 92, // 177: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior - 86, // 178: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric - 80, // 179: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric - 81, // 180: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric - 82, // 181: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric - 83, // 182: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric - 84, // 183: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 85, // 184: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 84, // 185: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 84, // 186: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 155, // 187: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry - 87, // 188: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric - 88, // 189: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric - 89, // 190: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric - 90, // 191: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric - 84, // 192: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector - 85, // 193: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference - 84, // 194: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector - 84, // 195: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector - 93, // 196: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules - 93, // 197: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules - 94, // 198: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy - 96, // 199: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef - 97, // 200: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy - 98, // 201: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy - 100, // 202: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation - 102, // 203: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition - 99, // 204: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy - 156, // 205: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry - 157, // 206: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry - 101, // 207: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation - 158, // 208: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry - 159, // 209: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry - 160, // 210: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry - 161, // 211: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry - 104, // 212: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem - 162, // 213: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry - 163, // 214: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry - 164, // 215: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry - 165, // 216: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry - 166, // 217: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry - 107, // 218: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule - 109, // 219: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject - 110, // 220: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference - 112, // 221: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger - 113, // 222: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition - 167, // 223: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry - 115, // 224: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition - 116, // 225: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity - 117, // 226: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement - 168, // 227: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry - 169, // 228: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry - 28, // 229: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector - 28, // 230: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector - 0, // 231: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 29, // 232: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern - 28, // 233: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector - 3, // 234: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter - 170, // 235: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry - 120, // 236: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition - 171, // 237: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry - 172, // 238: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry - 173, // 239: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry - 122, // 240: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition - 34, // 241: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate - 124, // 242: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition - 125, // 243: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask - 34, // 244: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate - 34, // 245: api.v1.SparkApplicationDetails.containers:type_name -> api.v1.ContainerTemplate - 127, // 246: api.v1.SparkApplicationDetails.spark_driver_info:type_name -> api.v1.SparkDriverInfo - 128, // 247: api.v1.SparkApplicationDetails.restart_policy:type_name -> api.v1.SparkRestartPolicyInfo - 129, // 248: api.v1.SparkApplicationDetails.dynamic_allocation:type_name -> api.v1.SparkDynamicAllocationInfo - 176, // 249: api.v1.ScheduledSparkApplicationDetails.last_run:type_name -> google.protobuf.Timestamp - 176, // 250: api.v1.ScheduledSparkApplicationDetails.next_run:type_name -> google.protobuf.Timestamp - 126, // 251: api.v1.ScheduledSparkApplicationDetails.template_details:type_name -> api.v1.SparkApplicationDetails - 174, // 252: api.v1.Event.annotations:type_name -> api.v1.Event.AnnotationsEntry - 175, // 253: api.v1.Event.labels:type_name -> api.v1.Event.LabelsEntry - 176, // 254: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp - 176, // 255: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp - 176, // 256: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp - 176, // 257: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp - 132, // 258: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo - 176, // 259: api.v1.EventGroup.first_seen:type_name -> google.protobuf.Timestamp - 176, // 260: api.v1.EventGroup.last_seen:type_name -> google.protobuf.Timestamp - 261, // [261:261] is the sub-list for method output_type - 261, // [261:261] is the sub-list for method input_type - 261, // [261:261] is the sub-list for extension type_name - 261, // [261:261] is the sub-list for extension extendee - 0, // [0:261] is the sub-list for field type_name + 192, // 4: api.v1.CostInfo.money_cpu_cost_per_hour:type_name -> google.type.Money + 192, // 5: api.v1.CostInfo.money_memory_cost_per_hour:type_name -> google.type.Money + 192, // 6: api.v1.CostInfo.money_total_cost_per_hour:type_name -> google.type.Money + 192, // 7: api.v1.CostInfo.money_total_cost_per_month:type_name -> google.type.Money + 192, // 8: api.v1.CostInfo.money_total_cost_per_year:type_name -> google.type.Money + 192, // 9: api.v1.CostInfo.money_optimized_cpu_cost_per_hour:type_name -> google.type.Money + 192, // 10: api.v1.CostInfo.money_optimized_memory_cost_per_hour:type_name -> google.type.Money + 192, // 11: api.v1.CostInfo.money_optimized_total_cost_per_hour:type_name -> google.type.Money + 192, // 12: api.v1.CostInfo.money_optimized_total_cost_per_month:type_name -> google.type.Money + 192, // 13: api.v1.CostInfo.money_optimized_total_cost_per_year:type_name -> google.type.Money + 192, // 14: api.v1.CostInfo.money_cpu_cost_for_time_period:type_name -> google.type.Money + 192, // 15: api.v1.CostInfo.money_memory_cost_for_time_period:type_name -> google.type.Money + 192, // 16: api.v1.CostInfo.money_total_cost_for_time_period:type_name -> google.type.Money + 192, // 17: api.v1.CostInfo.money_network_cost_for_time_period:type_name -> google.type.Money + 192, // 18: api.v1.CostInfo.money_optimized_cpu_cost_for_time_period:type_name -> google.type.Money + 192, // 19: api.v1.CostInfo.money_optimized_memory_cost_for_time_period:type_name -> google.type.Money + 192, // 20: api.v1.CostInfo.money_optimized_total_cost_for_time_period:type_name -> google.type.Money + 192, // 21: api.v1.CostInfo.money_optimized_gpu_cost_for_time_period:type_name -> google.type.Money + 192, // 22: api.v1.CostInfo.money_gpu_cost_for_time_period:type_name -> google.type.Money + 192, // 23: api.v1.CostInfo.money_gpu_cost_per_hour:type_name -> google.type.Money + 192, // 24: api.v1.CostInfo.money_optimized_gpu_cost_per_hour:type_name -> google.type.Money + 192, // 25: api.v1.CostInfo.money_cpu_cost_per_vcpu_per_hour:type_name -> google.type.Money + 192, // 26: api.v1.CostInfo.money_memory_cost_per_gib_per_hour:type_name -> google.type.Money + 9, // 27: api.v1.ContainerPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles + 9, // 28: api.v1.ContainerPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles + 9, // 29: api.v1.ContainerPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles + 9, // 30: api.v1.ContainerPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles + 9, // 31: api.v1.ContainerPercentileSummary.cpu_limit:type_name -> api.v1.MetricPercentiles + 9, // 32: api.v1.ContainerPercentileSummary.memory_limit:type_name -> api.v1.MetricPercentiles + 9, // 33: api.v1.ContainerPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles + 9, // 34: api.v1.ContainerPercentileSummary.gpu_vram_usage:type_name -> api.v1.MetricPercentiles + 9, // 35: api.v1.ContainerPercentileSummary.network_receive_bytes:type_name -> api.v1.MetricPercentiles + 9, // 36: api.v1.ContainerPercentileSummary.network_transmit_bytes:type_name -> api.v1.MetricPercentiles + 9, // 37: api.v1.ContainerPercentileSummary.fs_read_bytes:type_name -> api.v1.MetricPercentiles + 9, // 38: api.v1.ContainerPercentileSummary.fs_write_bytes:type_name -> api.v1.MetricPercentiles + 15, // 39: api.v1.ContainerRequestLimits.runtime_processes:type_name -> api.v1.RuntimeProcess + 13, // 40: api.v1.ContainerIndividualGPUMetrics.instances:type_name -> api.v1.IndividualGPUMetric + 191, // 41: api.v1.ContainerIndividualGPUMetrics.collected_at:type_name -> google.protobuf.Timestamp + 191, // 42: api.v1.ForecastResourceMetrics.timestamp:type_name -> google.protobuf.Timestamp + 18, // 43: api.v1.OptimizationStatus.legacy_policies:type_name -> api.v1.LegacyPolicyRef + 20, // 44: api.v1.WorkloadItem.children:type_name -> api.v1.WorkloadItem + 151, // 45: api.v1.WorkloadItem.labels:type_name -> api.v1.WorkloadItem.LabelsEntry + 152, // 46: api.v1.WorkloadItem.annotations:type_name -> api.v1.WorkloadItem.AnnotationsEntry + 8, // 47: api.v1.WorkloadItem.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 48: api.v1.WorkloadItem.cost_info:type_name -> api.v1.CostInfo + 27, // 49: api.v1.WorkloadItem.cost_data_points:type_name -> api.v1.CostDataPoint + 28, // 50: api.v1.WorkloadItem.resource_data_points:type_name -> api.v1.ResourceDataPoint + 191, // 51: api.v1.WorkloadItem.created_at:type_name -> google.protobuf.Timestamp + 191, // 52: api.v1.WorkloadItem.deleted_at:type_name -> google.protobuf.Timestamp + 37, // 53: api.v1.WorkloadItem.resource_details:type_name -> api.v1.ResourceDetails + 19, // 54: api.v1.WorkloadItem.optimization_status:type_name -> api.v1.OptimizationStatus + 153, // 55: api.v1.NodeInfo.price_source_counts:type_name -> api.v1.NodeInfo.PriceSourceCountsEntry + 8, // 56: api.v1.Node.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 57: api.v1.Node.cost_info:type_name -> api.v1.CostInfo + 21, // 58: api.v1.Node.container_runtime:type_name -> api.v1.ContainerRuntimeInfo + 37, // 59: api.v1.Node.resource_details:type_name -> api.v1.ResourceDetails + 20, // 60: api.v1.Node.children:type_name -> api.v1.WorkloadItem + 154, // 61: api.v1.Node.labels:type_name -> api.v1.Node.LabelsEntry + 155, // 62: api.v1.Node.annotations:type_name -> api.v1.Node.AnnotationsEntry + 192, // 63: api.v1.Node.money_price_per_hour:type_name -> google.type.Money + 192, // 64: api.v1.Node.money_eff_period_total_cost:type_name -> google.type.Money + 192, // 65: api.v1.Node.money_price_per_vcpu:type_name -> google.type.Money + 192, // 66: api.v1.Node.money_price_per_gib:type_name -> google.type.Money + 192, // 67: api.v1.Node.money_price_per_gpu:type_name -> google.type.Money + 192, // 68: api.v1.Node.money_cpu_price:type_name -> google.type.Money + 192, // 69: api.v1.Node.money_memory_price:type_name -> google.type.Money + 192, // 70: api.v1.Node.money_gpu_price:type_name -> google.type.Money + 192, // 71: api.v1.Node.money_on_demand_price_per_hour:type_name -> google.type.Money + 25, // 72: api.v1.Node.volumes_attached:type_name -> api.v1.AttachedVolume + 191, // 73: api.v1.Node.last_seen:type_name -> google.protobuf.Timestamp + 191, // 74: api.v1.Node.collected_at:type_name -> google.protobuf.Timestamp + 191, // 75: api.v1.Node.deletion_timestamp:type_name -> google.protobuf.Timestamp + 24, // 76: api.v1.NodeGroup.nodes:type_name -> api.v1.Node + 8, // 77: api.v1.NodeGroup.resource_metrics:type_name -> api.v1.ResourceMetrics + 7, // 78: api.v1.NodeGroup.cost_info:type_name -> api.v1.CostInfo + 22, // 79: api.v1.NodeGroup.node_info:type_name -> api.v1.NodeInfo + 23, // 80: api.v1.NodeGroup.resource_info:type_name -> api.v1.ResourceInfo + 27, // 81: api.v1.NodeGroup.cost_data_points:type_name -> api.v1.CostDataPoint + 28, // 82: api.v1.NodeGroup.resource_data_points:type_name -> api.v1.ResourceDataPoint + 7, // 83: api.v1.CostDataPoint.cost_info:type_name -> api.v1.CostInfo + 8, // 84: api.v1.ResourceDataPoint.resource_metrics:type_name -> api.v1.ResourceMetrics + 28, // 85: api.v1.ContainerTimeSeries.resource_data_points:type_name -> api.v1.ResourceDataPoint + 30, // 86: api.v1.SavingsDataPoint.savings_data:type_name -> api.v1.SavingsData + 31, // 87: api.v1.SavingsTimeSeries.savings_datapoints:type_name -> api.v1.SavingsDataPoint + 2, // 88: api.v1.LabelSelectorRequirement.operator:type_name -> api.v1.LabelSelectorOperator + 34, // 89: api.v1.LabelSelector.labels:type_name -> api.v1.Label + 156, // 90: api.v1.LabelSelector.match_labels:type_name -> api.v1.LabelSelector.MatchLabelsEntry + 33, // 91: api.v1.LabelSelector.match_expressions:type_name -> api.v1.LabelSelectorRequirement + 38, // 92: api.v1.ResourceDetails.pod_details:type_name -> api.v1.PodDetails + 40, // 93: api.v1.ResourceDetails.deployment_details:type_name -> api.v1.DeploymentDetails + 43, // 94: api.v1.ResourceDetails.stateful_set_details:type_name -> api.v1.StatefulSetDetails + 45, // 95: api.v1.ResourceDetails.daemon_set_details:type_name -> api.v1.DaemonSetDetails + 46, // 96: api.v1.ResourceDetails.replica_set_details:type_name -> api.v1.ReplicaSetDetails + 47, // 97: api.v1.ResourceDetails.job_details:type_name -> api.v1.JobDetails + 49, // 98: api.v1.ResourceDetails.cron_job_details:type_name -> api.v1.CronJobDetails + 52, // 99: api.v1.ResourceDetails.service_details:type_name -> api.v1.ServiceDetails + 55, // 100: api.v1.ResourceDetails.ingress_details:type_name -> api.v1.IngressDetails + 60, // 101: api.v1.ResourceDetails.pvc_details:type_name -> api.v1.PersistentVolumeClaimDetails + 64, // 102: api.v1.ResourceDetails.pv_details:type_name -> api.v1.PersistentVolumeDetails + 70, // 103: api.v1.ResourceDetails.sc_details:type_name -> api.v1.StorageClassDetails + 71, // 104: api.v1.ResourceDetails.ns_details:type_name -> api.v1.NamespaceDetails + 72, // 105: api.v1.ResourceDetails.node_details:type_name -> api.v1.NodeDetails + 84, // 106: api.v1.ResourceDetails.hpa_details:type_name -> api.v1.HPADetails + 102, // 107: api.v1.ResourceDetails.vpa_details:type_name -> api.v1.VPADetails + 110, // 108: api.v1.ResourceDetails.limit_range_details:type_name -> api.v1.LimitRangeDetails + 112, // 109: api.v1.ResourceDetails.service_account_details:type_name -> api.v1.ServiceAccountDetails + 113, // 110: api.v1.ResourceDetails.role_details:type_name -> api.v1.RoleDetails + 115, // 111: api.v1.ResourceDetails.role_binding_details:type_name -> api.v1.RoleBindingDetails + 118, // 112: api.v1.ResourceDetails.keda_scaled_object_details:type_name -> api.v1.KedaScaledObjectDetails + 121, // 113: api.v1.ResourceDetails.karpenter_resource_details:type_name -> api.v1.KarpenterResourceDetails + 128, // 114: api.v1.ResourceDetails.pod_disruption_budget_details:type_name -> api.v1.PodDisruptionBudgetDetails + 130, // 115: api.v1.ResourceDetails.resource_quota_details:type_name -> api.v1.ResourceQuotaDetails + 132, // 116: api.v1.ResourceDetails.volcano_job_details:type_name -> api.v1.VolcanoJobDetails + 135, // 117: api.v1.ResourceDetails.spark_application_details:type_name -> api.v1.SparkApplicationDetails + 139, // 118: api.v1.ResourceDetails.scheduled_spark_application_details:type_name -> api.v1.ScheduledSparkApplicationDetails + 140, // 119: api.v1.ResourceDetails.kyverno_policy_details:type_name -> api.v1.KyvernoPolicyDetails + 142, // 120: api.v1.ResourceDetails.kyverno_policy_report_details:type_name -> api.v1.KyvernoPolicyReportDetails + 143, // 121: api.v1.ResourceDetails.gatekeeper_constraint_template_details:type_name -> api.v1.GatekeeperConstraintTemplateDetails + 145, // 122: api.v1.ResourceDetails.gatekeeper_constraint_details:type_name -> api.v1.GatekeeperConstraintDetails + 53, // 123: api.v1.ResourceDetails.service_ports:type_name -> api.v1.ServicePort + 157, // 124: api.v1.ResourceDetails.service_selector:type_name -> api.v1.ResourceDetails.ServiceSelectorEntry + 158, // 125: api.v1.ResourceDetails.sc_parameters:type_name -> api.v1.ResourceDetails.ScParametersEntry + 73, // 126: api.v1.ResourceDetails.node_taints:type_name -> api.v1.NodeTaint + 39, // 127: api.v1.PodDetails.containers:type_name -> api.v1.ContainerSummary + 41, // 128: api.v1.DeploymentDetails.containers:type_name -> api.v1.ContainerTemplate + 42, // 129: api.v1.DeploymentDetails.conditions:type_name -> api.v1.DeploymentCondition + 41, // 130: api.v1.StatefulSetDetails.containers:type_name -> api.v1.ContainerTemplate + 44, // 131: api.v1.StatefulSetDetails.volume_claim_templates:type_name -> api.v1.VolumeClaimTemplate + 41, // 132: api.v1.DaemonSetDetails.containers:type_name -> api.v1.ContainerTemplate + 80, // 133: api.v1.DaemonSetDetails.tolerations:type_name -> api.v1.TolerationInfo + 81, // 134: api.v1.DaemonSetDetails.node_selector:type_name -> api.v1.NodeSelector + 41, // 135: api.v1.ReplicaSetDetails.containers:type_name -> api.v1.ContainerTemplate + 35, // 136: api.v1.ReplicaSetDetails.selector:type_name -> api.v1.LabelSelector + 41, // 137: api.v1.JobDetails.containers:type_name -> api.v1.ContainerTemplate + 48, // 138: api.v1.JobDetails.conditions:type_name -> api.v1.JobCondition + 35, // 139: api.v1.JobDetails.selector:type_name -> api.v1.LabelSelector + 41, // 140: api.v1.CronJobDetails.containers:type_name -> api.v1.ContainerTemplate + 50, // 141: api.v1.CronJobDetails.active_jobs:type_name -> api.v1.ActiveJobReference + 51, // 142: api.v1.CronJobDetails.job_template:type_name -> api.v1.JobTemplate + 41, // 143: api.v1.JobTemplate.containers:type_name -> api.v1.ContainerTemplate + 53, // 144: api.v1.ServiceDetails.ports:type_name -> api.v1.ServicePort + 159, // 145: api.v1.ServiceDetails.selector:type_name -> api.v1.ServiceDetails.SelectorEntry + 54, // 146: api.v1.ServiceDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 56, // 147: api.v1.IngressDetails.rules:type_name -> api.v1.IngressRule + 59, // 148: api.v1.IngressDetails.tls:type_name -> api.v1.IngressTLS + 58, // 149: api.v1.IngressDetails.default_backend:type_name -> api.v1.IngressBackend + 54, // 150: api.v1.IngressDetails.load_balancer_ingress:type_name -> api.v1.LoadBalancerIngress + 57, // 151: api.v1.IngressRule.paths:type_name -> api.v1.IngressPath + 58, // 152: api.v1.IngressPath.backend:type_name -> api.v1.IngressBackend + 61, // 153: api.v1.PersistentVolumeClaimDetails.resource_requirements:type_name -> api.v1.ResourceRequirements + 35, // 154: api.v1.PersistentVolumeClaimDetails.selector:type_name -> api.v1.LabelSelector + 62, // 155: api.v1.PersistentVolumeClaimDetails.volume_node_affinity:type_name -> api.v1.VolumeNodeAffinity + 63, // 156: api.v1.PersistentVolumeClaimDetails.conditions:type_name -> api.v1.PVCCondition + 160, // 157: api.v1.ResourceRequirements.requests:type_name -> api.v1.ResourceRequirements.RequestsEntry + 161, // 158: api.v1.ResourceRequirements.limits:type_name -> api.v1.ResourceRequirements.LimitsEntry + 83, // 159: api.v1.VolumeNodeAffinity.required:type_name -> api.v1.NodeSelectorRequirement + 83, // 160: api.v1.VolumeNodeAffinity.preferred:type_name -> api.v1.NodeSelectorRequirement + 162, // 161: api.v1.PersistentVolumeDetails.capacity:type_name -> api.v1.PersistentVolumeDetails.CapacityEntry + 65, // 162: api.v1.PersistentVolumeDetails.claim_ref:type_name -> api.v1.PVClaimReference + 66, // 163: api.v1.PersistentVolumeDetails.volume_source:type_name -> api.v1.PVVolumeSource + 81, // 164: api.v1.PersistentVolumeDetails.node_affinity:type_name -> api.v1.NodeSelector + 67, // 165: api.v1.PVVolumeSource.csi:type_name -> api.v1.CSIVolumeSource + 68, // 166: api.v1.PVVolumeSource.host_path:type_name -> api.v1.HostPathVolumeSource + 69, // 167: api.v1.PVVolumeSource.nfs:type_name -> api.v1.NFSVolumeSource + 163, // 168: api.v1.PVVolumeSource.volume_attributes:type_name -> api.v1.PVVolumeSource.VolumeAttributesEntry + 164, // 169: api.v1.CSIVolumeSource.volume_attributes:type_name -> api.v1.CSIVolumeSource.VolumeAttributesEntry + 165, // 170: api.v1.StorageClassDetails.parameters:type_name -> api.v1.StorageClassDetails.ParametersEntry + 78, // 171: api.v1.StorageClassDetails.allowed_topologies:type_name -> api.v1.TopologySelector + 166, // 172: api.v1.NamespaceDetails.conditions:type_name -> api.v1.NamespaceDetails.ConditionsEntry + 74, // 173: api.v1.NodeDetails.addresses:type_name -> api.v1.NodeAddress + 75, // 174: api.v1.NodeDetails.conditions:type_name -> api.v1.NodeCondition + 76, // 175: api.v1.NodeDetails.system_info:type_name -> api.v1.NodeSystemInfo + 167, // 176: api.v1.NodeDetails.capacity:type_name -> api.v1.NodeDetails.CapacityEntry + 168, // 177: api.v1.NodeDetails.allocatable:type_name -> api.v1.NodeDetails.AllocatableEntry + 77, // 178: api.v1.NodeDetails.images:type_name -> api.v1.NodeImage + 79, // 179: api.v1.TopologySelector.match_label_expressions:type_name -> api.v1.TopologySelectorTerm + 169, // 180: api.v1.TopologySelectorTerm.match_labels:type_name -> api.v1.TopologySelectorTerm.MatchLabelsEntry + 82, // 181: api.v1.NodeSelector.terms:type_name -> api.v1.NodeSelectorTerm + 83, // 182: api.v1.NodeSelectorTerm.match_expressions:type_name -> api.v1.NodeSelectorRequirement + 83, // 183: api.v1.NodeSelectorTerm.match_fields:type_name -> api.v1.NodeSelectorRequirement + 85, // 184: api.v1.HPADetails.scale_target_ref:type_name -> api.v1.ScaleTargetRef + 86, // 185: api.v1.HPADetails.metrics:type_name -> api.v1.HPAMetric + 98, // 186: api.v1.HPADetails.conditions:type_name -> api.v1.HPACondition + 99, // 187: api.v1.HPADetails.behavior:type_name -> api.v1.HPABehavior + 93, // 188: api.v1.HPADetails.current_metrics:type_name -> api.v1.HPACurrentMetric + 87, // 189: api.v1.HPAMetric.resource:type_name -> api.v1.HPAResourceMetric + 88, // 190: api.v1.HPAMetric.pods:type_name -> api.v1.HPAPodsMetric + 89, // 191: api.v1.HPAMetric.object:type_name -> api.v1.HPAObjectMetric + 90, // 192: api.v1.HPAMetric.external:type_name -> api.v1.HPAExternalMetric + 91, // 193: api.v1.HPAPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 92, // 194: api.v1.HPAObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 91, // 195: api.v1.HPAObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 91, // 196: api.v1.HPAExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 170, // 197: api.v1.HPAMetricSelector.selector:type_name -> api.v1.HPAMetricSelector.SelectorEntry + 94, // 198: api.v1.HPACurrentMetric.resource:type_name -> api.v1.HPACurrentResourceMetric + 95, // 199: api.v1.HPACurrentMetric.pods:type_name -> api.v1.HPACurrentPodsMetric + 96, // 200: api.v1.HPACurrentMetric.object:type_name -> api.v1.HPACurrentObjectMetric + 97, // 201: api.v1.HPACurrentMetric.external:type_name -> api.v1.HPACurrentExternalMetric + 91, // 202: api.v1.HPACurrentPodsMetric.metric:type_name -> api.v1.HPAMetricSelector + 92, // 203: api.v1.HPACurrentObjectMetric.described_object:type_name -> api.v1.HPAObjectReference + 91, // 204: api.v1.HPACurrentObjectMetric.metric:type_name -> api.v1.HPAMetricSelector + 91, // 205: api.v1.HPACurrentExternalMetric.metric:type_name -> api.v1.HPAMetricSelector + 100, // 206: api.v1.HPABehavior.scale_up:type_name -> api.v1.HPAScalingRules + 100, // 207: api.v1.HPABehavior.scale_down:type_name -> api.v1.HPAScalingRules + 101, // 208: api.v1.HPAScalingRules.policies:type_name -> api.v1.HPAScalingPolicy + 103, // 209: api.v1.VPADetails.target_ref:type_name -> api.v1.VPATargetRef + 104, // 210: api.v1.VPADetails.update_policy:type_name -> api.v1.VPAUpdatePolicy + 105, // 211: api.v1.VPADetails.resource_policy:type_name -> api.v1.VPAResourcePolicy + 107, // 212: api.v1.VPADetails.recommendation:type_name -> api.v1.VPARecommendation + 109, // 213: api.v1.VPADetails.conditions:type_name -> api.v1.VPACondition + 106, // 214: api.v1.VPAResourcePolicy.container_policies:type_name -> api.v1.VPAContainerResourcePolicy + 171, // 215: api.v1.VPAContainerResourcePolicy.min_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MinAllowedEntry + 172, // 216: api.v1.VPAContainerResourcePolicy.max_allowed:type_name -> api.v1.VPAContainerResourcePolicy.MaxAllowedEntry + 108, // 217: api.v1.VPARecommendation.container_recommendations:type_name -> api.v1.VPAContainerRecommendation + 173, // 218: api.v1.VPAContainerRecommendation.target:type_name -> api.v1.VPAContainerRecommendation.TargetEntry + 174, // 219: api.v1.VPAContainerRecommendation.lower_bound:type_name -> api.v1.VPAContainerRecommendation.LowerBoundEntry + 175, // 220: api.v1.VPAContainerRecommendation.upper_bound:type_name -> api.v1.VPAContainerRecommendation.UpperBoundEntry + 176, // 221: api.v1.VPAContainerRecommendation.uncapped_target:type_name -> api.v1.VPAContainerRecommendation.UncappedTargetEntry + 111, // 222: api.v1.LimitRangeDetails.limits:type_name -> api.v1.LimitRangeItem + 177, // 223: api.v1.LimitRangeItem.default_limits:type_name -> api.v1.LimitRangeItem.DefaultLimitsEntry + 178, // 224: api.v1.LimitRangeItem.default_request:type_name -> api.v1.LimitRangeItem.DefaultRequestEntry + 179, // 225: api.v1.LimitRangeItem.max:type_name -> api.v1.LimitRangeItem.MaxEntry + 180, // 226: api.v1.LimitRangeItem.min:type_name -> api.v1.LimitRangeItem.MinEntry + 181, // 227: api.v1.LimitRangeItem.max_limit_request_ratio:type_name -> api.v1.LimitRangeItem.MaxLimitRequestRatioEntry + 114, // 228: api.v1.RoleDetails.rules:type_name -> api.v1.RoleRule + 116, // 229: api.v1.RoleBindingDetails.subjects:type_name -> api.v1.RoleBindingSubject + 117, // 230: api.v1.RoleBindingDetails.role_ref:type_name -> api.v1.RoleReference + 119, // 231: api.v1.KedaScaledObjectDetails.triggers:type_name -> api.v1.KedaScaledObjectTrigger + 120, // 232: api.v1.KedaScaledObjectDetails.conditions:type_name -> api.v1.KedaScaledObjectCondition + 182, // 233: api.v1.KedaScaledObjectTrigger.metadata:type_name -> api.v1.KedaScaledObjectTrigger.MetadataEntry + 122, // 234: api.v1.KarpenterResourceDetails.conditions:type_name -> api.v1.KarpenterResourceCondition + 123, // 235: api.v1.KarpenterResourceDetails.capacity:type_name -> api.v1.KarpenterCapacity + 124, // 236: api.v1.KarpenterResourceDetails.requirements:type_name -> api.v1.KarpenterRequirement + 183, // 237: api.v1.KarpenterResourceDetails.limits:type_name -> api.v1.KarpenterResourceDetails.LimitsEntry + 184, // 238: api.v1.KarpenterCapacity.other:type_name -> api.v1.KarpenterCapacity.OtherEntry + 35, // 239: api.v1.WorkloadFilters.namespace_selector:type_name -> api.v1.LabelSelector + 35, // 240: api.v1.WorkloadFilters.workload_selector:type_name -> api.v1.LabelSelector + 0, // 241: api.v1.WorkloadFilters.kind_filter:type_name -> api.v1.K8sObjectKind + 36, // 242: api.v1.WorkloadFilters.name_pattern:type_name -> api.v1.RegexPattern + 35, // 243: api.v1.WorkloadFilters.annotation_selector:type_name -> api.v1.LabelSelector + 36, // 244: api.v1.WorkloadFilters.namespace_pattern:type_name -> api.v1.RegexPattern + 3, // 245: api.v1.WorkloadFilters.status:type_name -> api.v1.WorkloadStatusFilter + 185, // 246: api.v1.PodDisruptionBudgetDetails.selector_labels:type_name -> api.v1.PodDisruptionBudgetDetails.SelectorLabelsEntry + 129, // 247: api.v1.PodDisruptionBudgetDetails.conditions:type_name -> api.v1.PodDisruptionBudgetCondition + 186, // 248: api.v1.ResourceQuotaDetails.hard_limits:type_name -> api.v1.ResourceQuotaDetails.HardLimitsEntry + 187, // 249: api.v1.ResourceQuotaDetails.used:type_name -> api.v1.ResourceQuotaDetails.UsedEntry + 188, // 250: api.v1.ResourceQuotaDetails.scope_selector:type_name -> api.v1.ResourceQuotaDetails.ScopeSelectorEntry + 131, // 251: api.v1.ResourceQuotaDetails.conditions:type_name -> api.v1.ResourceQuotaCondition + 41, // 252: api.v1.VolcanoJobDetails.containers:type_name -> api.v1.ContainerTemplate + 133, // 253: api.v1.VolcanoJobDetails.conditions:type_name -> api.v1.VolcanoJobCondition + 134, // 254: api.v1.VolcanoJobDetails.tasks:type_name -> api.v1.VolcanoTask + 41, // 255: api.v1.VolcanoTask.containers:type_name -> api.v1.ContainerTemplate + 41, // 256: api.v1.SparkApplicationDetails.containers:type_name -> api.v1.ContainerTemplate + 136, // 257: api.v1.SparkApplicationDetails.spark_driver_info:type_name -> api.v1.SparkDriverInfo + 137, // 258: api.v1.SparkApplicationDetails.restart_policy:type_name -> api.v1.SparkRestartPolicyInfo + 138, // 259: api.v1.SparkApplicationDetails.dynamic_allocation:type_name -> api.v1.SparkDynamicAllocationInfo + 191, // 260: api.v1.ScheduledSparkApplicationDetails.last_run:type_name -> google.protobuf.Timestamp + 191, // 261: api.v1.ScheduledSparkApplicationDetails.next_run:type_name -> google.protobuf.Timestamp + 135, // 262: api.v1.ScheduledSparkApplicationDetails.template_details:type_name -> api.v1.SparkApplicationDetails + 141, // 263: api.v1.KyvernoPolicyReportDetails.results:type_name -> api.v1.PolicyReportResult + 191, // 264: api.v1.GatekeeperConstraintDetails.audit_timestamp:type_name -> google.protobuf.Timestamp + 144, // 265: api.v1.GatekeeperConstraintDetails.violations:type_name -> api.v1.ConstraintViolation + 189, // 266: api.v1.Event.annotations:type_name -> api.v1.Event.AnnotationsEntry + 190, // 267: api.v1.Event.labels:type_name -> api.v1.Event.LabelsEntry + 4, // 268: api.v1.Event.disruption_block_reason:type_name -> api.v1.DisruptionBlockReason + 191, // 269: api.v1.Event.created_at:type_name -> google.protobuf.Timestamp + 191, // 270: api.v1.Event.updated_at:type_name -> google.protobuf.Timestamp + 191, // 271: api.v1.Event.last_seen:type_name -> google.protobuf.Timestamp + 191, // 272: api.v1.Event.deleted_at:type_name -> google.protobuf.Timestamp + 147, // 273: api.v1.EventDatapoint.events:type_name -> api.v1.EventDatapointInfo + 191, // 274: api.v1.EventGroup.first_seen:type_name -> google.protobuf.Timestamp + 191, // 275: api.v1.EventGroup.last_seen:type_name -> google.protobuf.Timestamp + 276, // [276:276] is the sub-list for method output_type + 276, // [276:276] is the sub-list for method input_type + 276, // [276:276] is the sub-list for extension type_name + 276, // [276:276] is the sub-list for extension extendee + 0, // [0:276] is the sub-list for field type_name } func init() { file_api_v1_common_proto_init() } @@ -17882,7 +20140,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForecastResourceMetrics); i { + switch v := v.(*GPUMigInstance); i { case 0: return &v.state case 1: @@ -17894,7 +20152,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceSummary); i { + switch v := v.(*IndividualGPUMetric); i { case 0: return &v.state case 1: @@ -17906,7 +20164,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadItem); i { + switch v := v.(*ContainerIndividualGPUMetrics); i { case 0: return &v.state case 1: @@ -17918,7 +20176,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerRuntimeInfo); i { + switch v := v.(*RuntimeProcess); i { case 0: return &v.state case 1: @@ -17930,7 +20188,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeInfo); i { + switch v := v.(*ForecastResourceMetrics); i { case 0: return &v.state case 1: @@ -17942,7 +20200,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInfo); i { + switch v := v.(*ResourceSummary); i { case 0: return &v.state case 1: @@ -17954,7 +20212,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Node); i { + switch v := v.(*LegacyPolicyRef); i { case 0: return &v.state case 1: @@ -17966,7 +20224,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachedVolume); i { + switch v := v.(*OptimizationStatus); i { case 0: return &v.state case 1: @@ -17978,7 +20236,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroup); i { + switch v := v.(*WorkloadItem); i { case 0: return &v.state case 1: @@ -17990,7 +20248,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CostDataPoint); i { + switch v := v.(*ContainerRuntimeInfo); i { case 0: return &v.state case 1: @@ -18002,7 +20260,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceDataPoint); i { + switch v := v.(*NodeInfo); i { case 0: return &v.state case 1: @@ -18014,7 +20272,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerTimeSeries); i { + switch v := v.(*ResourceInfo); i { case 0: return &v.state case 1: @@ -18026,7 +20284,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsData); i { + switch v := v.(*Node); i { case 0: return &v.state case 1: @@ -18038,7 +20296,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsDataPoint); i { + switch v := v.(*AttachedVolume); i { case 0: return &v.state case 1: @@ -18050,7 +20308,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SavingsTimeSeries); i { + switch v := v.(*NodeGroup); i { case 0: return &v.state case 1: @@ -18062,7 +20320,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSelectorRequirement); i { + switch v := v.(*CostDataPoint); i { case 0: return &v.state case 1: @@ -18074,7 +20332,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Label); i { + switch v := v.(*ResourceDataPoint); i { case 0: return &v.state case 1: @@ -18086,7 +20344,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSelector); i { + switch v := v.(*ContainerTimeSeries); i { case 0: return &v.state case 1: @@ -18098,7 +20356,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegexPattern); i { + switch v := v.(*SavingsData); i { case 0: return &v.state case 1: @@ -18110,7 +20368,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceDetails); i { + switch v := v.(*SavingsDataPoint); i { case 0: return &v.state case 1: @@ -18122,7 +20380,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PodDetails); i { + switch v := v.(*SavingsTimeSeries); i { case 0: return &v.state case 1: @@ -18134,7 +20392,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerSummary); i { + switch v := v.(*LabelSelectorRequirement); i { case 0: return &v.state case 1: @@ -18146,7 +20404,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentDetails); i { + switch v := v.(*Label); i { case 0: return &v.state case 1: @@ -18158,7 +20416,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerTemplate); i { + switch v := v.(*LabelSelector); i { case 0: return &v.state case 1: @@ -18170,7 +20428,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentCondition); i { + switch v := v.(*RegexPattern); i { case 0: return &v.state case 1: @@ -18182,7 +20440,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatefulSetDetails); i { + switch v := v.(*ResourceDetails); i { case 0: return &v.state case 1: @@ -18194,7 +20452,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VolumeClaimTemplate); i { + switch v := v.(*PodDetails); i { case 0: return &v.state case 1: @@ -18206,7 +20464,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DaemonSetDetails); i { + switch v := v.(*ContainerSummary); i { case 0: return &v.state case 1: @@ -18218,7 +20476,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplicaSetDetails); i { + switch v := v.(*DeploymentDetails); i { case 0: return &v.state case 1: @@ -18230,7 +20488,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobDetails); i { + switch v := v.(*ContainerTemplate); i { case 0: return &v.state case 1: @@ -18242,7 +20500,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobCondition); i { + switch v := v.(*DeploymentCondition); i { case 0: return &v.state case 1: @@ -18254,7 +20512,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CronJobDetails); i { + switch v := v.(*StatefulSetDetails); i { case 0: return &v.state case 1: @@ -18266,7 +20524,7 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActiveJobReference); i { + switch v := v.(*VolumeClaimTemplate); i { case 0: return &v.state case 1: @@ -18278,6 +20536,78 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DaemonSetDetails); 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[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplicaSetDetails); 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[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobDetails); 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[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobCondition); 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[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CronJobDetails); 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[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveJobReference); 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[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobTemplate); i { case 0: return &v.state @@ -18289,7 +20619,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceDetails); i { case 0: return &v.state @@ -18301,7 +20631,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServicePort); i { case 0: return &v.state @@ -18313,7 +20643,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LoadBalancerIngress); i { case 0: return &v.state @@ -18325,7 +20655,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressDetails); i { case 0: return &v.state @@ -18337,7 +20667,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressRule); i { case 0: return &v.state @@ -18349,7 +20679,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressPath); i { case 0: return &v.state @@ -18361,7 +20691,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressBackend); i { case 0: return &v.state @@ -18373,7 +20703,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IngressTLS); i { case 0: return &v.state @@ -18385,7 +20715,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PersistentVolumeClaimDetails); i { case 0: return &v.state @@ -18397,7 +20727,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceRequirements); i { case 0: return &v.state @@ -18409,7 +20739,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeNodeAffinity); i { case 0: return &v.state @@ -18421,7 +20751,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVCCondition); i { case 0: return &v.state @@ -18433,7 +20763,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PersistentVolumeDetails); i { case 0: return &v.state @@ -18445,7 +20775,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVClaimReference); i { case 0: return &v.state @@ -18457,7 +20787,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PVVolumeSource); i { case 0: return &v.state @@ -18469,7 +20799,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CSIVolumeSource); i { case 0: return &v.state @@ -18481,7 +20811,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HostPathVolumeSource); i { case 0: return &v.state @@ -18493,7 +20823,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NFSVolumeSource); i { case 0: return &v.state @@ -18505,7 +20835,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StorageClassDetails); i { case 0: return &v.state @@ -18517,7 +20847,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamespaceDetails); i { case 0: return &v.state @@ -18529,7 +20859,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeDetails); i { case 0: return &v.state @@ -18541,7 +20871,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeTaint); i { case 0: return &v.state @@ -18553,7 +20883,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeAddress); i { case 0: return &v.state @@ -18565,7 +20895,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeCondition); i { case 0: return &v.state @@ -18577,7 +20907,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSystemInfo); i { case 0: return &v.state @@ -18589,7 +20919,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeImage); i { case 0: return &v.state @@ -18601,7 +20931,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopologySelector); i { case 0: return &v.state @@ -18613,7 +20943,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopologySelectorTerm); i { case 0: return &v.state @@ -18625,7 +20955,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TolerationInfo); i { case 0: return &v.state @@ -18637,7 +20967,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelector); i { case 0: return &v.state @@ -18649,7 +20979,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelectorTerm); i { case 0: return &v.state @@ -18661,7 +20991,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSelectorRequirement); i { case 0: return &v.state @@ -18673,7 +21003,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPADetails); i { case 0: return &v.state @@ -18685,7 +21015,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScaleTargetRef); i { case 0: return &v.state @@ -18697,7 +21027,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAMetric); i { case 0: return &v.state @@ -18709,7 +21039,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAResourceMetric); i { case 0: return &v.state @@ -18721,7 +21051,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAPodsMetric); i { case 0: return &v.state @@ -18733,7 +21063,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAObjectMetric); i { case 0: return &v.state @@ -18745,7 +21075,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAExternalMetric); i { case 0: return &v.state @@ -18757,7 +21087,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAMetricSelector); i { case 0: return &v.state @@ -18769,7 +21099,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAObjectReference); i { case 0: return &v.state @@ -18781,7 +21111,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentMetric); i { case 0: return &v.state @@ -18793,7 +21123,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentResourceMetric); i { case 0: return &v.state @@ -18805,7 +21135,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentPodsMetric); i { case 0: return &v.state @@ -18817,7 +21147,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentObjectMetric); i { case 0: return &v.state @@ -18829,7 +21159,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACurrentExternalMetric); i { case 0: return &v.state @@ -18841,7 +21171,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPACondition); i { case 0: return &v.state @@ -18853,7 +21183,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPABehavior); i { case 0: return &v.state @@ -18865,7 +21195,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAScalingRules); i { case 0: return &v.state @@ -18877,7 +21207,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HPAScalingPolicy); i { case 0: return &v.state @@ -18889,7 +21219,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPADetails); i { case 0: return &v.state @@ -18901,7 +21231,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPATargetRef); i { case 0: return &v.state @@ -18913,7 +21243,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAUpdatePolicy); i { case 0: return &v.state @@ -18925,7 +21255,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAResourcePolicy); i { case 0: return &v.state @@ -18937,7 +21267,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAContainerResourcePolicy); i { case 0: return &v.state @@ -18949,7 +21279,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPARecommendation); i { case 0: return &v.state @@ -18961,7 +21291,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPAContainerRecommendation); i { case 0: return &v.state @@ -18973,7 +21303,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VPACondition); i { case 0: return &v.state @@ -18985,7 +21315,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LimitRangeDetails); i { case 0: return &v.state @@ -18997,7 +21327,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LimitRangeItem); i { case 0: return &v.state @@ -19009,7 +21339,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServiceAccountDetails); i { case 0: return &v.state @@ -19021,7 +21351,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleDetails); i { case 0: return &v.state @@ -19033,7 +21363,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleRule); i { case 0: return &v.state @@ -19045,7 +21375,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleBindingDetails); i { case 0: return &v.state @@ -19057,7 +21387,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleBindingSubject); i { case 0: return &v.state @@ -19069,7 +21399,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleReference); i { case 0: return &v.state @@ -19081,7 +21411,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectDetails); i { case 0: return &v.state @@ -19093,7 +21423,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectTrigger); i { case 0: return &v.state @@ -19105,7 +21435,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KedaScaledObjectCondition); i { case 0: return &v.state @@ -19117,7 +21447,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterResourceDetails); i { case 0: return &v.state @@ -19129,7 +21459,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterResourceCondition); i { case 0: return &v.state @@ -19141,7 +21471,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterCapacity); i { case 0: return &v.state @@ -19153,7 +21483,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KarpenterRequirement); i { case 0: return &v.state @@ -19165,7 +21495,31 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceFieldFilter); 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.(*ResourceFilterFieldOptions); 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.(*WorkloadFilters); i { case 0: return &v.state @@ -19177,7 +21531,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodDisruptionBudgetDetails); i { case 0: return &v.state @@ -19189,7 +21543,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodDisruptionBudgetCondition); i { case 0: return &v.state @@ -19201,7 +21555,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceQuotaDetails); i { case 0: return &v.state @@ -19213,7 +21567,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceQuotaCondition); i { case 0: return &v.state @@ -19225,7 +21579,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoJobDetails); i { case 0: return &v.state @@ -19237,7 +21591,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoJobCondition); i { case 0: return &v.state @@ -19249,7 +21603,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolcanoTask); i { case 0: return &v.state @@ -19261,7 +21615,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkApplicationDetails); i { case 0: return &v.state @@ -19273,7 +21627,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkDriverInfo); i { case 0: return &v.state @@ -19285,7 +21639,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkRestartPolicyInfo); i { case 0: return &v.state @@ -19297,7 +21651,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SparkDynamicAllocationInfo); i { case 0: return &v.state @@ -19309,7 +21663,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ScheduledSparkApplicationDetails); i { case 0: return &v.state @@ -19321,7 +21675,79 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KyvernoPolicyDetails); 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[136].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PolicyReportResult); 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[137].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KyvernoPolicyReportDetails); 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[138].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatekeeperConstraintTemplateDetails); 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[139].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConstraintViolation); 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[140].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GatekeeperConstraintDetails); 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[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -19333,7 +21759,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventDatapointInfo); i { case 0: return &v.state @@ -19345,7 +21771,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventDatapoint); i { case 0: return &v.state @@ -19357,7 +21783,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DimensionCount); i { case 0: return &v.state @@ -19369,7 +21795,7 @@ func file_api_v1_common_proto_init() { return nil } } - file_api_v1_common_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_common_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EventGroup); i { case 0: return &v.state @@ -19383,9 +21809,11 @@ func file_api_v1_common_proto_init() { } } file_api_v1_common_proto_msgTypes[3].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[6].OneofWrappers = []interface{}{} file_api_v1_common_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_api_v1_common_proto_msgTypes[13].OneofWrappers = []interface{}{} - file_api_v1_common_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_api_v1_common_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[19].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[32].OneofWrappers = []interface{}{ (*ResourceDetails_PodDetails)(nil), (*ResourceDetails_DeploymentDetails)(nil), (*ResourceDetails_StatefulSetDetails)(nil), @@ -19413,15 +21841,20 @@ func file_api_v1_common_proto_init() { (*ResourceDetails_VolcanoJobDetails)(nil), (*ResourceDetails_SparkApplicationDetails)(nil), (*ResourceDetails_ScheduledSparkApplicationDetails)(nil), + (*ResourceDetails_KyvernoPolicyDetails)(nil), + (*ResourceDetails_KyvernoPolicyReportDetails)(nil), + (*ResourceDetails_GatekeeperConstraintTemplateDetails)(nil), + (*ResourceDetails_GatekeeperConstraintDetails)(nil), } - file_api_v1_common_proto_msgTypes[114].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[122].OneofWrappers = []interface{}{} + file_api_v1_common_proto_msgTypes[141].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_common_proto_rawDesc, - NumEnums: 4, - NumMessages: 172, + NumEnums: 5, + NumMessages: 186, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/gen/api/v1/hpa_connector.pb.go b/internal/gen/api/v1/hpa_connector.pb.go new file mode 100644 index 0000000..b8a127b --- /dev/null +++ b/internal/gen/api/v1/hpa_connector.pb.go @@ -0,0 +1,850 @@ +// dakr/proto/api/v1/hpa_connector.proto + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: api/v1/hpa_connector.proto + +package apiv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type HPAConnector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"` + Config map[string]string `protobuf:"bytes,6,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,7,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + Status string `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"` + LastHealthCheck *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=last_health_check,json=lastHealthCheck,proto3,oneof" json:"last_health_check,omitempty"` + HealthError *string `protobuf:"bytes,10,opt,name=health_error,json=healthError,proto3,oneof" json:"health_error,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,13,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *HPAConnector) Reset() { + *x = HPAConnector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HPAConnector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HPAConnector) ProtoMessage() {} + +func (x *HPAConnector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[0] + 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 HPAConnector.ProtoReflect.Descriptor instead. +func (*HPAConnector) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{0} +} + +func (x *HPAConnector) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *HPAConnector) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *HPAConnector) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *HPAConnector) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *HPAConnector) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *HPAConnector) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *HPAConnector) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *HPAConnector) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *HPAConnector) GetLastHealthCheck() *timestamppb.Timestamp { + if x != nil { + return x.LastHealthCheck + } + return nil +} + +func (x *HPAConnector) GetHealthError() string { + if x != nil && x.HealthError != nil { + return *x.HealthError + } + return "" +} + +func (x *HPAConnector) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *HPAConnector) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *HPAConnector) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type CreateHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + Config map[string]string `protobuf:"bytes,4,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,5,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,6,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *CreateHPAConnectorRequest) Reset() { + *x = CreateHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateHPAConnectorRequest) ProtoMessage() {} + +func (x *CreateHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[1] + 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 CreateHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*CreateHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateHPAConnectorRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *CreateHPAConnectorRequest) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *CreateHPAConnectorRequest) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type UpdateHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Config map[string]string `protobuf:"bytes,3,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + AuthSecretRef *string `protobuf:"bytes,4,opt,name=auth_secret_ref,json=authSecretRef,proto3,oneof" json:"auth_secret_ref,omitempty"` + AuthSecretNamespace *string `protobuf:"bytes,5,opt,name=auth_secret_namespace,json=authSecretNamespace,proto3,oneof" json:"auth_secret_namespace,omitempty"` +} + +func (x *UpdateHPAConnectorRequest) Reset() { + *x = UpdateHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateHPAConnectorRequest) ProtoMessage() {} + +func (x *UpdateHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[2] + 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 UpdateHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*UpdateHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetConfig() map[string]string { + if x != nil { + return x.Config + } + return nil +} + +func (x *UpdateHPAConnectorRequest) GetAuthSecretRef() string { + if x != nil && x.AuthSecretRef != nil { + return *x.AuthSecretRef + } + return "" +} + +func (x *UpdateHPAConnectorRequest) GetAuthSecretNamespace() string { + if x != nil && x.AuthSecretNamespace != nil { + return *x.AuthSecretNamespace + } + return "" +} + +type GetHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetHPAConnectorRequest) Reset() { + *x = GetHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetHPAConnectorRequest) ProtoMessage() {} + +func (x *GetHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[3] + 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 GetHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*GetHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{3} +} + +func (x *GetHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type ListHPAConnectorsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Type *string `protobuf:"bytes,2,opt,name=type,proto3,oneof" json:"type,omitempty"` +} + +func (x *ListHPAConnectorsRequest) Reset() { + *x = ListHPAConnectorsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListHPAConnectorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListHPAConnectorsRequest) ProtoMessage() {} + +func (x *ListHPAConnectorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[4] + 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 ListHPAConnectorsRequest.ProtoReflect.Descriptor instead. +func (*ListHPAConnectorsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{4} +} + +func (x *ListHPAConnectorsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListHPAConnectorsRequest) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" +} + +type ListHPAConnectorsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Connectors []*HPAConnector `protobuf:"bytes,1,rep,name=connectors,proto3" json:"connectors,omitempty"` +} + +func (x *ListHPAConnectorsResponse) Reset() { + *x = ListHPAConnectorsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListHPAConnectorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListHPAConnectorsResponse) ProtoMessage() {} + +func (x *ListHPAConnectorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[5] + 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 ListHPAConnectorsResponse.ProtoReflect.Descriptor instead. +func (*ListHPAConnectorsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{5} +} + +func (x *ListHPAConnectorsResponse) GetConnectors() []*HPAConnector { + if x != nil { + return x.Connectors + } + return nil +} + +type DeleteHPAConnectorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *DeleteHPAConnectorRequest) Reset() { + *x = DeleteHPAConnectorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_hpa_connector_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteHPAConnectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteHPAConnectorRequest) ProtoMessage() {} + +func (x *DeleteHPAConnectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_hpa_connector_proto_msgTypes[6] + 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 DeleteHPAConnectorRequest.ProtoReflect.Descriptor instead. +func (*DeleteHPAConnectorRequest) Descriptor() ([]byte, []int) { + return file_api_v1_hpa_connector_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteHPAConnectorRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +var File_api_v1_hpa_connector_proto protoreflect.FileDescriptor + +var file_api_v1_hpa_connector_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xb1, 0x05, 0x0a, 0x0c, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 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, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, + 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0f, 0x6c, 0x61, 0x73, + 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, + 0x26, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x0c, 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, + 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x13, + 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 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, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x18, 0x0a, 0x16, + 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xf8, 0x02, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, + 0x37, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x13, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 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, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x75, 0x74, 0x68, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x22, 0xd5, 0x02, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x0f, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x13, 0x61, 0x75, 0x74, 0x68, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x88, 0x01, 0x01, + 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x12, 0x0a, 0x10, 0x5f, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x42, + 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x28, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x5b, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x51, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, + 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0x2b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x32, 0xa7, 0x03, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x48, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x50, 0x41, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x58, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x48, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x50, 0x41, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, + 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x8f, 0x01, 0x0a, 0x0a, 0x63, + 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x48, 0x70, 0x61, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, + 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, + 0x64, 0x61, 0x6b, 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 ( + file_api_v1_hpa_connector_proto_rawDescOnce sync.Once + file_api_v1_hpa_connector_proto_rawDescData = file_api_v1_hpa_connector_proto_rawDesc +) + +func file_api_v1_hpa_connector_proto_rawDescGZIP() []byte { + file_api_v1_hpa_connector_proto_rawDescOnce.Do(func() { + file_api_v1_hpa_connector_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_hpa_connector_proto_rawDescData) + }) + return file_api_v1_hpa_connector_proto_rawDescData +} + +var file_api_v1_hpa_connector_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_api_v1_hpa_connector_proto_goTypes = []interface{}{ + (*HPAConnector)(nil), // 0: api.v1.HPAConnector + (*CreateHPAConnectorRequest)(nil), // 1: api.v1.CreateHPAConnectorRequest + (*UpdateHPAConnectorRequest)(nil), // 2: api.v1.UpdateHPAConnectorRequest + (*GetHPAConnectorRequest)(nil), // 3: api.v1.GetHPAConnectorRequest + (*ListHPAConnectorsRequest)(nil), // 4: api.v1.ListHPAConnectorsRequest + (*ListHPAConnectorsResponse)(nil), // 5: api.v1.ListHPAConnectorsResponse + (*DeleteHPAConnectorRequest)(nil), // 6: api.v1.DeleteHPAConnectorRequest + nil, // 7: api.v1.HPAConnector.ConfigEntry + nil, // 8: api.v1.CreateHPAConnectorRequest.ConfigEntry + nil, // 9: api.v1.UpdateHPAConnectorRequest.ConfigEntry + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 11: google.protobuf.Empty +} +var file_api_v1_hpa_connector_proto_depIdxs = []int32{ + 7, // 0: api.v1.HPAConnector.config:type_name -> api.v1.HPAConnector.ConfigEntry + 10, // 1: api.v1.HPAConnector.last_health_check:type_name -> google.protobuf.Timestamp + 10, // 2: api.v1.HPAConnector.created_at:type_name -> google.protobuf.Timestamp + 10, // 3: api.v1.HPAConnector.updated_at:type_name -> google.protobuf.Timestamp + 8, // 4: api.v1.CreateHPAConnectorRequest.config:type_name -> api.v1.CreateHPAConnectorRequest.ConfigEntry + 9, // 5: api.v1.UpdateHPAConnectorRequest.config:type_name -> api.v1.UpdateHPAConnectorRequest.ConfigEntry + 0, // 6: api.v1.ListHPAConnectorsResponse.connectors:type_name -> api.v1.HPAConnector + 1, // 7: api.v1.HPAConnectorService.CreateHPAConnector:input_type -> api.v1.CreateHPAConnectorRequest + 2, // 8: api.v1.HPAConnectorService.UpdateHPAConnector:input_type -> api.v1.UpdateHPAConnectorRequest + 6, // 9: api.v1.HPAConnectorService.DeleteHPAConnector:input_type -> api.v1.DeleteHPAConnectorRequest + 4, // 10: api.v1.HPAConnectorService.ListHPAConnectors:input_type -> api.v1.ListHPAConnectorsRequest + 3, // 11: api.v1.HPAConnectorService.GetHPAConnector:input_type -> api.v1.GetHPAConnectorRequest + 0, // 12: api.v1.HPAConnectorService.CreateHPAConnector:output_type -> api.v1.HPAConnector + 0, // 13: api.v1.HPAConnectorService.UpdateHPAConnector:output_type -> api.v1.HPAConnector + 11, // 14: api.v1.HPAConnectorService.DeleteHPAConnector:output_type -> google.protobuf.Empty + 5, // 15: api.v1.HPAConnectorService.ListHPAConnectors:output_type -> api.v1.ListHPAConnectorsResponse + 0, // 16: api.v1.HPAConnectorService.GetHPAConnector:output_type -> api.v1.HPAConnector + 12, // [12:17] is the sub-list for method output_type + 7, // [7:12] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_api_v1_hpa_connector_proto_init() } +func file_api_v1_hpa_connector_proto_init() { + if File_api_v1_hpa_connector_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_api_v1_hpa_connector_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAConnector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListHPAConnectorsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListHPAConnectorsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_hpa_connector_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteHPAConnectorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_api_v1_hpa_connector_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_api_v1_hpa_connector_proto_msgTypes[4].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v1_hpa_connector_proto_rawDesc, + NumEnums: 0, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v1_hpa_connector_proto_goTypes, + DependencyIndexes: file_api_v1_hpa_connector_proto_depIdxs, + MessageInfos: file_api_v1_hpa_connector_proto_msgTypes, + }.Build() + File_api_v1_hpa_connector_proto = out.File + file_api_v1_hpa_connector_proto_rawDesc = nil + file_api_v1_hpa_connector_proto_goTypes = nil + file_api_v1_hpa_connector_proto_depIdxs = nil +} diff --git a/internal/gen/api/v1/k8s.pb.go b/internal/gen/api/v1/k8s.pb.go index 39ab4b8..3916dfc 100644 --- a/internal/gen/api/v1/k8s.pb.go +++ b/internal/gen/api/v1/k8s.pb.go @@ -586,6 +586,16 @@ type GetWorkloadsRequest struct { // Deprecated: Marked as deprecated in api/v1/k8s.proto. NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Prefer filters.status instead Filters *WorkloadFilters `protobuf:"bytes,31,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters; when set, overrides show_deleted behavior via filters.status + // The two flags below independently control which half of + // WorkloadItem.optimization_status gets computed. Split because a team on + // MPA_V2 with is_enabled=false is permanently locked into exactly one + // system (is_active=true -> v2-only, is_active=false -> legacy-only) and + // the unused system should never be queried; only when is_enabled=true + // (team is in a self-service/transition state) does the caller request + // both. Adds batched lookups — leave both false unless the caller renders + // optimization status. + IncludeLegacyOptimizationStatus bool `protobuf:"varint,32,opt,name=include_legacy_optimization_status,json=includeLegacyOptimizationStatus,proto3" json:"include_legacy_optimization_status,omitempty"` + IncludeV2OptimizationStatus bool `protobuf:"varint,33,opt,name=include_v2_optimization_status,json=includeV2OptimizationStatus,proto3" json:"include_v2_optimization_status,omitempty"` } func (x *GetWorkloadsRequest) Reset() { @@ -671,21 +681,43 @@ func (x *GetWorkloadsRequest) GetFilters() *WorkloadFilters { return nil } -// GetResourcesRequest is uset to fetch resources from db. -type GetResourcesRequest struct { +func (x *GetWorkloadsRequest) GetIncludeLegacyOptimizationStatus() bool { + if x != nil { + return x.IncludeLegacyOptimizationStatus + } + return false +} + +func (x *GetWorkloadsRequest) GetIncludeV2OptimizationStatus() bool { + if x != nil { + return x.IncludeV2OptimizationStatus + } + return false +} + +// ListWorkloadsPaginatedRequest fetches a single keyset-paginated page of +// top-level workloads for a cluster+timerange. Additive alternative to +// GetWorkloads for large clusters; existing GetWorkloads callers are unaffected. +type ListWorkloadsPaginatedRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // Type of object to get. - Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter resources by name - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Filters *WorkloadFilters `protobuf:"bytes,5,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Optional advanced filters (same message GetWorkloads uses). + IncludeLegacyOptimizationStatus bool `protobuf:"varint,6,opt,name=include_legacy_optimization_status,json=includeLegacyOptimizationStatus,proto3" json:"include_legacy_optimization_status,omitempty"` + IncludeV2OptimizationStatus bool `protobuf:"varint,7,opt,name=include_v2_optimization_status,json=includeV2OptimizationStatus,proto3" json:"include_v2_optimization_status,omitempty"` + PageSize int32 `protobuf:"varint,8,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Max items per page; server clamps to a sane range. + PageToken string `protobuf:"bytes,9,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Opaque cursor from a prior response; empty = first page. + SortOrder string `protobuf:"bytes,10,opt,name=sort_order,json=sortOrder,proto3" json:"sort_order,omitempty"` // "asc" | "desc" (default "desc": highest sort_field value first). + SortField string `protobuf:"bytes,11,opt,name=sort_field,json=sortField,proto3" json:"sort_field,omitempty"` // "cost" | "cpu" | "memory" | "gpu" (default "cost"). Selects which metric orders the page. } -func (x *GetResourcesRequest) Reset() { - *x = GetResourcesRequest{} +func (x *ListWorkloadsPaginatedRequest) Reset() { + *x = ListWorkloadsPaginatedRequest{} if protoimpl.UnsafeEnabled { mi := &file_api_v1_k8s_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -693,13 +725,13 @@ func (x *GetResourcesRequest) Reset() { } } -func (x *GetResourcesRequest) String() string { +func (x *ListWorkloadsPaginatedRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetResourcesRequest) ProtoMessage() {} +func (*ListWorkloadsPaginatedRequest) ProtoMessage() {} -func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { +func (x *ListWorkloadsPaginatedRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_k8s_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -711,177 +743,122 @@ func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetResourcesRequest.ProtoReflect.Descriptor instead. -func (*GetResourcesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ListWorkloadsPaginatedRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadsPaginatedRequest) Descriptor() ([]byte, []int) { return file_api_v1_k8s_proto_rawDescGZIP(), []int{5} } -func (x *GetResourcesRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetResourcesRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId - } - return "" -} - -func (x *GetResourcesRequest) GetKind() K8SObjectKind { +func (x *ListWorkloadsPaginatedRequest) GetClusterId() string { if x != nil { - return x.Kind - } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED -} - -func (x *GetResourcesRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search + return x.ClusterId } return "" } -func (x *GetResourcesRequest) GetPagination() *Pagination { +func (x *ListWorkloadsPaginatedRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.Pagination + return x.StartTime } return nil } -// GetPodsRequest is used to fetch Pod resources from db. -type GetPodsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter pods by name - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters - NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups - NodeIds []string `protobuf:"bytes,26,rep,name=node_ids,json=nodeIds,proto3" json:"node_ids,omitempty"` // Optional filter for specific node IDs - StartTime *timestamppb.Timestamp `protobuf:"bytes,27,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // Start time for metrics query - EndTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // End time for metrics query -} - -func (x *GetPodsRequest) Reset() { - *x = GetPodsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetPodsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetPodsRequest) ProtoMessage() {} - -func (x *GetPodsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[6] - 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 GetPodsRequest.ProtoReflect.Descriptor instead. -func (*GetPodsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{6} -} - -func (x *GetPodsRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.TeamId + return x.EndTime } - return "" + return nil } -func (x *GetPodsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *ListWorkloadsPaginatedRequest) GetFilters() *WorkloadFilters { + if x != nil { + return x.Filters } - return "" + return nil } -func (x *GetPodsRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search +func (x *ListWorkloadsPaginatedRequest) GetIncludeLegacyOptimizationStatus() bool { + if x != nil { + return x.IncludeLegacyOptimizationStatus } - return "" + return false } -func (x *GetPodsRequest) GetPagination() *Pagination { +func (x *ListWorkloadsPaginatedRequest) GetIncludeV2OptimizationStatus() bool { if x != nil { - return x.Pagination + return x.IncludeV2OptimizationStatus } - return nil + return false } -func (x *GetPodsRequest) GetNodeGroupNames() []string { +func (x *ListWorkloadsPaginatedRequest) GetPageSize() int32 { if x != nil { - return x.NodeGroupNames + return x.PageSize } - return nil + return 0 } -func (x *GetPodsRequest) GetNodeIds() []string { +func (x *ListWorkloadsPaginatedRequest) GetPageToken() string { if x != nil { - return x.NodeIds + return x.PageToken } - return nil + return "" } -func (x *GetPodsRequest) GetStartTime() *timestamppb.Timestamp { +func (x *ListWorkloadsPaginatedRequest) GetSortOrder() string { if x != nil { - return x.StartTime + return x.SortOrder } - return nil + return "" } -func (x *GetPodsRequest) GetEndTime() *timestamppb.Timestamp { +func (x *ListWorkloadsPaginatedRequest) GetSortField() string { if x != nil { - return x.EndTime + return x.SortField } - return nil + return "" } -// GetPodsResponse is the response for getting pod resources. -type GetPodsResponse struct { +// GetWorkloadsSummaryRequest computes cluster-wide aggregate breakdowns (summary +// cards, top-N lists, treemaps) over the FULL filtered workload set in a single +// pass. Companion to ListWorkloadsPaginated: this pays the full-scan cost once +// per page load, while ListWorkloadsPaginated serves the cheap table body per +// scroll. +type GetWorkloadsSummaryRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of pods. - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Filters *WorkloadFilters `protobuf:"bytes,5,opt,name=filters,proto3,oneof" json:"filters,omitempty"` // Same WorkloadFilters message as ListWorkloadsPaginatedRequest. } -func (x *GetPodsResponse) Reset() { - *x = GetPodsResponse{} +func (x *GetWorkloadsSummaryRequest) Reset() { + *x = GetWorkloadsSummaryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[7] + mi := &file_api_v1_k8s_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPodsResponse) String() string { +func (x *GetWorkloadsSummaryRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPodsResponse) ProtoMessage() {} +func (*GetWorkloadsSummaryRequest) ProtoMessage() {} -func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[7] +func (x *GetWorkloadsSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -892,59 +869,85 @@ func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetPodsResponse.ProtoReflect.Descriptor instead. -func (*GetPodsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{7} +// Deprecated: Use GetWorkloadsSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadsSummaryRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{6} } -func (x *GetPodsResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetWorkloadsSummaryRequest) GetTeamId() string { if x != nil { - return x.WorkloadItems + return x.TeamId + } + return "" +} + +func (x *GetWorkloadsSummaryRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadsSummaryRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime } return nil } -func (x *GetPodsResponse) GetPagination() *Pagination { +func (x *GetWorkloadsSummaryRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Pagination + return x.EndTime } return nil } -// GetWorkloadRequest is used to fetch details of a specific workload in a cluster. -type GetWorkloadRequest struct { +func (x *GetWorkloadsSummaryRequest) GetFilters() *WorkloadFilters { + if x != nil { + return x.Filters + } + return nil +} + +// WorkloadMetricEntry is a single workload's contribution to one metric. value +// is whatever the enclosing breakdown is sorted by; requested/limit/usage carry +// the full picture so the frontend can render tooltips and compute utilization +// without a second round-trip. For the cost breakdown, requested is the +// requested cost, usage is the usage cost, and limit is 0 (no limit-cost +// concept). +type WorkloadMetricEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` - WithDetails bool `protobuf:"varint,12,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` // Optional flag to include additional resource details - WithMetadata bool `protobuf:"varint,13,opt,name=with_metadata,json=withMetadata,proto3" json:"with_metadata,omitempty"` // Optional flag to include metadata - StartTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,22,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + Value float64 `protobuf:"fixed64,5,opt,name=value,proto3" json:"value,omitempty"` // The metric this breakdown is sorted by (usage for cpu/mem/gpu, requested cost for cost, overprovisioned amount for optimization_potential). + Requested float64 `protobuf:"fixed64,6,opt,name=requested,proto3" json:"requested,omitempty"` // Cluster-wide requested amount for this workload (millicores / bytes / gpu-count / requested cost). + Limit float64 `protobuf:"fixed64,7,opt,name=limit,proto3" json:"limit,omitempty"` // Configured limit for this workload (0 for the cost breakdown). + Usage float64 `protobuf:"fixed64,8,opt,name=usage,proto3" json:"usage,omitempty"` // Observed usage for this workload (millicores / bytes / gpu-count / usage cost). + IsDeleted bool `protobuf:"varint,9,opt,name=is_deleted,json=isDeleted,proto3" json:"is_deleted,omitempty"` // Whether this workload is soft-deleted. The frontend needs this to open the workload drawer correctly when a caller clicks a treemap/top-N node built from this entry, the same way it already does for table rows sourced from WorkloadItem.deleted_at. } -func (x *GetWorkloadRequest) Reset() { - *x = GetWorkloadRequest{} +func (x *WorkloadMetricEntry) Reset() { + *x = WorkloadMetricEntry{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[8] + mi := &file_api_v1_k8s_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRequest) String() string { +func (x *WorkloadMetricEntry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRequest) ProtoMessage() {} +func (*WorkloadMetricEntry) ProtoMessage() {} -func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[8] +func (x *WorkloadMetricEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -955,104 +958,107 @@ func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{8} +// Deprecated: Use WorkloadMetricEntry.ProtoReflect.Descriptor instead. +func (*WorkloadMetricEntry) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{7} } -func (x *GetWorkloadRequest) GetTeamId() string { +func (x *WorkloadMetricEntry) GetUid() string { if x != nil { - return x.TeamId + return x.Uid } return "" } -func (x *GetWorkloadRequest) GetClusterId() string { +func (x *WorkloadMetricEntry) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *GetWorkloadRequest) GetKind() string { +func (x *WorkloadMetricEntry) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *GetWorkloadRequest) GetUid() string { +func (x *WorkloadMetricEntry) GetNamespace() string { if x != nil { - return x.Uid + return x.Namespace } return "" } -func (x *GetWorkloadRequest) GetIncludeDeleted() bool { +func (x *WorkloadMetricEntry) GetValue() float64 { if x != nil { - return x.IncludeDeleted + return x.Value } - return false + return 0 } -func (x *GetWorkloadRequest) GetWithDetails() bool { +func (x *WorkloadMetricEntry) GetRequested() float64 { if x != nil { - return x.WithDetails + return x.Requested } - return false + return 0 } -func (x *GetWorkloadRequest) GetWithMetadata() bool { +func (x *WorkloadMetricEntry) GetLimit() float64 { if x != nil { - return x.WithMetadata + return x.Limit } - return false + return 0 } -func (x *GetWorkloadRequest) GetStartTime() *timestamppb.Timestamp { +func (x *WorkloadMetricEntry) GetUsage() float64 { if x != nil { - return x.StartTime + return x.Usage } - return nil + return 0 } -func (x *GetWorkloadRequest) GetEndTime() *timestamppb.Timestamp { +func (x *WorkloadMetricEntry) GetIsDeleted() bool { if x != nil { - return x.EndTime + return x.IsDeleted } - return nil + return false } -// GetClustersRequest is used to fetch clusters for a specific team. -type GetClustersRequest struct { +// WorkloadMetricBreakdown is a top-N + "other" rollup of one metric across all +// top-level workloads matching the filters. +type WorkloadMetricBreakdown struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups + TopEntries []*WorkloadMetricEntry `protobuf:"bytes,1,rep,name=top_entries,json=topEntries,proto3" json:"top_entries,omitempty"` // Top N by this metric, descending. + OtherValue float64 `protobuf:"fixed64,2,opt,name=other_value,json=otherValue,proto3" json:"other_value,omitempty"` // Sum of value across everything NOT in top_entries. + OtherCount int32 `protobuf:"varint,3,opt,name=other_count,json=otherCount,proto3" json:"other_count,omitempty"` // How many workloads are folded into other_value. + Total float64 `protobuf:"fixed64,4,opt,name=total,proto3" json:"total,omitempty"` // Sum of value across ALL workloads (top_entries + other). + RequestedTotal float64 `protobuf:"fixed64,5,opt,name=requested_total,json=requestedTotal,proto3" json:"requested_total,omitempty"` // Sum of requested across ALL workloads; pair with total (usage) for request-utilization %. + PositiveCount int32 `protobuf:"varint,6,opt,name=positive_count,json=positiveCount,proto3" json:"positive_count,omitempty"` // How many workloads (top_entries + other, combined) have value > 0 for this metric. Use this, not top_entries+other_count, as the denominator for "N% of workloads account for ~80%" style displays — other_count includes workloads with zero value for this metric (e.g. a workload with no CPU usage still gets folded into "other"), which understates the percentage. + Top80Count int32 `protobuf:"varint,7,opt,name=top80_count,json=top80Count,proto3" json:"top80_count,omitempty"` // How many workloads, ranked by this metric descending, are needed to reach ~80% of total. Computed server-side over the FULL dataset, not just top_entries (which is capped at 50) — use this instead of walking top_entries client-side, which silently caps at 50 and under-reports on flatter distributions where more than 50 workloads are needed to reach 80%. } -func (x *GetClustersRequest) Reset() { - *x = GetClustersRequest{} +func (x *WorkloadMetricBreakdown) Reset() { + *x = WorkloadMetricBreakdown{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[9] + mi := &file_api_v1_k8s_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClustersRequest) String() string { +func (x *WorkloadMetricBreakdown) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClustersRequest) ProtoMessage() {} +func (*WorkloadMetricBreakdown) ProtoMessage() {} -func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[9] +func (x *WorkloadMetricBreakdown) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1063,77 +1069,98 @@ func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClustersRequest.ProtoReflect.Descriptor instead. -func (*GetClustersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{9} +// Deprecated: Use WorkloadMetricBreakdown.ProtoReflect.Descriptor instead. +func (*WorkloadMetricBreakdown) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{8} } -func (x *GetClustersRequest) GetTeamId() string { +func (x *WorkloadMetricBreakdown) GetTopEntries() []*WorkloadMetricEntry { if x != nil { - return x.TeamId + return x.TopEntries } - return "" + return nil } -func (x *GetClustersRequest) GetStartTime() *timestamppb.Timestamp { +func (x *WorkloadMetricBreakdown) GetOtherValue() float64 { if x != nil { - return x.StartTime + return x.OtherValue } - return nil + return 0 } -func (x *GetClustersRequest) GetEndTime() *timestamppb.Timestamp { +func (x *WorkloadMetricBreakdown) GetOtherCount() int32 { if x != nil { - return x.EndTime + return x.OtherCount } - return nil + return 0 } -func (x *GetClustersRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize +func (x *WorkloadMetricBreakdown) GetTotal() float64 { + if x != nil { + return x.Total } return 0 } -func (x *GetClustersRequest) GetNodeGroupNames() []string { +func (x *WorkloadMetricBreakdown) GetRequestedTotal() float64 { if x != nil { - return x.NodeGroupNames + return x.RequestedTotal } - return nil + return 0 } -// ListClustersRequest is used to fetch clusters for a specific team with pagination. -// Deprecated: Use GetClustersRequest instead. -// -// Deprecated: Marked as deprecated in api/v1/k8s.proto. -type ListClustersRequest struct { +func (x *WorkloadMetricBreakdown) GetPositiveCount() int32 { + if x != nil { + return x.PositiveCount + } + return 0 +} + +func (x *WorkloadMetricBreakdown) GetTop80Count() int32 { + if x != nil { + return x.Top80Count + } + return 0 +} + +// GetWorkloadsSummaryResponse carries one usage/cost breakdown per metric plus +// the total matching top-level workload count. The optimization_potential_* +// breakdowns re-rank the same workloads by the overprovisioned amount +// (requested - usage) for that metric, feeding each treemap's "show +// optimization potential" toggle without an approximation. +type GetWorkloadsSummaryResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - Search *string `protobuf:"bytes,2,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter clusters by name or ID - Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + Cost *WorkloadMetricBreakdown `protobuf:"bytes,1,opt,name=cost,proto3" json:"cost,omitempty"` + CpuUsage *WorkloadMetricBreakdown `protobuf:"bytes,2,opt,name=cpu_usage,json=cpuUsage,proto3" json:"cpu_usage,omitempty"` + MemoryUsage *WorkloadMetricBreakdown `protobuf:"bytes,3,opt,name=memory_usage,json=memoryUsage,proto3" json:"memory_usage,omitempty"` + GpuUsage *WorkloadMetricBreakdown `protobuf:"bytes,4,opt,name=gpu_usage,json=gpuUsage,proto3" json:"gpu_usage,omitempty"` + TotalWorkloadCount int32 `protobuf:"varint,5,opt,name=total_workload_count,json=totalWorkloadCount,proto3" json:"total_workload_count,omitempty"` // Total top-level workloads matching filters. + OptimizationPotentialCost *WorkloadMetricBreakdown `protobuf:"bytes,6,opt,name=optimization_potential_cost,json=optimizationPotentialCost,proto3" json:"optimization_potential_cost,omitempty"` // Ranked by overprovisioned cost (requested cost - usage cost), descending. + OptimizationPotentialCpu *WorkloadMetricBreakdown `protobuf:"bytes,7,opt,name=optimization_potential_cpu,json=optimizationPotentialCpu,proto3" json:"optimization_potential_cpu,omitempty"` // Ranked by overprovisioned cpu (cpu request - cpu usage, millicores), descending. + OptimizationPotentialMemory *WorkloadMetricBreakdown `protobuf:"bytes,8,opt,name=optimization_potential_memory,json=optimizationPotentialMemory,proto3" json:"optimization_potential_memory,omitempty"` // Ranked by overprovisioned memory (memory request - memory usage, bytes), descending. + OptimizationPotentialGpu *WorkloadMetricBreakdown `protobuf:"bytes,9,opt,name=optimization_potential_gpu,json=optimizationPotentialGpu,proto3" json:"optimization_potential_gpu,omitempty"` // Ranked by overprovisioned gpu (gpu request - gpu usage, gpu-count), descending. } -func (x *ListClustersRequest) Reset() { - *x = ListClustersRequest{} +func (x *GetWorkloadsSummaryResponse) Reset() { + *x = GetWorkloadsSummaryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[10] + mi := &file_api_v1_k8s_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListClustersRequest) String() string { +func (x *GetWorkloadsSummaryResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListClustersRequest) ProtoMessage() {} +func (*GetWorkloadsSummaryResponse) ProtoMessage() {} -func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[10] +func (x *GetWorkloadsSummaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1144,147 +1171,104 @@ func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListClustersRequest.ProtoReflect.Descriptor instead. -func (*ListClustersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{10} +// Deprecated: Use GetWorkloadsSummaryResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadsSummaryResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{9} } -func (x *ListClustersRequest) GetTeamId() string { +func (x *GetWorkloadsSummaryResponse) GetCost() *WorkloadMetricBreakdown { if x != nil { - return x.TeamId - } - return "" -} - -func (x *ListClustersRequest) GetSearch() string { - if x != nil && x.Search != nil { - return *x.Search + return x.Cost } - return "" + return nil } -func (x *ListClustersRequest) GetPagination() *Pagination { +func (x *GetWorkloadsSummaryResponse) GetCpuUsage() *WorkloadMetricBreakdown { if x != nil { - return x.Pagination + return x.CpuUsage } return nil } -// GetClusterRequest is used to fetch details of a specific cluster for a team. -type GetClusterRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups -} - -func (x *GetClusterRequest) Reset() { - *x = GetClusterRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetClusterRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetClusterRequest) ProtoMessage() {} - -func (x *GetClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GetWorkloadsSummaryResponse) GetMemoryUsage() *WorkloadMetricBreakdown { + if x != nil { + return x.MemoryUsage } - return mi.MessageOf(x) -} - -// Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead. -func (*GetClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{11} + return nil } -func (x *GetClusterRequest) GetTeamId() string { +func (x *GetWorkloadsSummaryResponse) GetGpuUsage() *WorkloadMetricBreakdown { if x != nil { - return x.TeamId + return x.GpuUsage } - return "" + return nil } -func (x *GetClusterRequest) GetClusterId() string { +func (x *GetWorkloadsSummaryResponse) GetTotalWorkloadCount() int32 { if x != nil { - return x.ClusterId + return x.TotalWorkloadCount } - return "" + return 0 } -func (x *GetClusterRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialCost() *WorkloadMetricBreakdown { if x != nil { - return x.StartTime + return x.OptimizationPotentialCost } return nil } -func (x *GetClusterRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialCpu() *WorkloadMetricBreakdown { if x != nil { - return x.EndTime + return x.OptimizationPotentialCpu } return nil } -func (x *GetClusterRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialMemory() *WorkloadMetricBreakdown { + if x != nil { + return x.OptimizationPotentialMemory } - return 0 + return nil } -func (x *GetClusterRequest) GetNodeGroupNames() []string { +func (x *GetWorkloadsSummaryResponse) GetOptimizationPotentialGpu() *WorkloadMetricBreakdown { if x != nil { - return x.NodeGroupNames + return x.OptimizationPotentialGpu } return nil } -// DeleteClusterRequest is used to delete a cluster and all its resources. -type DeleteClusterRequest struct { +// ListWorkloadsPaginatedResponse is one page of workloads plus the cursor for +// the next page and the total matching count (before pagination). +type ListWorkloadsPaginatedResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // This page's workloads. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` // Opaque cursor for the next page; empty = no more data. + TotalCount int64 `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"` // Total workloads matching the filters, before pagination. + PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` // Effective page size applied after clamping; reflects the requested/clamped size, not len(workload_items). } -func (x *DeleteClusterRequest) Reset() { - *x = DeleteClusterRequest{} +func (x *ListWorkloadsPaginatedResponse) Reset() { + *x = ListWorkloadsPaginatedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[12] + mi := &file_api_v1_k8s_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteClusterRequest) String() string { +func (x *ListWorkloadsPaginatedResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteClusterRequest) ProtoMessage() {} +func (*ListWorkloadsPaginatedResponse) ProtoMessage() {} -func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[12] +func (x *ListWorkloadsPaginatedResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1295,96 +1279,70 @@ func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteClusterRequest.ProtoReflect.Descriptor instead. -func (*DeleteClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{12} +// Deprecated: Use ListWorkloadsPaginatedResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadsPaginatedResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{10} } -func (x *DeleteClusterRequest) GetTeamId() string { +func (x *ListWorkloadsPaginatedResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { - return x.TeamId + return x.WorkloadItems } - return "" + return nil } -func (x *DeleteClusterRequest) GetClusterId() string { +func (x *ListWorkloadsPaginatedResponse) GetNextPageToken() string { if x != nil { - return x.ClusterId + return x.NextPageToken } return "" } -// DeleteClusterResponse is the response for a delete cluster request. -type DeleteClusterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeleteClusterResponse) Reset() { - *x = DeleteClusterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ListWorkloadsPaginatedResponse) GetTotalCount() int64 { + if x != nil { + return x.TotalCount } + return 0 } -func (x *DeleteClusterResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteClusterResponse) ProtoMessage() {} - -func (x *DeleteClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListWorkloadsPaginatedResponse) GetPageSize() int32 { + if x != nil { + return x.PageSize } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteClusterResponse.ProtoReflect.Descriptor instead. -func (*DeleteClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{13} + return 0 } -// UpdateClusterRequest is used to update the configuration of an existing cluster. -// only certain fields can be updated, such as name -type UpdateClusterRequest struct { +// GetResourcesRequest is uset to fetch resources from db. +type GetResourcesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Updated cluster details. - CpuCostPerHour float64 `protobuf:"fixed64,4,opt,name=cpu_cost_per_hour,json=cpuCostPerHour,proto3" json:"cpu_cost_per_hour,omitempty"` // Estimated CPU cost per hour for one vcpu. - MemoryCostPerHour float64 `protobuf:"fixed64,5,opt,name=memory_cost_per_hour,json=memoryCostPerHour,proto3" json:"memory_cost_per_hour,omitempty"` // Estimated memory cost per hour for one GiB of memory. - GpuCostPerHour float64 `protobuf:"fixed64,6,opt,name=gpu_cost_per_hour,json=gpuCostPerHour,proto3" json:"gpu_cost_per_hour,omitempty"` // Estimate GPU cost per hour for one GPU. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // Type of object to get. + Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter resources by name + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + Filters []*ResourceFieldFilter `protobuf:"bytes,12,rep,name=filters,proto3" json:"filters,omitempty"` // Optional field-level filters; multiple filters AND together } -func (x *UpdateClusterRequest) Reset() { - *x = UpdateClusterRequest{} +func (x *GetResourcesRequest) Reset() { + *x = GetResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[14] + mi := &file_api_v1_k8s_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateClusterRequest) String() string { +func (x *GetResourcesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateClusterRequest) ProtoMessage() {} +func (*GetResourcesRequest) ProtoMessage() {} -func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[14] +func (x *GetResourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1395,79 +1353,86 @@ func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateClusterRequest.ProtoReflect.Descriptor instead. -func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{14} +// Deprecated: Use GetResourcesRequest.ProtoReflect.Descriptor instead. +func (*GetResourcesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{11} } -func (x *UpdateClusterRequest) GetTeamId() string { +func (x *GetResourcesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateClusterRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *GetResourcesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -func (x *UpdateClusterRequest) GetClusterName() string { +func (x *GetResourcesRequest) GetKind() K8SObjectKind { if x != nil { - return x.ClusterName + return x.Kind } - return "" + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -func (x *UpdateClusterRequest) GetCpuCostPerHour() float64 { - if x != nil { - return x.CpuCostPerHour +func (x *GetResourcesRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search } - return 0 + return "" } -func (x *UpdateClusterRequest) GetMemoryCostPerHour() float64 { +func (x *GetResourcesRequest) GetPagination() *Pagination { if x != nil { - return x.MemoryCostPerHour + return x.Pagination } - return 0 + return nil } -func (x *UpdateClusterRequest) GetGpuCostPerHour() float64 { +func (x *GetResourcesRequest) GetFilters() []*ResourceFieldFilter { if x != nil { - return x.GpuCostPerHour + return x.Filters } - return 0 + return nil } -// UpdateClusterResponse is the response for an update cluster request. -type UpdateClusterResponse struct { +// GetPodsRequest is used to fetch Pod resources from db. +type GetPodsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Updated cluster details. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Search *string `protobuf:"bytes,4,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter pods by name + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters + NodeGroupNames []string `protobuf:"bytes,25,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups + NodeIds []string `protobuf:"bytes,26,rep,name=node_ids,json=nodeIds,proto3" json:"node_ids,omitempty"` // Optional filter for specific node IDs + StartTime *timestamppb.Timestamp `protobuf:"bytes,27,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // Start time for metrics query + EndTime *timestamppb.Timestamp `protobuf:"bytes,28,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` // End time for metrics query } -func (x *UpdateClusterResponse) Reset() { - *x = UpdateClusterResponse{} +func (x *GetPodsRequest) Reset() { + *x = GetPodsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[15] + mi := &file_api_v1_k8s_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateClusterResponse) String() string { +func (x *GetPodsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateClusterResponse) ProtoMessage() {} +func (*GetPodsRequest) ProtoMessage() {} -func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[15] +func (x *GetPodsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1478,45 +1443,94 @@ func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateClusterResponse.ProtoReflect.Descriptor instead. -func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{15} +// Deprecated: Use GetPodsRequest.ProtoReflect.Descriptor instead. +func (*GetPodsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{12} } -func (x *UpdateClusterResponse) GetCluster() *Cluster { +func (x *GetPodsRequest) GetTeamId() string { if x != nil { - return x.Cluster + return x.TeamId + } + return "" +} + +func (x *GetPodsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +func (x *GetPodsRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search + } + return "" +} + +func (x *GetPodsRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination } return nil } -// GetResourcesResponse is the response for getting k8s resources. -type GetResourcesResponse struct { +func (x *GetPodsRequest) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *GetPodsRequest) GetNodeIds() []string { + if x != nil { + return x.NodeIds + } + return nil +} + +func (x *GetPodsRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetPodsRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +// GetPodsResponse is the response for getting pod resources. +type GetPodsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Return list of resources requested + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of pods. Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information } -func (x *GetResourcesResponse) Reset() { - *x = GetResourcesResponse{} +func (x *GetPodsResponse) Reset() { + *x = GetPodsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[16] + mi := &file_api_v1_k8s_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetResourcesResponse) String() string { +func (x *GetPodsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetResourcesResponse) ProtoMessage() {} +func (*GetPodsResponse) ProtoMessage() {} -func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[16] +func (x *GetPodsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1527,52 +1541,59 @@ func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetResourcesResponse.ProtoReflect.Descriptor instead. -func (*GetResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{16} +// Deprecated: Use GetPodsResponse.ProtoReflect.Descriptor instead. +func (*GetPodsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{13} } -func (x *GetResourcesResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetPodsResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { return x.WorkloadItems } return nil } -func (x *GetResourcesResponse) GetPagination() *Pagination { +func (x *GetPodsResponse) GetPagination() *Pagination { if x != nil { return x.Pagination } return nil } -// CreateClusterRequest is used to create a new cluster. -type CreateClusterRequest struct { +// GetWorkloadRequest is used to fetch details of a specific workload in a cluster. +type GetWorkloadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Name of the new cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + WithDetails bool `protobuf:"varint,12,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` // Optional flag to include additional resource details + WithMetadata bool `protobuf:"varint,13,opt,name=with_metadata,json=withMetadata,proto3" json:"with_metadata,omitempty"` // Optional flag to include metadata + StartTime *timestamppb.Timestamp `protobuf:"bytes,21,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,22,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` } -func (x *CreateClusterRequest) Reset() { - *x = CreateClusterRequest{} +func (x *GetWorkloadRequest) Reset() { + *x = GetWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[17] + mi := &file_api_v1_k8s_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateClusterRequest) String() string { +func (x *GetWorkloadRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateClusterRequest) ProtoMessage() {} +func (*GetWorkloadRequest) ProtoMessage() {} -func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[17] +func (x *GetWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1583,108 +1604,104 @@ func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateClusterRequest.ProtoReflect.Descriptor instead. -func (*CreateClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{17} +// Deprecated: Use GetWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{14} } -func (x *CreateClusterRequest) GetTeamId() string { +func (x *GetWorkloadRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *CreateClusterRequest) GetClusterName() string { +func (x *GetWorkloadRequest) GetClusterId() string { if x != nil { - return x.ClusterName + return x.ClusterId } return "" } -// CreateClusterResponse is the response for a create cluster request. -type CreateClusterResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the created cluster. - Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +func (x *GetWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" } -func (x *CreateClusterResponse) Reset() { - *x = CreateClusterResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GetWorkloadRequest) GetUid() string { + if x != nil { + return x.Uid } + return "" } -func (x *CreateClusterResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *GetWorkloadRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted + } + return false } -func (*CreateClusterResponse) ProtoMessage() {} - -func (x *CreateClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GetWorkloadRequest) GetWithDetails() bool { + if x != nil { + return x.WithDetails } - return mi.MessageOf(x) + return false } -// Deprecated: Use CreateClusterResponse.ProtoReflect.Descriptor instead. -func (*CreateClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{18} +func (x *GetWorkloadRequest) GetWithMetadata() bool { + if x != nil { + return x.WithMetadata + } + return false } -func (x *CreateClusterResponse) GetCluster() *Cluster { +func (x *GetWorkloadRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.Cluster + return x.StartTime } return nil } -func (x *CreateClusterResponse) GetToken() string { +func (x *GetWorkloadRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Token + return x.EndTime } - return "" + return nil } -// ResetClusterTokenRequest is used to reset the token for a cluster. -type ResetClusterTokenRequest struct { +// GetClustersRequest is used to fetch clusters for a specific team. +type GetClustersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups } -func (x *ResetClusterTokenRequest) Reset() { - *x = ResetClusterTokenRequest{} +func (x *GetClustersRequest) Reset() { + *x = GetClustersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[19] + mi := &file_api_v1_k8s_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResetClusterTokenRequest) String() string { +func (x *GetClustersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResetClusterTokenRequest) ProtoMessage() {} +func (*GetClustersRequest) ProtoMessage() {} -func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[19] +func (x *GetClustersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1695,51 +1712,77 @@ func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResetClusterTokenRequest.ProtoReflect.Descriptor instead. -func (*ResetClusterTokenRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{19} +// Deprecated: Use GetClustersRequest.ProtoReflect.Descriptor instead. +func (*GetClustersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{15} } -func (x *ResetClusterTokenRequest) GetTeamId() string { +func (x *GetClustersRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *ResetClusterTokenRequest) GetClusterId() string { +func (x *GetClustersRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.ClusterId + return x.StartTime } - return "" -} - -// ResetClusterTokenResponse is the response for a reset cluster token request. -type ResetClusterTokenResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. + return nil } -func (x *ResetClusterTokenResponse) Reset() { - *x = ResetClusterTokenResponse{} +func (x *GetClustersRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetClustersRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +func (x *GetClustersRequest) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +// ListClustersRequest is used to fetch clusters for a specific team with pagination. +// Deprecated: Use GetClustersRequest instead. +// +// Deprecated: Marked as deprecated in api/v1/k8s.proto. +type ListClustersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + Search *string `protobuf:"bytes,2,opt,name=search,proto3,oneof" json:"search,omitempty"` // Search term to filter clusters by name or ID + Pagination *Pagination `protobuf:"bytes,11,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination parameters +} + +func (x *ListClustersRequest) Reset() { + *x = ListClustersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[20] + mi := &file_api_v1_k8s_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResetClusterTokenResponse) String() string { +func (x *ListClustersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResetClusterTokenResponse) ProtoMessage() {} +func (*ListClustersRequest) ProtoMessage() {} -func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[20] +func (x *ListClustersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1750,49 +1793,63 @@ func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResetClusterTokenResponse.ProtoReflect.Descriptor instead. -func (*ResetClusterTokenResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{20} +// Deprecated: Use ListClustersRequest.ProtoReflect.Descriptor instead. +func (*ListClustersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{16} } -func (x *ResetClusterTokenResponse) GetToken() string { +func (x *ListClustersRequest) GetTeamId() string { if x != nil { - return x.Token + return x.TeamId } return "" } -// GetNodeGroupsRequest is used to fetch node groups for a specific cluster. -type GetNodeGroupsRequest struct { +func (x *ListClustersRequest) GetSearch() string { + if x != nil && x.Search != nil { + return *x.Search + } + return "" +} + +func (x *ListClustersRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +// GetClusterRequest is used to fetch details of a specific cluster for a team. +type GetClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` - ShowDeleted bool `protobuf:"varint,21,opt,name=show_deleted,json=showDeleted,proto3" json:"show_deleted,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + NodeGroupNames []string `protobuf:"bytes,14,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional filter for node groups } -func (x *GetNodeGroupsRequest) Reset() { - *x = GetNodeGroupsRequest{} +func (x *GetClusterRequest) Reset() { + *x = GetClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[21] + mi := &file_api_v1_k8s_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsRequest) String() string { +func (x *GetClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsRequest) ProtoMessage() {} +func (*GetClusterRequest) ProtoMessage() {} -func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[21] +func (x *GetClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1803,79 +1860,80 @@ func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{21} +// Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead. +func (*GetClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{17} } -func (x *GetNodeGroupsRequest) GetTeamId() string { +func (x *GetClusterRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetNodeGroupsRequest) GetClusterId() string { +func (x *GetClusterRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetNodeGroupsRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetClusterRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { return x.StartTime } return nil } -func (x *GetNodeGroupsRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetClusterRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { return x.EndTime } return nil } -func (x *GetNodeGroupsRequest) GetBucketSize() int32 { +func (x *GetClusterRequest) GetBucketSize() int32 { if x != nil && x.BucketSize != nil { return *x.BucketSize } return 0 } -func (x *GetNodeGroupsRequest) GetShowDeleted() bool { +func (x *GetClusterRequest) GetNodeGroupNames() []string { if x != nil { - return x.ShowDeleted + return x.NodeGroupNames } - return false + return nil } -// GetAllNodeGroupsRequest is used to fetch all node groups for a specific team. -type GetAllNodeGroupsRequest struct { +// DeleteClusterRequest is used to delete a cluster and all its resources. +type DeleteClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. } -func (x *GetAllNodeGroupsRequest) Reset() { - *x = GetAllNodeGroupsRequest{} +func (x *DeleteClusterRequest) Reset() { + *x = DeleteClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[22] + mi := &file_api_v1_k8s_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAllNodeGroupsRequest) String() string { +func (x *DeleteClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAllNodeGroupsRequest) ProtoMessage() {} +func (*DeleteClusterRequest) ProtoMessage() {} -func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[22] +func (x *DeleteClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1886,44 +1944,49 @@ func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAllNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GetAllNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{22} +// Deprecated: Use DeleteClusterRequest.ProtoReflect.Descriptor instead. +func (*DeleteClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{18} } -func (x *GetAllNodeGroupsRequest) GetTeamId() string { +func (x *DeleteClusterRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -// GetNodeGroupsResponse contains the list of node groups for a specific cluster. -type GetNodeGroupsResponse struct { +func (x *DeleteClusterRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// DeleteClusterResponse is the response for a delete cluster request. +type DeleteClusterResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. } -func (x *GetNodeGroupsResponse) Reset() { - *x = GetNodeGroupsResponse{} +func (x *DeleteClusterResponse) Reset() { + *x = DeleteClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[23] + mi := &file_api_v1_k8s_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsResponse) String() string { +func (x *DeleteClusterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsResponse) ProtoMessage() {} +func (*DeleteClusterResponse) ProtoMessage() {} -func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[23] +func (x *DeleteClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,44 +1997,43 @@ func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{23} -} - -func (x *GetNodeGroupsResponse) GetNodeGroups() []*NodeGroup { - if x != nil { - return x.NodeGroups - } - return nil +// Deprecated: Use DeleteClusterResponse.ProtoReflect.Descriptor instead. +func (*DeleteClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{19} } -// GetAllNodeGroupsResponse contains the list of all node groups for a specific team. -type GetAllNodeGroupsResponse struct { +// UpdateClusterRequest is used to update the configuration of an existing cluster. +// only certain fields can be updated, such as name +type UpdateClusterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroupMap map[string]*NodeGroup `protobuf:"bytes,1,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of clusterId+nodeGroupName to NodeGroup. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + ClusterName string `protobuf:"bytes,3,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Updated cluster details. + CpuCostPerHour float64 `protobuf:"fixed64,4,opt,name=cpu_cost_per_hour,json=cpuCostPerHour,proto3" json:"cpu_cost_per_hour,omitempty"` // Estimated CPU cost per hour for one vcpu. + MemoryCostPerHour float64 `protobuf:"fixed64,5,opt,name=memory_cost_per_hour,json=memoryCostPerHour,proto3" json:"memory_cost_per_hour,omitempty"` // Estimated memory cost per hour for one GiB of memory. + GpuCostPerHour float64 `protobuf:"fixed64,6,opt,name=gpu_cost_per_hour,json=gpuCostPerHour,proto3" json:"gpu_cost_per_hour,omitempty"` // Estimate GPU cost per hour for one GPU. } -func (x *GetAllNodeGroupsResponse) Reset() { - *x = GetAllNodeGroupsResponse{} +func (x *UpdateClusterRequest) Reset() { + *x = UpdateClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[24] + mi := &file_api_v1_k8s_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAllNodeGroupsResponse) String() string { +func (x *UpdateClusterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAllNodeGroupsResponse) ProtoMessage() {} +func (*UpdateClusterRequest) ProtoMessage() {} -func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[24] +func (x *UpdateClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1982,43 +2044,79 @@ func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAllNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GetAllNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{24} +// Deprecated: Use UpdateClusterRequest.ProtoReflect.Descriptor instead. +func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{20} } -func (x *GetAllNodeGroupsResponse) GetNodeGroupMap() map[string]*NodeGroup { +func (x *UpdateClusterRequest) GetTeamId() string { if x != nil { - return x.NodeGroupMap + return x.TeamId } - return nil -} - -type NodeGroupSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. + return "" } -func (x *NodeGroupSet) Reset() { - *x = NodeGroupSet{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *UpdateClusterRequest) GetClusterId() string { + if x != nil { + return x.ClusterId } + return "" } -func (x *NodeGroupSet) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *UpdateClusterRequest) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" } -func (*NodeGroupSet) ProtoMessage() {} +func (x *UpdateClusterRequest) GetCpuCostPerHour() float64 { + if x != nil { + return x.CpuCostPerHour + } + return 0 +} -func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[25] +func (x *UpdateClusterRequest) GetMemoryCostPerHour() float64 { + if x != nil { + return x.MemoryCostPerHour + } + return 0 +} + +func (x *UpdateClusterRequest) GetGpuCostPerHour() float64 { + if x != nil { + return x.GpuCostPerHour + } + return 0 +} + +// UpdateClusterResponse is the response for an update cluster request. +type UpdateClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Updated cluster details. +} + +func (x *UpdateClusterResponse) Reset() { + *x = UpdateClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateClusterResponse) ProtoMessage() {} + +func (x *UpdateClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2029,48 +2127,45 @@ func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupSet.ProtoReflect.Descriptor instead. -func (*NodeGroupSet) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{25} +// Deprecated: Use UpdateClusterResponse.ProtoReflect.Descriptor instead. +func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{21} } -func (x *NodeGroupSet) GetNodeGroups() []*NodeGroup { +func (x *UpdateClusterResponse) GetCluster() *Cluster { if x != nil { - return x.NodeGroups + return x.Cluster } return nil } -// GetNodeGroupsUtilizationRequest is used to fetch timeseries utilization data for node groups for a specific cluster. -type GetNodeGroupsUtilizationRequest struct { +// GetResourcesResponse is the response for getting k8s resources. +type GetResourcesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Return list of resources requested + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information } -func (x *GetNodeGroupsUtilizationRequest) Reset() { - *x = GetNodeGroupsUtilizationRequest{} +func (x *GetResourcesResponse) Reset() { + *x = GetResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[26] + mi := &file_api_v1_k8s_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsUtilizationRequest) String() string { +func (x *GetResourcesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsUtilizationRequest) ProtoMessage() {} +func (*GetResourcesResponse) ProtoMessage() {} -func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[26] +func (x *GetResourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2081,75 +2176,53 @@ func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsUtilizationRequest.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsUtilizationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{26} -} - -func (x *GetNodeGroupsUtilizationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *GetNodeGroupsUtilizationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetResourcesResponse.ProtoReflect.Descriptor instead. +func (*GetResourcesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{22} } -func (x *GetNodeGroupsUtilizationRequest) GetStartTime() *timestamppb.Timestamp { +func (x *GetResourcesResponse) GetWorkloadItems() []*WorkloadItem { if x != nil { - return x.StartTime + return x.WorkloadItems } return nil } -func (x *GetNodeGroupsUtilizationRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GetResourcesResponse) GetPagination() *Pagination { if x != nil { - return x.EndTime + return x.Pagination } return nil } -func (x *GetNodeGroupsUtilizationRequest) GetBucketSize() int32 { - if x != nil && x.BucketSize != nil { - return *x.BucketSize - } - return 0 -} - -// GetNodeGroupsResponse contains the list of node groups for a specific cluster. -type GetNodeGroupsUtilizationResponse struct { +// GetResourceFilterOptionsRequest asks for the distinct filterable field values for a resource kind. +type GetResourceFilterOptionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroupToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,1,rep,name=node_group_to_util_metrics,json=nodeGroupToUtilMetrics,proto3" json:"node_group_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - InstanceTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,6,rep,name=instance_type_to_util_metrics,json=instanceTypeToUtilMetrics,proto3" json:"instance_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ReservationTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,11,rep,name=reservation_type_to_util_metrics,json=reservationTypeToUtilMetrics,proto3" json:"reservation_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - LogicalAzToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,16,rep,name=logical_az_to_util_metrics,json=logicalAzToUtilMetrics,proto3" json:"logical_az_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + Kind K8SObjectKind `protobuf:"varint,3,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` } -func (x *GetNodeGroupsUtilizationResponse) Reset() { - *x = GetNodeGroupsUtilizationResponse{} +func (x *GetResourceFilterOptionsRequest) Reset() { + *x = GetResourceFilterOptionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[27] + mi := &file_api_v1_k8s_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsUtilizationResponse) String() string { +func (x *GetResourceFilterOptionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsUtilizationResponse) ProtoMessage() {} +func (*GetResourceFilterOptionsRequest) ProtoMessage() {} -func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[27] +func (x *GetResourceFilterOptionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2160,81 +2233,58 @@ func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsUtilizationResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsUtilizationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{27} -} - -func (x *GetNodeGroupsUtilizationResponse) GetNodeGroupToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { - if x != nil { - return x.NodeGroupToUtilMetrics - } - return nil +// Deprecated: Use GetResourceFilterOptionsRequest.ProtoReflect.Descriptor instead. +func (*GetResourceFilterOptionsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{23} } -func (x *GetNodeGroupsUtilizationResponse) GetInstanceTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { +func (x *GetResourceFilterOptionsRequest) GetTeamId() string { if x != nil { - return x.InstanceTypeToUtilMetrics + return x.TeamId } - return nil + return "" } -func (x *GetNodeGroupsUtilizationResponse) GetReservationTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { - if x != nil { - return x.ReservationTypeToUtilMetrics +func (x *GetResourceFilterOptionsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } - return nil + return "" } -func (x *GetNodeGroupsUtilizationResponse) GetLogicalAzToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { +func (x *GetResourceFilterOptionsRequest) GetKind() K8SObjectKind { if x != nil { - return x.LogicalAzToUtilMetrics + return x.Kind } - return nil + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -type NodeGroupMetric struct { +// GetResourceFilterOptionsResponse returns the available filter options per field. +type GetResourceFilterOptionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` - MaxConcurrentNodeCount int32 `protobuf:"varint,2,opt,name=max_concurrent_node_count,json=maxConcurrentNodeCount,proto3" json:"max_concurrent_node_count,omitempty"` - CapacityCpu int64 `protobuf:"varint,11,opt,name=capacity_cpu,json=capacityCpu,proto3" json:"capacity_cpu,omitempty"` // millicores - CapacityMemory int64 `protobuf:"varint,12,opt,name=capacity_memory,json=capacityMemory,proto3" json:"capacity_memory,omitempty"` // bytes - CapacityGpuVram int64 `protobuf:"varint,13,opt,name=capacity_gpu_vram,json=capacityGpuVram,proto3" json:"capacity_gpu_vram,omitempty"` // bytes - CapacityGpuDevices int64 `protobuf:"varint,14,opt,name=capacity_gpu_devices,json=capacityGpuDevices,proto3" json:"capacity_gpu_devices,omitempty"` // number - AggrCpuReq int64 `protobuf:"varint,21,opt,name=aggr_cpu_req,json=aggrCpuReq,proto3" json:"aggr_cpu_req,omitempty"` // millicores - AggrMemoryReq int64 `protobuf:"varint,22,opt,name=aggr_memory_req,json=aggrMemoryReq,proto3" json:"aggr_memory_req,omitempty"` // bytes - AggrGpuReq int64 `protobuf:"varint,23,opt,name=aggr_gpu_req,json=aggrGpuReq,proto3" json:"aggr_gpu_req,omitempty"` // number - UtilCpuAvgUsage float32 `protobuf:"fixed32,31,opt,name=util_cpu_avg_usage,json=utilCpuAvgUsage,proto3" json:"util_cpu_avg_usage,omitempty"` // millicores - UtilMemoryAvgUsage float32 `protobuf:"fixed32,32,opt,name=util_memory_avg_usage,json=utilMemoryAvgUsage,proto3" json:"util_memory_avg_usage,omitempty"` // bytes - UtilGpuVramAvgUsage float32 `protobuf:"fixed32,33,opt,name=util_gpu_vram_avg_usage,json=utilGpuVramAvgUsage,proto3" json:"util_gpu_vram_avg_usage,omitempty"` // bytes - UtilGpuDevice float32 `protobuf:"fixed32,34,opt,name=util_gpu_device,json=utilGpuDevice,proto3" json:"util_gpu_device,omitempty"` // pct - HourlyCost *money.Money `protobuf:"bytes,50,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"` // average hourly cost within the time bucket - HourlyCpuCost *money.Money `protobuf:"bytes,51,opt,name=hourly_cpu_cost,json=hourlyCpuCost,proto3" json:"hourly_cpu_cost,omitempty"` // cost for cpu - HourlyMemoryCost *money.Money `protobuf:"bytes,52,opt,name=hourly_memory_cost,json=hourlyMemoryCost,proto3" json:"hourly_memory_cost,omitempty"` // cost for memory - HourlyGpuCost *money.Money `protobuf:"bytes,53,opt,name=hourly_gpu_cost,json=hourlyGpuCost,proto3" json:"hourly_gpu_cost,omitempty"` // cost for gpu - BucketTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=bucket_time,json=bucketTime,proto3" json:"bucket_time,omitempty"` + Options []*ResourceFilterFieldOptions `protobuf:"bytes,1,rep,name=options,proto3" json:"options,omitempty"` } -func (x *NodeGroupMetric) Reset() { - *x = NodeGroupMetric{} +func (x *GetResourceFilterOptionsResponse) Reset() { + *x = GetResourceFilterOptionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[28] + mi := &file_api_v1_k8s_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupMetric) String() string { +func (x *GetResourceFilterOptionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupMetric) ProtoMessage() {} +func (*GetResourceFilterOptionsResponse) ProtoMessage() {} -func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[28] +func (x *GetResourceFilterOptionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2245,163 +2295,1581 @@ func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupMetric.ProtoReflect.Descriptor instead. -func (*NodeGroupMetric) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{28} +// Deprecated: Use GetResourceFilterOptionsResponse.ProtoReflect.Descriptor instead. +func (*GetResourceFilterOptionsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{24} } -func (x *NodeGroupMetric) GetNodeCount() int32 { +func (x *GetResourceFilterOptionsResponse) GetOptions() []*ResourceFilterFieldOptions { if x != nil { - return x.NodeCount + return x.Options } - return 0 + return nil } -func (x *NodeGroupMetric) GetMaxConcurrentNodeCount() int32 { - if x != nil { - return x.MaxConcurrentNodeCount - } - return 0 +// CreateClusterRequest is used to create a new cluster. +type CreateClusterRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // Name of the new cluster. } -func (x *NodeGroupMetric) GetCapacityCpu() int64 { - if x != nil { - return x.CapacityCpu +func (x *CreateClusterRequest) Reset() { + *x = CreateClusterRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *NodeGroupMetric) GetCapacityMemory() int64 { - if x != nil { - return x.CapacityMemory - } - return 0 +func (x *CreateClusterRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeGroupMetric) GetCapacityGpuVram() int64 { - if x != nil { - return x.CapacityGpuVram +func (*CreateClusterRequest) ProtoMessage() {} + +func (x *CreateClusterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *NodeGroupMetric) GetCapacityGpuDevices() int64 { +// Deprecated: Use CreateClusterRequest.ProtoReflect.Descriptor instead. +func (*CreateClusterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{25} +} + +func (x *CreateClusterRequest) GetTeamId() string { if x != nil { - return x.CapacityGpuDevices + return x.TeamId } - return 0 + return "" } -func (x *NodeGroupMetric) GetAggrCpuReq() int64 { +func (x *CreateClusterRequest) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +// CreateClusterResponse is the response for a create cluster request. +type CreateClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the created cluster. + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +} + +func (x *CreateClusterResponse) Reset() { + *x = CreateClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateClusterResponse) ProtoMessage() {} + +func (x *CreateClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[26] + 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 CreateClusterResponse.ProtoReflect.Descriptor instead. +func (*CreateClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{26} +} + +func (x *CreateClusterResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +func (x *CreateClusterResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// ResetClusterTokenRequest is used to reset the token for a cluster. +type ResetClusterTokenRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. +} + +func (x *ResetClusterTokenRequest) Reset() { + *x = ResetClusterTokenRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResetClusterTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetClusterTokenRequest) ProtoMessage() {} + +func (x *ResetClusterTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[27] + 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 ResetClusterTokenRequest.ProtoReflect.Descriptor instead. +func (*ResetClusterTokenRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{27} +} + +func (x *ResetClusterTokenRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ResetClusterTokenRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ResetClusterTokenResponse is the response for a reset cluster token request. +type ResetClusterTokenResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` // Token for the new cluster. +} + +func (x *ResetClusterTokenResponse) Reset() { + *x = ResetClusterTokenResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResetClusterTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetClusterTokenResponse) ProtoMessage() {} + +func (x *ResetClusterTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[28] + 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 ResetClusterTokenResponse.ProtoReflect.Descriptor instead. +func (*ResetClusterTokenResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{28} +} + +func (x *ResetClusterTokenResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +// GetNodeGroupsRequest is used to fetch node groups for a specific cluster. +type GetNodeGroupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` + ShowDeleted bool `protobuf:"varint,21,opt,name=show_deleted,json=showDeleted,proto3" json:"show_deleted,omitempty"` +} + +func (x *GetNodeGroupsRequest) Reset() { + *x = GetNodeGroupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsRequest) ProtoMessage() {} + +func (x *GetNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[29] + 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 GetNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{29} +} + +func (x *GetNodeGroupsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeGroupsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeGroupsRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetNodeGroupsRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetNodeGroupsRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +func (x *GetNodeGroupsRequest) GetShowDeleted() bool { + if x != nil { + return x.ShowDeleted + } + return false +} + +// GetAllNodeGroupsRequest is used to fetch all node groups for a specific team. +type GetAllNodeGroupsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. +} + +func (x *GetAllNodeGroupsRequest) Reset() { + *x = GetAllNodeGroupsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllNodeGroupsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllNodeGroupsRequest) ProtoMessage() {} + +func (x *GetAllNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[30] + 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 GetAllNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GetAllNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{30} +} + +func (x *GetAllNodeGroupsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +// GetNodeGroupsResponse contains the list of node groups for a specific cluster. +type GetNodeGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. +} + +func (x *GetNodeGroupsResponse) Reset() { + *x = GetNodeGroupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsResponse) ProtoMessage() {} + +func (x *GetNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[31] + 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 GetNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{31} +} + +func (x *GetNodeGroupsResponse) GetNodeGroups() []*NodeGroup { + if x != nil { + return x.NodeGroups + } + return nil +} + +// GetAllNodeGroupsResponse contains the list of all node groups for a specific team. +type GetAllNodeGroupsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroupMap map[string]*NodeGroup `protobuf:"bytes,1,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of clusterId+nodeGroupName to NodeGroup. +} + +func (x *GetAllNodeGroupsResponse) Reset() { + *x = GetAllNodeGroupsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAllNodeGroupsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAllNodeGroupsResponse) ProtoMessage() {} + +func (x *GetAllNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[32] + 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 GetAllNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GetAllNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{32} +} + +func (x *GetAllNodeGroupsResponse) GetNodeGroupMap() map[string]*NodeGroup { + if x != nil { + return x.NodeGroupMap + } + return nil +} + +type NodeGroupSet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroups []*NodeGroup `protobuf:"bytes,1,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` // List of node groups. +} + +func (x *NodeGroupSet) Reset() { + *x = NodeGroupSet{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupSet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupSet) ProtoMessage() {} + +func (x *NodeGroupSet) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[33] + 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 NodeGroupSet.ProtoReflect.Descriptor instead. +func (*NodeGroupSet) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{33} +} + +func (x *NodeGroupSet) GetNodeGroups() []*NodeGroup { + if x != nil { + return x.NodeGroups + } + return nil +} + +// GetNodeGroupsUtilizationRequest is used to fetch timeseries utilization data for node groups for a specific cluster. +type GetNodeGroupsUtilizationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + BucketSize *int32 `protobuf:"varint,13,opt,name=bucket_size,json=bucketSize,proto3,oneof" json:"bucket_size,omitempty"` +} + +func (x *GetNodeGroupsUtilizationRequest) Reset() { + *x = GetNodeGroupsUtilizationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsUtilizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsUtilizationRequest) ProtoMessage() {} + +func (x *GetNodeGroupsUtilizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[34] + 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 GetNodeGroupsUtilizationRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsUtilizationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{34} +} + +func (x *GetNodeGroupsUtilizationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeGroupsUtilizationRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeGroupsUtilizationRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *GetNodeGroupsUtilizationRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *GetNodeGroupsUtilizationRequest) GetBucketSize() int32 { + if x != nil && x.BucketSize != nil { + return *x.BucketSize + } + return 0 +} + +// GetNodeGroupsResponse contains the list of node groups for a specific cluster. +type GetNodeGroupsUtilizationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroupToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,1,rep,name=node_group_to_util_metrics,json=nodeGroupToUtilMetrics,proto3" json:"node_group_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + InstanceTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,6,rep,name=instance_type_to_util_metrics,json=instanceTypeToUtilMetrics,proto3" json:"instance_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ReservationTypeToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,11,rep,name=reservation_type_to_util_metrics,json=reservationTypeToUtilMetrics,proto3" json:"reservation_type_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + LogicalAzToUtilMetrics map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics `protobuf:"bytes,16,rep,name=logical_az_to_util_metrics,json=logicalAzToUtilMetrics,proto3" json:"logical_az_to_util_metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetNodeGroupsUtilizationResponse) Reset() { + *x = GetNodeGroupsUtilizationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupsUtilizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupsUtilizationResponse) ProtoMessage() {} + +func (x *GetNodeGroupsUtilizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[35] + 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 GetNodeGroupsUtilizationResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsUtilizationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{35} +} + +func (x *GetNodeGroupsUtilizationResponse) GetNodeGroupToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.NodeGroupToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetInstanceTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.InstanceTypeToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetReservationTypeToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.ReservationTypeToUtilMetrics + } + return nil +} + +func (x *GetNodeGroupsUtilizationResponse) GetLogicalAzToUtilMetrics() map[string]*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics { + if x != nil { + return x.LogicalAzToUtilMetrics + } + return nil +} + +type NodeGroupMetric struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeCount int32 `protobuf:"varint,1,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` + MaxConcurrentNodeCount int32 `protobuf:"varint,2,opt,name=max_concurrent_node_count,json=maxConcurrentNodeCount,proto3" json:"max_concurrent_node_count,omitempty"` + CapacityCpu int64 `protobuf:"varint,11,opt,name=capacity_cpu,json=capacityCpu,proto3" json:"capacity_cpu,omitempty"` // millicores + CapacityMemory int64 `protobuf:"varint,12,opt,name=capacity_memory,json=capacityMemory,proto3" json:"capacity_memory,omitempty"` // bytes + CapacityGpuVram int64 `protobuf:"varint,13,opt,name=capacity_gpu_vram,json=capacityGpuVram,proto3" json:"capacity_gpu_vram,omitempty"` // bytes + CapacityGpuDevices int64 `protobuf:"varint,14,opt,name=capacity_gpu_devices,json=capacityGpuDevices,proto3" json:"capacity_gpu_devices,omitempty"` // number + AggrCpuReq int64 `protobuf:"varint,21,opt,name=aggr_cpu_req,json=aggrCpuReq,proto3" json:"aggr_cpu_req,omitempty"` // millicores + AggrMemoryReq int64 `protobuf:"varint,22,opt,name=aggr_memory_req,json=aggrMemoryReq,proto3" json:"aggr_memory_req,omitempty"` // bytes + AggrGpuReq int64 `protobuf:"varint,23,opt,name=aggr_gpu_req,json=aggrGpuReq,proto3" json:"aggr_gpu_req,omitempty"` // number + UtilCpuAvgUsage float32 `protobuf:"fixed32,31,opt,name=util_cpu_avg_usage,json=utilCpuAvgUsage,proto3" json:"util_cpu_avg_usage,omitempty"` // millicores + UtilMemoryAvgUsage float32 `protobuf:"fixed32,32,opt,name=util_memory_avg_usage,json=utilMemoryAvgUsage,proto3" json:"util_memory_avg_usage,omitempty"` // bytes + UtilGpuVramAvgUsage float32 `protobuf:"fixed32,33,opt,name=util_gpu_vram_avg_usage,json=utilGpuVramAvgUsage,proto3" json:"util_gpu_vram_avg_usage,omitempty"` // bytes + UtilGpuDevice float32 `protobuf:"fixed32,34,opt,name=util_gpu_device,json=utilGpuDevice,proto3" json:"util_gpu_device,omitempty"` // pct + HourlyCost *money.Money `protobuf:"bytes,50,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"` // average hourly cost within the time bucket + HourlyCpuCost *money.Money `protobuf:"bytes,51,opt,name=hourly_cpu_cost,json=hourlyCpuCost,proto3" json:"hourly_cpu_cost,omitempty"` // cost for cpu + HourlyMemoryCost *money.Money `protobuf:"bytes,52,opt,name=hourly_memory_cost,json=hourlyMemoryCost,proto3" json:"hourly_memory_cost,omitempty"` // cost for memory + HourlyGpuCost *money.Money `protobuf:"bytes,53,opt,name=hourly_gpu_cost,json=hourlyGpuCost,proto3" json:"hourly_gpu_cost,omitempty"` // cost for gpu + BucketTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=bucket_time,json=bucketTime,proto3" json:"bucket_time,omitempty"` +} + +func (x *NodeGroupMetric) Reset() { + *x = NodeGroupMetric{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupMetric) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupMetric) ProtoMessage() {} + +func (x *NodeGroupMetric) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[36] + 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 NodeGroupMetric.ProtoReflect.Descriptor instead. +func (*NodeGroupMetric) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{36} +} + +func (x *NodeGroupMetric) GetNodeCount() int32 { + if x != nil { + return x.NodeCount + } + return 0 +} + +func (x *NodeGroupMetric) GetMaxConcurrentNodeCount() int32 { + if x != nil { + return x.MaxConcurrentNodeCount + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityCpu() int64 { + if x != nil { + return x.CapacityCpu + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityMemory() int64 { + if x != nil { + return x.CapacityMemory + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityGpuVram() int64 { + if x != nil { + return x.CapacityGpuVram + } + return 0 +} + +func (x *NodeGroupMetric) GetCapacityGpuDevices() int64 { + if x != nil { + return x.CapacityGpuDevices + } + return 0 +} + +func (x *NodeGroupMetric) GetAggrCpuReq() int64 { if x != nil { return x.AggrCpuReq } - return 0 + return 0 +} + +func (x *NodeGroupMetric) GetAggrMemoryReq() int64 { + if x != nil { + return x.AggrMemoryReq + } + return 0 +} + +func (x *NodeGroupMetric) GetAggrGpuReq() int64 { + if x != nil { + return x.AggrGpuReq + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilCpuAvgUsage() float32 { + if x != nil { + return x.UtilCpuAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilMemoryAvgUsage() float32 { + if x != nil { + return x.UtilMemoryAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilGpuVramAvgUsage() float32 { + if x != nil { + return x.UtilGpuVramAvgUsage + } + return 0 +} + +func (x *NodeGroupMetric) GetUtilGpuDevice() float32 { + if x != nil { + return x.UtilGpuDevice + } + return 0 +} + +func (x *NodeGroupMetric) GetHourlyCost() *money.Money { + if x != nil { + return x.HourlyCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyCpuCost() *money.Money { + if x != nil { + return x.HourlyCpuCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyMemoryCost() *money.Money { + if x != nil { + return x.HourlyMemoryCost + } + return nil +} + +func (x *NodeGroupMetric) GetHourlyGpuCost() *money.Money { + if x != nil { + return x.HourlyGpuCost + } + return nil +} + +func (x *NodeGroupMetric) GetBucketTime() *timestamppb.Timestamp { + if x != nil { + return x.BucketTime + } + return nil +} + +// GetNodeGroupResponse contains node group for a specific cluster. +type GetNodeGroupResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeGroup *NodeGroup `protobuf:"bytes,1,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` // Node Group +} + +func (x *GetNodeGroupResponse) Reset() { + *x = GetNodeGroupResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeGroupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeGroupResponse) ProtoMessage() {} + +func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[37] + 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 GetNodeGroupResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{37} +} + +func (x *GetNodeGroupResponse) GetNodeGroup() *NodeGroup { + if x != nil { + return x.NodeGroup + } + return nil +} + +// GetClusterResponse contains details of a specific cluster for a team. +type GetClusterResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the cluster. +} + +func (x *GetClusterResponse) Reset() { + *x = GetClusterResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterResponse) ProtoMessage() {} + +func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[38] + 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 GetClusterResponse.ProtoReflect.Descriptor instead. +func (*GetClusterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{38} +} + +func (x *GetClusterResponse) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +// GetClustersResponse contains the list of clusters and aggregated metrics for a team. +type GetClustersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics across clusters. + CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information across clusters. + NodeInfo *NodeInfo `protobuf:"bytes,4,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Aggregated node information across clusters. + CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource utilization data points. +} + +func (x *GetClustersResponse) Reset() { + *x = GetClustersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClustersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClustersResponse) ProtoMessage() {} + +func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[39] + 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 GetClustersResponse.ProtoReflect.Descriptor instead. +func (*GetClustersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{39} +} + +func (x *GetClustersResponse) GetClusters() []*Cluster { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *GetClustersResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetClustersResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetClustersResponse) GetNodeInfo() *NodeInfo { + if x != nil { + return x.NodeInfo + } + return nil +} + +func (x *GetClustersResponse) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *GetClustersResponse) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// ListClustersResponse contains the paginated list of clusters for a team. +// Deprecated: Use GetClustersResponse instead. +// +// Deprecated: Marked as deprecated in api/v1/k8s.proto. +type ListClustersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information. +} + +func (x *ListClustersResponse) Reset() { + *x = ListClustersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListClustersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListClustersResponse) ProtoMessage() {} + +func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[40] + 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 ListClustersResponse.ProtoReflect.Descriptor instead. +func (*ListClustersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{40} +} + +func (x *ListClustersResponse) GetClusters() []*Cluster { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *ListClustersResponse) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +// GetNodeResponse contains details and metrics for a specific node in a cluster. +type GetNodeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Details of the node. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the node. + CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost details for the node. + CostDataPoints []*CostDataPoint `protobuf:"bytes,4,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,5,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node. +} + +func (x *GetNodeResponse) Reset() { + *x = GetNodeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeResponse) ProtoMessage() {} + +func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[41] + 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 GetNodeResponse.ProtoReflect.Descriptor instead. +func (*GetNodeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{41} +} + +func (x *GetNodeResponse) GetNode() *Node { + if x != nil { + return x.Node + } + return nil +} + +func (x *GetNodeResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetNodeResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetNodeResponse) GetCostDataPoints() []*CostDataPoint { + if x != nil { + return x.CostDataPoints + } + return nil +} + +func (x *GetNodeResponse) GetResourceDataPoints() []*ResourceDataPoint { + if x != nil { + return x.ResourceDataPoints + } + return nil +} + +// GetWorkloadsResponse contains a list of workloads and aggregated metrics for a cluster. +type GetWorkloadsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of workload hierarchy items. + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for workloads. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for workloads. + ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses. +} + +func (x *GetWorkloadsResponse) Reset() { + *x = GetWorkloadsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadsResponse) ProtoMessage() {} + +func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[42] + 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 GetWorkloadsResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{42} +} + +func (x *GetWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { + if x != nil { + return x.WorkloadItems + } + return nil +} + +func (x *GetWorkloadsResponse) GetCostInfo() *CostInfo { + if x != nil { + return x.CostInfo + } + return nil +} + +func (x *GetWorkloadsResponse) GetResourceMetrics() *ResourceMetrics { + if x != nil { + return x.ResourceMetrics + } + return nil +} + +func (x *GetWorkloadsResponse) GetResourceSummary() *ResourceSummary { + if x != nil { + return x.ResourceSummary + } + return nil +} + +// GetWorkloadResponse contains details and metrics for a specific workload in a cluster. +type GetWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadItem *WorkloadItem `protobuf:"bytes,1,opt,name=workload_item,json=workloadItem,proto3" json:"workload_item,omitempty"` // Details of the workload hierarchy. + CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the workload. + ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the workload. + ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses for the workload. + CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. + ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. +} + +func (x *GetWorkloadResponse) Reset() { + *x = GetWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[43] + 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) } -func (x *NodeGroupMetric) GetAggrMemoryReq() int64 { +// Deprecated: Use GetWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{43} +} + +func (x *GetWorkloadResponse) GetWorkloadItem() *WorkloadItem { if x != nil { - return x.AggrMemoryReq + return x.WorkloadItem } - return 0 + return nil } -func (x *NodeGroupMetric) GetAggrGpuReq() int64 { +func (x *GetWorkloadResponse) GetCostInfo() *CostInfo { if x != nil { - return x.AggrGpuReq + return x.CostInfo } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilCpuAvgUsage() float32 { +func (x *GetWorkloadResponse) GetResourceMetrics() *ResourceMetrics { if x != nil { - return x.UtilCpuAvgUsage + return x.ResourceMetrics } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilMemoryAvgUsage() float32 { +func (x *GetWorkloadResponse) GetResourceSummary() *ResourceSummary { if x != nil { - return x.UtilMemoryAvgUsage + return x.ResourceSummary } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilGpuVramAvgUsage() float32 { +func (x *GetWorkloadResponse) GetCostDataPoints() []*CostDataPoint { if x != nil { - return x.UtilGpuVramAvgUsage + return x.CostDataPoints } - return 0 + return nil } -func (x *NodeGroupMetric) GetUtilGpuDevice() float32 { +func (x *GetWorkloadResponse) GetResourceDataPoints() []*ResourceDataPoint { if x != nil { - return x.UtilGpuDevice + return x.ResourceDataPoints } - return 0 + return nil } -func (x *NodeGroupMetric) GetHourlyCost() *money.Money { +// GetWorkloadContainerPercentilesRequest requests per-container percentile metrics for a workload. +type GetWorkloadContainerPercentilesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` +} + +func (x *GetWorkloadContainerPercentilesRequest) Reset() { + *x = GetWorkloadContainerPercentilesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerPercentilesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerPercentilesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[44] + 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 GetWorkloadContainerPercentilesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerPercentilesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{44} +} + +func (x *GetWorkloadContainerPercentilesRequest) GetTeamId() string { if x != nil { - return x.HourlyCost + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *GetWorkloadContainerPercentilesRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime } return nil } -func (x *NodeGroupMetric) GetHourlyCpuCost() *money.Money { +func (x *GetWorkloadContainerPercentilesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.HourlyCpuCost + return x.EndTime } return nil } -func (x *NodeGroupMetric) GetHourlyMemoryCost() *money.Money { +// GetWorkloadContainerPercentilesResponse returns per-container percentile statistics. +type GetWorkloadContainerPercentilesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerPercentileSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` +} + +func (x *GetWorkloadContainerPercentilesResponse) Reset() { + *x = GetWorkloadContainerPercentilesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerPercentilesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerPercentilesResponse) ProtoMessage() {} + +func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[45] + 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 GetWorkloadContainerPercentilesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerPercentilesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{45} +} + +func (x *GetWorkloadContainerPercentilesResponse) GetContainers() []*ContainerPercentileSummary { + if x != nil { + return x.Containers + } + return nil +} + +// GetWorkloadContainerTimeSeriesRequest requests per-container time-series metrics for a workload. +type GetWorkloadContainerTimeSeriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` +} + +func (x *GetWorkloadContainerTimeSeriesRequest) Reset() { + *x = GetWorkloadContainerTimeSeriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerTimeSeriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerTimeSeriesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[46] + 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 GetWorkloadContainerTimeSeriesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerTimeSeriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{46} +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerTimeSeriesRequest) GetUid() string { if x != nil { - return x.HourlyMemoryCost + return x.Uid } - return nil + return "" } -func (x *NodeGroupMetric) GetHourlyGpuCost() *money.Money { +func (x *GetWorkloadContainerTimeSeriesRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.HourlyGpuCost + return x.StartTime } return nil } -func (x *NodeGroupMetric) GetBucketTime() *timestamppb.Timestamp { +func (x *GetWorkloadContainerTimeSeriesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.BucketTime + return x.EndTime } return nil } -// GetNodeGroupResponse contains node group for a specific cluster. -type GetNodeGroupResponse struct { +// GetWorkloadContainerTimeSeriesResponse returns per-container time-series data. +type GetWorkloadContainerTimeSeriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeGroup *NodeGroup `protobuf:"bytes,1,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` // Node Group + Containers []*ContainerTimeSeries `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` } -func (x *GetNodeGroupResponse) Reset() { - *x = GetNodeGroupResponse{} +func (x *GetWorkloadContainerTimeSeriesResponse) Reset() { + *x = GetWorkloadContainerTimeSeriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[29] + mi := &file_api_v1_k8s_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupResponse) String() string { +func (x *GetWorkloadContainerTimeSeriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupResponse) ProtoMessage() {} +func (*GetWorkloadContainerTimeSeriesResponse) ProtoMessage() {} -func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[29] +func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2412,44 +3880,46 @@ func (x *GetNodeGroupResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{29} +// Deprecated: Use GetWorkloadContainerTimeSeriesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerTimeSeriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{47} } -func (x *GetNodeGroupResponse) GetNodeGroup() *NodeGroup { +func (x *GetWorkloadContainerTimeSeriesResponse) GetContainers() []*ContainerTimeSeries { if x != nil { - return x.NodeGroup + return x.Containers } return nil } -// GetClusterResponse contains details of a specific cluster for a team. -type GetClusterResponse struct { +// GetLatestContainerRequestLimitsRequest requests the most recent request/limit values per container. +type GetLatestContainerRequestLimitsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` // Details of the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetClusterResponse) Reset() { - *x = GetClusterResponse{} +func (x *GetLatestContainerRequestLimitsRequest) Reset() { + *x = GetLatestContainerRequestLimitsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[30] + mi := &file_api_v1_k8s_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterResponse) String() string { +func (x *GetLatestContainerRequestLimitsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterResponse) ProtoMessage() {} +func (*GetLatestContainerRequestLimitsRequest) ProtoMessage() {} -func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[30] +func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2460,49 +3930,58 @@ func (x *GetClusterResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterResponse.ProtoReflect.Descriptor instead. -func (*GetClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{30} +// Deprecated: Use GetLatestContainerRequestLimitsRequest.ProtoReflect.Descriptor instead. +func (*GetLatestContainerRequestLimitsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{48} } -func (x *GetClusterResponse) GetCluster() *Cluster { +func (x *GetLatestContainerRequestLimitsRequest) GetTeamId() string { if x != nil { - return x.Cluster + return x.TeamId } - return nil + return "" } -// GetClustersResponse contains the list of clusters and aggregated metrics for a team. -type GetClustersResponse struct { +func (x *GetLatestContainerRequestLimitsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetLatestContainerRequestLimitsRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +// GetLatestContainerRequestLimitsResponse returns per-container request/limit values. +type GetLatestContainerRequestLimitsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics across clusters. - CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information across clusters. - NodeInfo *NodeInfo `protobuf:"bytes,4,opt,name=node_info,json=nodeInfo,proto3" json:"node_info,omitempty"` // Aggregated node information across clusters. - CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource utilization data points. + Containers []*ContainerRequestLimits `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` } -func (x *GetClustersResponse) Reset() { - *x = GetClustersResponse{} +func (x *GetLatestContainerRequestLimitsResponse) Reset() { + *x = GetLatestContainerRequestLimitsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[31] + mi := &file_api_v1_k8s_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClustersResponse) String() string { +func (x *GetLatestContainerRequestLimitsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClustersResponse) ProtoMessage() {} +func (*GetLatestContainerRequestLimitsResponse) ProtoMessage() {} -func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[31] +func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2513,83 +3992,47 @@ func (x *GetClustersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClustersResponse.ProtoReflect.Descriptor instead. -func (*GetClustersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{31} -} - -func (x *GetClustersResponse) GetClusters() []*Cluster { - if x != nil { - return x.Clusters - } - return nil -} - -func (x *GetClustersResponse) GetResourceMetrics() *ResourceMetrics { - if x != nil { - return x.ResourceMetrics - } - return nil -} - -func (x *GetClustersResponse) GetCostInfo() *CostInfo { - if x != nil { - return x.CostInfo - } - return nil -} - -func (x *GetClustersResponse) GetNodeInfo() *NodeInfo { - if x != nil { - return x.NodeInfo - } - return nil -} - -func (x *GetClustersResponse) GetCostDataPoints() []*CostDataPoint { - if x != nil { - return x.CostDataPoints - } - return nil +// Deprecated: Use GetLatestContainerRequestLimitsResponse.ProtoReflect.Descriptor instead. +func (*GetLatestContainerRequestLimitsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{49} } -func (x *GetClustersResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GetLatestContainerRequestLimitsResponse) GetContainers() []*ContainerRequestLimits { if x != nil { - return x.ResourceDataPoints + return x.Containers } return nil } -// ListClustersResponse contains the paginated list of clusters for a team. -// Deprecated: Use GetClustersResponse instead. -// -// Deprecated: Marked as deprecated in api/v1/k8s.proto. -type ListClustersResponse struct { +// GetNodeGPUMigInstancesRequest requests the most recent MIG-instance telemetry for a node. +type GetNodeGPUMigInstancesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` // List of clusters. - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` // Pagination information. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeId *string `protobuf:"bytes,3,opt,name=node_id,json=nodeId,proto3,oneof" json:"node_id,omitempty"` // Unique identifier for the node. + NodeUid *string `protobuf:"bytes,4,opt,name=node_uid,json=nodeUid,proto3,oneof" json:"node_uid,omitempty"` // alternatively -> Unique identifier for the node. } -func (x *ListClustersResponse) Reset() { - *x = ListClustersResponse{} +func (x *GetNodeGPUMigInstancesRequest) Reset() { + *x = GetNodeGPUMigInstancesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[32] + mi := &file_api_v1_k8s_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListClustersResponse) String() string { +func (x *GetNodeGPUMigInstancesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListClustersResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstancesRequest) ProtoMessage() {} -func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[32] +func (x *GetNodeGPUMigInstancesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2600,55 +4043,66 @@ func (x *ListClustersResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListClustersResponse.ProtoReflect.Descriptor instead. -func (*ListClustersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{32} +// Deprecated: Use GetNodeGPUMigInstancesRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstancesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{50} } -func (x *ListClustersResponse) GetClusters() []*Cluster { +func (x *GetNodeGPUMigInstancesRequest) GetTeamId() string { if x != nil { - return x.Clusters + return x.TeamId } - return nil + return "" } -func (x *ListClustersResponse) GetPagination() *Pagination { +func (x *GetNodeGPUMigInstancesRequest) GetClusterId() string { if x != nil { - return x.Pagination + return x.ClusterId } - return nil + return "" } -// GetNodeResponse contains details and metrics for a specific node in a cluster. -type GetNodeResponse struct { +func (x *GetNodeGPUMigInstancesRequest) GetNodeId() string { + if x != nil && x.NodeId != nil { + return *x.NodeId + } + return "" +} + +func (x *GetNodeGPUMigInstancesRequest) GetNodeUid() string { + if x != nil && x.NodeUid != nil { + return *x.NodeUid + } + return "" +} + +// GetNodeGPUMigInstancesResponse returns the node's most recent MIG-instance telemetry. +type GetNodeGPUMigInstancesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` // Details of the node. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,2,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Resource metrics for the node. - CostInfo *CostInfo `protobuf:"bytes,3,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Cost details for the node. - CostDataPoints []*CostDataPoint `protobuf:"bytes,4,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the node. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,5,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the node. + Instances []*GPUMigInstance `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty"` + CollectedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=collected_at,json=collectedAt,proto3,oneof" json:"collected_at,omitempty"` } -func (x *GetNodeResponse) Reset() { - *x = GetNodeResponse{} +func (x *GetNodeGPUMigInstancesResponse) Reset() { + *x = GetNodeGPUMigInstancesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[33] + mi := &file_api_v1_k8s_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeResponse) String() string { +func (x *GetNodeGPUMigInstancesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstancesResponse) ProtoMessage() {} -func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[33] +func (x *GetNodeGPUMigInstancesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,75 +4113,57 @@ func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodeResponse.ProtoReflect.Descriptor instead. -func (*GetNodeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{33} -} - -func (x *GetNodeResponse) GetNode() *Node { - if x != nil { - return x.Node - } - return nil -} - -func (x *GetNodeResponse) GetResourceMetrics() *ResourceMetrics { - if x != nil { - return x.ResourceMetrics - } - return nil -} - -func (x *GetNodeResponse) GetCostInfo() *CostInfo { - if x != nil { - return x.CostInfo - } - return nil +// Deprecated: Use GetNodeGPUMigInstancesResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstancesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{51} } -func (x *GetNodeResponse) GetCostDataPoints() []*CostDataPoint { +func (x *GetNodeGPUMigInstancesResponse) GetInstances() []*GPUMigInstance { if x != nil { - return x.CostDataPoints + return x.Instances } return nil } -func (x *GetNodeResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GetNodeGPUMigInstancesResponse) GetCollectedAt() *timestamppb.Timestamp { if x != nil { - return x.ResourceDataPoints + return x.CollectedAt } return nil } -// GetWorkloadsResponse contains a list of workloads and aggregated metrics for a cluster. -type GetWorkloadsResponse struct { +// GetNodeGPUMigInstanceTimeseriesRequest requests per-MIG-instance +// utilization as a time series for a node over a time range. +type GetNodeGPUMigInstanceTimeseriesRequest struct { state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - WorkloadItems []*WorkloadItem `protobuf:"bytes,1,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // List of workload hierarchy items. - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for workloads. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for workloads. - ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses. + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeId *string `protobuf:"bytes,3,opt,name=node_id,json=nodeId,proto3,oneof" json:"node_id,omitempty"` + NodeUid *string `protobuf:"bytes,4,opt,name=node_uid,json=nodeUid,proto3,oneof" json:"node_uid,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` } -func (x *GetWorkloadsResponse) Reset() { - *x = GetWorkloadsResponse{} +func (x *GetNodeGPUMigInstanceTimeseriesRequest) Reset() { + *x = GetNodeGPUMigInstanceTimeseriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[34] + mi := &file_api_v1_k8s_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadsResponse) String() string { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadsResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstanceTimeseriesRequest) ProtoMessage() {} -func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[34] +func (x *GetNodeGPUMigInstanceTimeseriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2738,70 +4174,85 @@ func (x *GetWorkloadsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadsResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{34} +// Deprecated: Use GetNodeGPUMigInstanceTimeseriesRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstanceTimeseriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{52} } -func (x *GetWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetTeamId() string { if x != nil { - return x.WorkloadItems + return x.TeamId } - return nil + return "" } -func (x *GetWorkloadsResponse) GetCostInfo() *CostInfo { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetClusterId() string { if x != nil { - return x.CostInfo + return x.ClusterId } - return nil + return "" } -func (x *GetWorkloadsResponse) GetResourceMetrics() *ResourceMetrics { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetNodeId() string { + if x != nil && x.NodeId != nil { + return *x.NodeId + } + return "" +} + +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetNodeUid() string { + if x != nil && x.NodeUid != nil { + return *x.NodeUid + } + return "" +} + +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.ResourceMetrics + return x.StartTime } return nil } -func (x *GetWorkloadsResponse) GetResourceSummary() *ResourceSummary { +func (x *GetNodeGPUMigInstanceTimeseriesRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.ResourceSummary + return x.EndTime } return nil } -// GetWorkloadResponse contains details and metrics for a specific workload in a cluster. -type GetWorkloadResponse struct { +// GPUMigInstanceDataPoint is one timestamped sample of a single MIG +// instance's utilization. +type GPUMigInstanceDataPoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadItem *WorkloadItem `protobuf:"bytes,1,opt,name=workload_item,json=workloadItem,proto3" json:"workload_item,omitempty"` // Details of the workload hierarchy. - CostInfo *CostInfo `protobuf:"bytes,2,opt,name=cost_info,json=costInfo,proto3" json:"cost_info,omitempty"` // Aggregated cost information for the workload. - ResourceMetrics *ResourceMetrics `protobuf:"bytes,3,opt,name=resource_metrics,json=resourceMetrics,proto3" json:"resource_metrics,omitempty"` // Aggregated resource metrics for the workload. - ResourceSummary *ResourceSummary `protobuf:"bytes,4,opt,name=resource_summary,json=resourceSummary,proto3" json:"resource_summary,omitempty"` // Summary of resource counts and pod statuses for the workload. - CostDataPoints []*CostDataPoint `protobuf:"bytes,5,rep,name=cost_data_points,json=costDataPoints,proto3" json:"cost_data_points,omitempty"` // Time-series cost data points for the workload. - ResourceDataPoints []*ResourceDataPoint `protobuf:"bytes,6,rep,name=resource_data_points,json=resourceDataPoints,proto3" json:"resource_data_points,omitempty"` // Time-series resource metrics for the workload. + Timestamp *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + TensorActive float64 `protobuf:"fixed64,2,opt,name=tensor_active,json=tensorActive,proto3" json:"tensor_active,omitempty"` + DramActive float64 `protobuf:"fixed64,3,opt,name=dram_active,json=dramActive,proto3" json:"dram_active,omitempty"` + GraphicsEngineActive float64 `protobuf:"fixed64,4,opt,name=graphics_engine_active,json=graphicsEngineActive,proto3" json:"graphics_engine_active,omitempty"` + FramebufferUsed float64 `protobuf:"fixed64,5,opt,name=framebuffer_used,json=framebufferUsed,proto3" json:"framebuffer_used,omitempty"` + FramebufferTotal float64 `protobuf:"fixed64,6,opt,name=framebuffer_total,json=framebufferTotal,proto3" json:"framebuffer_total,omitempty"` } -func (x *GetWorkloadResponse) Reset() { - *x = GetWorkloadResponse{} +func (x *GPUMigInstanceDataPoint) Reset() { + *x = GPUMigInstanceDataPoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[35] + mi := &file_api_v1_k8s_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadResponse) String() string { +func (x *GPUMigInstanceDataPoint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadResponse) ProtoMessage() {} +func (*GPUMigInstanceDataPoint) ProtoMessage() {} -func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[35] +func (x *GPUMigInstanceDataPoint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2812,84 +4263,84 @@ func (x *GetWorkloadResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{35} +// Deprecated: Use GPUMigInstanceDataPoint.ProtoReflect.Descriptor instead. +func (*GPUMigInstanceDataPoint) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{53} } -func (x *GetWorkloadResponse) GetWorkloadItem() *WorkloadItem { +func (x *GPUMigInstanceDataPoint) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.WorkloadItem + return x.Timestamp } return nil } -func (x *GetWorkloadResponse) GetCostInfo() *CostInfo { +func (x *GPUMigInstanceDataPoint) GetTensorActive() float64 { if x != nil { - return x.CostInfo + return x.TensorActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceMetrics() *ResourceMetrics { +func (x *GPUMigInstanceDataPoint) GetDramActive() float64 { if x != nil { - return x.ResourceMetrics + return x.DramActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceSummary() *ResourceSummary { +func (x *GPUMigInstanceDataPoint) GetGraphicsEngineActive() float64 { if x != nil { - return x.ResourceSummary + return x.GraphicsEngineActive } - return nil + return 0 } -func (x *GetWorkloadResponse) GetCostDataPoints() []*CostDataPoint { +func (x *GPUMigInstanceDataPoint) GetFramebufferUsed() float64 { if x != nil { - return x.CostDataPoints + return x.FramebufferUsed } - return nil + return 0 } -func (x *GetWorkloadResponse) GetResourceDataPoints() []*ResourceDataPoint { +func (x *GPUMigInstanceDataPoint) GetFramebufferTotal() float64 { if x != nil { - return x.ResourceDataPoints + return x.FramebufferTotal } - return nil + return 0 } -// GetWorkloadContainerPercentilesRequest requests per-container percentile metrics for a workload. -type GetWorkloadContainerPercentilesRequest struct { +// GPUMigInstanceTimeseries is one MIG instance's identity plus its +// utilization samples over the requested time range. +type GPUMigInstanceTimeseries struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + MigInstanceId string `protobuf:"bytes,1,opt,name=mig_instance_id,json=migInstanceId,proto3" json:"mig_instance_id,omitempty"` + MigProfile string `protobuf:"bytes,2,opt,name=mig_profile,json=migProfile,proto3" json:"mig_profile,omitempty"` + DeviceUuid string `protobuf:"bytes,3,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"` + ModelName string `protobuf:"bytes,4,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"` + Points []*GPUMigInstanceDataPoint `protobuf:"bytes,5,rep,name=points,proto3" json:"points,omitempty"` } -func (x *GetWorkloadContainerPercentilesRequest) Reset() { - *x = GetWorkloadContainerPercentilesRequest{} +func (x *GPUMigInstanceTimeseries) Reset() { + *x = GPUMigInstanceTimeseries{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[36] + mi := &file_api_v1_k8s_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerPercentilesRequest) String() string { +func (x *GPUMigInstanceTimeseries) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerPercentilesRequest) ProtoMessage() {} +func (*GPUMigInstanceTimeseries) ProtoMessage() {} -func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[36] +func (x *GPUMigInstanceTimeseries) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2900,79 +4351,73 @@ func (x *GetWorkloadContainerPercentilesRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerPercentilesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerPercentilesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{36} +// Deprecated: Use GPUMigInstanceTimeseries.ProtoReflect.Descriptor instead. +func (*GPUMigInstanceTimeseries) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{54} } -func (x *GetWorkloadContainerPercentilesRequest) GetTeamId() string { +func (x *GPUMigInstanceTimeseries) GetMigInstanceId() string { if x != nil { - return x.TeamId + return x.MigInstanceId } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetClusterId() string { +func (x *GPUMigInstanceTimeseries) GetMigProfile() string { if x != nil { - return x.ClusterId + return x.MigProfile } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetKind() string { +func (x *GPUMigInstanceTimeseries) GetDeviceUuid() string { if x != nil { - return x.Kind + return x.DeviceUuid } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetUid() string { +func (x *GPUMigInstanceTimeseries) GetModelName() string { if x != nil { - return x.Uid + return x.ModelName } return "" } -func (x *GetWorkloadContainerPercentilesRequest) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime - } - return nil -} - -func (x *GetWorkloadContainerPercentilesRequest) GetEndTime() *timestamppb.Timestamp { +func (x *GPUMigInstanceTimeseries) GetPoints() []*GPUMigInstanceDataPoint { if x != nil { - return x.EndTime + return x.Points } return nil } -// GetWorkloadContainerPercentilesResponse returns per-container percentile statistics. -type GetWorkloadContainerPercentilesResponse struct { +// GetNodeGPUMigInstanceTimeseriesResponse returns one series per MIG +// instance present on the node during the requested range. +type GetNodeGPUMigInstanceTimeseriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerPercentileSummary `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Instances []*GPUMigInstanceTimeseries `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty"` } -func (x *GetWorkloadContainerPercentilesResponse) Reset() { - *x = GetWorkloadContainerPercentilesResponse{} +func (x *GetNodeGPUMigInstanceTimeseriesResponse) Reset() { + *x = GetNodeGPUMigInstanceTimeseriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[37] + mi := &file_api_v1_k8s_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerPercentilesResponse) String() string { +func (x *GetNodeGPUMigInstanceTimeseriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerPercentilesResponse) ProtoMessage() {} +func (*GetNodeGPUMigInstanceTimeseriesResponse) ProtoMessage() {} -func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[37] +func (x *GetNodeGPUMigInstanceTimeseriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2983,49 +4428,46 @@ func (x *GetWorkloadContainerPercentilesResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerPercentilesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerPercentilesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{37} +// Deprecated: Use GetNodeGPUMigInstanceTimeseriesResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGPUMigInstanceTimeseriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{55} } -func (x *GetWorkloadContainerPercentilesResponse) GetContainers() []*ContainerPercentileSummary { +func (x *GetNodeGPUMigInstanceTimeseriesResponse) GetInstances() []*GPUMigInstanceTimeseries { if x != nil { - return x.Containers + return x.Instances } return nil } -// GetWorkloadContainerTimeSeriesRequest requests per-container time-series metrics for a workload. -type GetWorkloadContainerTimeSeriesRequest struct { +// GetContainerIndividualGPUMetricsRequest requests the most recent per-GPU breakdown per container. +type GetContainerIndividualGPUMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetWorkloadContainerTimeSeriesRequest) Reset() { - *x = GetWorkloadContainerTimeSeriesRequest{} +func (x *GetContainerIndividualGPUMetricsRequest) Reset() { + *x = GetContainerIndividualGPUMetricsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[38] + mi := &file_api_v1_k8s_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerTimeSeriesRequest) String() string { +func (x *GetContainerIndividualGPUMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerTimeSeriesRequest) ProtoMessage() {} +func (*GetContainerIndividualGPUMetricsRequest) ProtoMessage() {} -func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[38] +func (x *GetContainerIndividualGPUMetricsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3036,79 +4478,108 @@ func (x *GetWorkloadContainerTimeSeriesRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerTimeSeriesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerTimeSeriesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{38} +// Deprecated: Use GetContainerIndividualGPUMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetContainerIndividualGPUMetricsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{56} } -func (x *GetWorkloadContainerTimeSeriesRequest) GetTeamId() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetClusterId() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetKind() string { +func (x *GetContainerIndividualGPUMetricsRequest) GetUid() string { if x != nil { - return x.Kind + return x.Uid } return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetUid() string { - if x != nil { - return x.Uid +// GetContainerIndividualGPUMetricsResponse returns per-container per-GPU breakdowns. +type GetContainerIndividualGPUMetricsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Containers []*ContainerIndividualGPUMetrics `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` +} + +func (x *GetContainerIndividualGPUMetricsResponse) Reset() { + *x = GetContainerIndividualGPUMetricsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *GetWorkloadContainerTimeSeriesRequest) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime +func (x *GetContainerIndividualGPUMetricsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetContainerIndividualGPUMetricsResponse) ProtoMessage() {} + +func (x *GetContainerIndividualGPUMetricsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *GetWorkloadContainerTimeSeriesRequest) GetEndTime() *timestamppb.Timestamp { +// Deprecated: Use GetContainerIndividualGPUMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetContainerIndividualGPUMetricsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{57} +} + +func (x *GetContainerIndividualGPUMetricsResponse) GetContainers() []*ContainerIndividualGPUMetrics { if x != nil { - return x.EndTime + return x.Containers } return nil } -// GetWorkloadContainerTimeSeriesResponse returns per-container time-series data. -type GetWorkloadContainerTimeSeriesResponse struct { +// LanguageVersions holds every distinct version detected for one language +// across a cluster's workloads. +type LanguageVersions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerTimeSeries `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"` + Versions []string `protobuf:"bytes,2,rep,name=versions,proto3" json:"versions,omitempty"` } -func (x *GetWorkloadContainerTimeSeriesResponse) Reset() { - *x = GetWorkloadContainerTimeSeriesResponse{} +func (x *LanguageVersions) Reset() { + *x = LanguageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[39] + mi := &file_api_v1_k8s_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerTimeSeriesResponse) String() string { +func (x *LanguageVersions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerTimeSeriesResponse) ProtoMessage() {} +func (*LanguageVersions) ProtoMessage() {} -func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[39] +func (x *LanguageVersions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3119,46 +4590,53 @@ func (x *GetWorkloadContainerTimeSeriesResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerTimeSeriesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerTimeSeriesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{39} +// Deprecated: Use LanguageVersions.ProtoReflect.Descriptor instead. +func (*LanguageVersions) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{58} } -func (x *GetWorkloadContainerTimeSeriesResponse) GetContainers() []*ContainerTimeSeries { +func (x *LanguageVersions) GetLanguage() string { if x != nil { - return x.Containers + return x.Language + } + return "" +} + +func (x *LanguageVersions) GetVersions() []string { + if x != nil { + return x.Versions } return nil } -// GetLatestContainerRequestLimitsRequest requests the most recent request/limit values per container. -type GetLatestContainerRequestLimitsRequest struct { +// GetWorkloadLanguagesRequest requests the distinct languages/versions +// detected across a cluster's workloads (used to populate filter dropdowns). +type GetWorkloadLanguagesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } -func (x *GetLatestContainerRequestLimitsRequest) Reset() { - *x = GetLatestContainerRequestLimitsRequest{} +func (x *GetWorkloadLanguagesRequest) Reset() { + *x = GetWorkloadLanguagesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[40] + mi := &file_api_v1_k8s_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetLatestContainerRequestLimitsRequest) String() string { +func (x *GetWorkloadLanguagesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLatestContainerRequestLimitsRequest) ProtoMessage() {} +func (*GetWorkloadLanguagesRequest) ProtoMessage() {} -func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[40] +func (x *GetWorkloadLanguagesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3169,58 +4647,52 @@ func (x *GetLatestContainerRequestLimitsRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetLatestContainerRequestLimitsRequest.ProtoReflect.Descriptor instead. -func (*GetLatestContainerRequestLimitsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{40} -} - -func (x *GetLatestContainerRequestLimitsRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use GetWorkloadLanguagesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadLanguagesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{59} } -func (x *GetLatestContainerRequestLimitsRequest) GetClusterId() string { +func (x *GetWorkloadLanguagesRequest) GetTeamId() string { if x != nil { - return x.ClusterId + return x.TeamId } return "" } -func (x *GetLatestContainerRequestLimitsRequest) GetUid() string { +func (x *GetWorkloadLanguagesRequest) GetClusterId() string { if x != nil { - return x.Uid + return x.ClusterId } return "" } -// GetLatestContainerRequestLimitsResponse returns per-container request/limit values. -type GetLatestContainerRequestLimitsResponse struct { +// GetWorkloadLanguagesResponse returns every distinct language and its +// detected versions for the requested cluster. +type GetWorkloadLanguagesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Containers []*ContainerRequestLimits `protobuf:"bytes,1,rep,name=containers,proto3" json:"containers,omitempty"` + Languages []*LanguageVersions `protobuf:"bytes,1,rep,name=languages,proto3" json:"languages,omitempty"` } -func (x *GetLatestContainerRequestLimitsResponse) Reset() { - *x = GetLatestContainerRequestLimitsResponse{} +func (x *GetWorkloadLanguagesResponse) Reset() { + *x = GetWorkloadLanguagesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[41] + mi := &file_api_v1_k8s_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetLatestContainerRequestLimitsResponse) String() string { +func (x *GetWorkloadLanguagesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLatestContainerRequestLimitsResponse) ProtoMessage() {} +func (*GetWorkloadLanguagesResponse) ProtoMessage() {} -func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[41] +func (x *GetWorkloadLanguagesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3231,14 +4703,14 @@ func (x *GetLatestContainerRequestLimitsResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GetLatestContainerRequestLimitsResponse.ProtoReflect.Descriptor instead. -func (*GetLatestContainerRequestLimitsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{41} +// Deprecated: Use GetWorkloadLanguagesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadLanguagesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{60} } -func (x *GetLatestContainerRequestLimitsResponse) GetContainers() []*ContainerRequestLimits { +func (x *GetWorkloadLanguagesResponse) GetLanguages() []*LanguageVersions { if x != nil { - return x.Containers + return x.Languages } return nil } @@ -3259,7 +4731,7 @@ type GetForecastWorkloadsRequest struct { func (x *GetForecastWorkloadsRequest) Reset() { *x = GetForecastWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[42] + mi := &file_api_v1_k8s_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3272,7 +4744,7 @@ func (x *GetForecastWorkloadsRequest) String() string { func (*GetForecastWorkloadsRequest) ProtoMessage() {} func (x *GetForecastWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[42] + mi := &file_api_v1_k8s_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3285,7 +4757,7 @@ func (x *GetForecastWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadsRequest.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{42} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{61} } func (x *GetForecastWorkloadsRequest) GetTeamId() string { @@ -3338,7 +4810,7 @@ type GetForecastWorkloadsResponse struct { func (x *GetForecastWorkloadsResponse) Reset() { *x = GetForecastWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[43] + mi := &file_api_v1_k8s_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3351,7 +4823,7 @@ func (x *GetForecastWorkloadsResponse) String() string { func (*GetForecastWorkloadsResponse) ProtoMessage() {} func (x *GetForecastWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[43] + mi := &file_api_v1_k8s_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3364,7 +4836,7 @@ func (x *GetForecastWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadsResponse.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{43} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{62} } func (x *GetForecastWorkloadsResponse) GetWorkloadItems() []*WorkloadItem { @@ -3413,7 +4885,7 @@ type GetForecastWorkloadRequest struct { func (x *GetForecastWorkloadRequest) Reset() { *x = GetForecastWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[44] + mi := &file_api_v1_k8s_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +4898,7 @@ func (x *GetForecastWorkloadRequest) String() string { func (*GetForecastWorkloadRequest) ProtoMessage() {} func (x *GetForecastWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[44] + mi := &file_api_v1_k8s_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3439,7 +4911,7 @@ func (x *GetForecastWorkloadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadRequest.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{44} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{63} } func (x *GetForecastWorkloadRequest) GetTeamId() string { @@ -3508,7 +4980,7 @@ type GetForecastWorkloadResponse struct { func (x *GetForecastWorkloadResponse) Reset() { *x = GetForecastWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[45] + mi := &file_api_v1_k8s_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3521,7 +4993,7 @@ func (x *GetForecastWorkloadResponse) String() string { func (*GetForecastWorkloadResponse) ProtoMessage() {} func (x *GetForecastWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[45] + mi := &file_api_v1_k8s_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3534,7 +5006,7 @@ func (x *GetForecastWorkloadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetForecastWorkloadResponse.ProtoReflect.Descriptor instead. func (*GetForecastWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{45} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{64} } func (x *GetForecastWorkloadResponse) GetWorkloadItem() *WorkloadItem { @@ -3591,7 +5063,7 @@ type GetClusterMetadataResponse struct { func (x *GetClusterMetadataResponse) Reset() { *x = GetClusterMetadataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[46] + mi := &file_api_v1_k8s_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3604,7 +5076,7 @@ func (x *GetClusterMetadataResponse) String() string { func (*GetClusterMetadataResponse) ProtoMessage() {} func (x *GetClusterMetadataResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[46] + mi := &file_api_v1_k8s_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3617,7 +5089,7 @@ func (x *GetClusterMetadataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClusterMetadataResponse.ProtoReflect.Descriptor instead. func (*GetClusterMetadataResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{46} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{65} } func (x *GetClusterMetadataResponse) GetClusters() []*Cluster { @@ -3639,7 +5111,7 @@ type ClusterElement struct { func (x *ClusterElement) Reset() { *x = ClusterElement{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[47] + mi := &file_api_v1_k8s_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3652,7 +5124,7 @@ func (x *ClusterElement) String() string { func (*ClusterElement) ProtoMessage() {} func (x *ClusterElement) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[47] + mi := &file_api_v1_k8s_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3665,7 +5137,7 @@ func (x *ClusterElement) ProtoReflect() protoreflect.Message { // Deprecated: Use ClusterElement.ProtoReflect.Descriptor instead. func (*ClusterElement) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{47} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{66} } func (x *ClusterElement) GetClusterId() string { @@ -3696,7 +5168,7 @@ type GetAllNamespacesRequest struct { func (x *GetAllNamespacesRequest) Reset() { *x = GetAllNamespacesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[48] + mi := &file_api_v1_k8s_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3709,7 +5181,7 @@ func (x *GetAllNamespacesRequest) String() string { func (*GetAllNamespacesRequest) ProtoMessage() {} func (x *GetAllNamespacesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[48] + mi := &file_api_v1_k8s_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3722,7 +5194,7 @@ func (x *GetAllNamespacesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNamespacesRequest.ProtoReflect.Descriptor instead. func (*GetAllNamespacesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{48} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{67} } func (x *GetAllNamespacesRequest) GetTeamId() string { @@ -3764,7 +5236,7 @@ type GetAllNamespacesResponse struct { func (x *GetAllNamespacesResponse) Reset() { *x = GetAllNamespacesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[49] + mi := &file_api_v1_k8s_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3777,7 +5249,7 @@ func (x *GetAllNamespacesResponse) String() string { func (*GetAllNamespacesResponse) ProtoMessage() {} func (x *GetAllNamespacesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[49] + mi := &file_api_v1_k8s_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3790,7 +5262,7 @@ func (x *GetAllNamespacesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNamespacesResponse.ProtoReflect.Descriptor instead. func (*GetAllNamespacesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{49} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{68} } func (x *GetAllNamespacesResponse) GetClusterIdWithNamespaces() []*ClusterElement { @@ -3814,7 +5286,7 @@ type SearchNamespacesByClusterRequest struct { func (x *SearchNamespacesByClusterRequest) Reset() { *x = SearchNamespacesByClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[50] + mi := &file_api_v1_k8s_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +5299,7 @@ func (x *SearchNamespacesByClusterRequest) String() string { func (*SearchNamespacesByClusterRequest) ProtoMessage() {} func (x *SearchNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[50] + mi := &file_api_v1_k8s_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +5312,7 @@ func (x *SearchNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchNamespacesByClusterRequest.ProtoReflect.Descriptor instead. func (*SearchNamespacesByClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{50} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{69} } func (x *SearchNamespacesByClusterRequest) GetTeamId() string { @@ -3876,7 +5348,7 @@ type SearchNamespacesByClusterResponse struct { func (x *SearchNamespacesByClusterResponse) Reset() { *x = SearchNamespacesByClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[51] + mi := &file_api_v1_k8s_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3889,7 +5361,7 @@ func (x *SearchNamespacesByClusterResponse) String() string { func (*SearchNamespacesByClusterResponse) ProtoMessage() {} func (x *SearchNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[51] + mi := &file_api_v1_k8s_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3902,7 +5374,7 @@ func (x *SearchNamespacesByClusterResponse) ProtoReflect() protoreflect.Message // Deprecated: Use SearchNamespacesByClusterResponse.ProtoReflect.Descriptor instead. func (*SearchNamespacesByClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{51} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{70} } func (x *SearchNamespacesByClusterResponse) GetNamespaces() []string { @@ -3925,7 +5397,7 @@ type ListNamespacesByClusterRequest struct { func (x *ListNamespacesByClusterRequest) Reset() { *x = ListNamespacesByClusterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[52] + mi := &file_api_v1_k8s_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3938,7 +5410,7 @@ func (x *ListNamespacesByClusterRequest) String() string { func (*ListNamespacesByClusterRequest) ProtoMessage() {} func (x *ListNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[52] + mi := &file_api_v1_k8s_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3951,7 +5423,7 @@ func (x *ListNamespacesByClusterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNamespacesByClusterRequest.ProtoReflect.Descriptor instead. func (*ListNamespacesByClusterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{52} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{71} } func (x *ListNamespacesByClusterRequest) GetTeamId() string { @@ -3980,7 +5452,7 @@ type ListNamespacesByClusterResponse struct { func (x *ListNamespacesByClusterResponse) Reset() { *x = ListNamespacesByClusterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[53] + mi := &file_api_v1_k8s_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3993,7 +5465,7 @@ func (x *ListNamespacesByClusterResponse) String() string { func (*ListNamespacesByClusterResponse) ProtoMessage() {} func (x *ListNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[53] + mi := &file_api_v1_k8s_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4006,7 +5478,7 @@ func (x *ListNamespacesByClusterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNamespacesByClusterResponse.ProtoReflect.Descriptor instead. func (*ListNamespacesByClusterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{53} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{72} } func (x *ListNamespacesByClusterResponse) GetNamespaces() []*NamespaceItem { @@ -4029,7 +5501,7 @@ type NamespaceItem struct { func (x *NamespaceItem) Reset() { *x = NamespaceItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[54] + mi := &file_api_v1_k8s_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +5514,7 @@ func (x *NamespaceItem) String() string { func (*NamespaceItem) ProtoMessage() {} func (x *NamespaceItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[54] + mi := &file_api_v1_k8s_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +5527,7 @@ func (x *NamespaceItem) ProtoReflect() protoreflect.Message { // Deprecated: Use NamespaceItem.ProtoReflect.Descriptor instead. func (*NamespaceItem) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{54} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{73} } func (x *NamespaceItem) GetId() string { @@ -4091,7 +5563,7 @@ type GetAllWorkloadNamesRequest struct { func (x *GetAllWorkloadNamesRequest) Reset() { *x = GetAllWorkloadNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[55] + mi := &file_api_v1_k8s_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4104,7 +5576,7 @@ func (x *GetAllWorkloadNamesRequest) String() string { func (*GetAllWorkloadNamesRequest) ProtoMessage() {} func (x *GetAllWorkloadNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[55] + mi := &file_api_v1_k8s_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4117,7 +5589,7 @@ func (x *GetAllWorkloadNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadNamesRequest.ProtoReflect.Descriptor instead. func (*GetAllWorkloadNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{55} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{74} } func (x *GetAllWorkloadNamesRequest) GetTeamId() string { @@ -4194,7 +5666,7 @@ type GetAllWorkloadNamesResponse struct { func (x *GetAllWorkloadNamesResponse) Reset() { *x = GetAllWorkloadNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[56] + mi := &file_api_v1_k8s_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4207,7 +5679,7 @@ func (x *GetAllWorkloadNamesResponse) String() string { func (*GetAllWorkloadNamesResponse) ProtoMessage() {} func (x *GetAllWorkloadNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[56] + mi := &file_api_v1_k8s_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4220,7 +5692,7 @@ func (x *GetAllWorkloadNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadNamesResponse.ProtoReflect.Descriptor instead. func (*GetAllWorkloadNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{56} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{75} } func (x *GetAllWorkloadNamesResponse) GetClusterIdWithWorkloadName() []*ClusterElement { @@ -4248,7 +5720,7 @@ type GetAllWorkloadLabelsRequest struct { func (x *GetAllWorkloadLabelsRequest) Reset() { *x = GetAllWorkloadLabelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[57] + mi := &file_api_v1_k8s_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +5733,7 @@ func (x *GetAllWorkloadLabelsRequest) String() string { func (*GetAllWorkloadLabelsRequest) ProtoMessage() {} func (x *GetAllWorkloadLabelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[57] + mi := &file_api_v1_k8s_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +5746,7 @@ func (x *GetAllWorkloadLabelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadLabelsRequest.ProtoReflect.Descriptor instead. func (*GetAllWorkloadLabelsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{57} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{76} } func (x *GetAllWorkloadLabelsRequest) GetTeamId() string { @@ -4344,7 +5816,7 @@ type GetAllWorkloadLabelsResponse struct { func (x *GetAllWorkloadLabelsResponse) Reset() { *x = GetAllWorkloadLabelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[58] + mi := &file_api_v1_k8s_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4357,7 +5829,7 @@ func (x *GetAllWorkloadLabelsResponse) String() string { func (*GetAllWorkloadLabelsResponse) ProtoMessage() {} func (x *GetAllWorkloadLabelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[58] + mi := &file_api_v1_k8s_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4370,7 +5842,7 @@ func (x *GetAllWorkloadLabelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllWorkloadLabelsResponse.ProtoReflect.Descriptor instead. func (*GetAllWorkloadLabelsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{58} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{77} } func (x *GetAllWorkloadLabelsResponse) GetClusterIdWithLabels() []*ClusterElement { @@ -4395,7 +5867,7 @@ type GetAllNodeGroupNamesRequest struct { func (x *GetAllNodeGroupNamesRequest) Reset() { *x = GetAllNodeGroupNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[59] + mi := &file_api_v1_k8s_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4408,7 +5880,7 @@ func (x *GetAllNodeGroupNamesRequest) String() string { func (*GetAllNodeGroupNamesRequest) ProtoMessage() {} func (x *GetAllNodeGroupNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[59] + mi := &file_api_v1_k8s_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4421,7 +5893,7 @@ func (x *GetAllNodeGroupNamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNodeGroupNamesRequest.ProtoReflect.Descriptor instead. func (*GetAllNodeGroupNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{59} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{78} } func (x *GetAllNodeGroupNamesRequest) GetTeamId() string { @@ -4470,7 +5942,7 @@ type GetAllNodeGroupNamesResponse struct { func (x *GetAllNodeGroupNamesResponse) Reset() { *x = GetAllNodeGroupNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[60] + mi := &file_api_v1_k8s_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4483,7 +5955,7 @@ func (x *GetAllNodeGroupNamesResponse) String() string { func (*GetAllNodeGroupNamesResponse) ProtoMessage() {} func (x *GetAllNodeGroupNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[60] + mi := &file_api_v1_k8s_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4496,7 +5968,7 @@ func (x *GetAllNodeGroupNamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAllNodeGroupNamesResponse.ProtoReflect.Descriptor instead. func (*GetAllNodeGroupNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{60} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{79} } func (x *GetAllNodeGroupNamesResponse) GetClusterIdWithNodeGroupNames() []*ClusterElement { @@ -4554,7 +6026,7 @@ type Cluster struct { func (x *Cluster) Reset() { *x = Cluster{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[61] + mi := &file_api_v1_k8s_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4567,7 +6039,7 @@ func (x *Cluster) String() string { func (*Cluster) ProtoMessage() {} func (x *Cluster) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[61] + mi := &file_api_v1_k8s_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4580,7 +6052,7 @@ func (x *Cluster) ProtoReflect() protoreflect.Message { // Deprecated: Use Cluster.ProtoReflect.Descriptor instead. func (*Cluster) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{61} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{80} } func (x *Cluster) GetId() string { @@ -4855,7 +6327,7 @@ type OperatorInfo struct { func (x *OperatorInfo) Reset() { *x = OperatorInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[62] + mi := &file_api_v1_k8s_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4868,7 +6340,7 @@ func (x *OperatorInfo) String() string { func (*OperatorInfo) ProtoMessage() {} func (x *OperatorInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[62] + mi := &file_api_v1_k8s_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4881,7 +6353,7 @@ func (x *OperatorInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OperatorInfo.ProtoReflect.Descriptor instead. func (*OperatorInfo) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{62} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{81} } func (x *OperatorInfo) GetVersion() string { @@ -4919,7 +6391,7 @@ type Container struct { func (x *Container) Reset() { *x = Container{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[63] + mi := &file_api_v1_k8s_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4932,7 +6404,7 @@ func (x *Container) String() string { func (*Container) ProtoMessage() {} func (x *Container) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[63] + mi := &file_api_v1_k8s_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4945,7 +6417,7 @@ func (x *Container) ProtoReflect() protoreflect.Message { // Deprecated: Use Container.ProtoReflect.Descriptor instead. func (*Container) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{63} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{82} } func (x *Container) GetId() string { @@ -4978,7 +6450,7 @@ type GetLatestOperatorVersionRequest struct { func (x *GetLatestOperatorVersionRequest) Reset() { *x = GetLatestOperatorVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[64] + mi := &file_api_v1_k8s_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4991,7 +6463,7 @@ func (x *GetLatestOperatorVersionRequest) String() string { func (*GetLatestOperatorVersionRequest) ProtoMessage() {} func (x *GetLatestOperatorVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[64] + mi := &file_api_v1_k8s_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5004,7 +6476,7 @@ func (x *GetLatestOperatorVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestOperatorVersionRequest.ProtoReflect.Descriptor instead. func (*GetLatestOperatorVersionRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{64} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{83} } type GetLatestOperatorVersionResponse struct { @@ -5026,12 +6498,15 @@ type GetLatestOperatorVersionResponse struct { SecurityOpHelmInfo *OperatorInfo `protobuf:"bytes,32,opt,name=security_op_helm_info,json=securityOpHelmInfo,proto3" json:"security_op_helm_info,omitempty"` TrezrInfo *OperatorInfo `protobuf:"bytes,41,opt,name=trezr_info,json=trezrInfo,proto3" json:"trezr_info,omitempty"` TrezrHelmInfo *OperatorInfo `protobuf:"bytes,42,opt,name=trezr_helm_info,json=trezrHelmInfo,proto3" json:"trezr_helm_info,omitempty"` + // checkpoint-restore-operator helm chart (snapshot policies). Placeholder + // version until the DevZero-authored chart is published. + SnapshotHelmInfo *OperatorInfo `protobuf:"bytes,51,opt,name=snapshot_helm_info,json=snapshotHelmInfo,proto3" json:"snapshot_helm_info,omitempty"` } func (x *GetLatestOperatorVersionResponse) Reset() { *x = GetLatestOperatorVersionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[65] + mi := &file_api_v1_k8s_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5044,7 +6519,7 @@ func (x *GetLatestOperatorVersionResponse) String() string { func (*GetLatestOperatorVersionResponse) ProtoMessage() {} func (x *GetLatestOperatorVersionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[65] + mi := &file_api_v1_k8s_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5057,7 +6532,7 @@ func (x *GetLatestOperatorVersionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestOperatorVersionResponse.ProtoReflect.Descriptor instead. func (*GetLatestOperatorVersionResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{65} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{84} } func (x *GetLatestOperatorVersionResponse) GetZxpInfo() *OperatorInfo { @@ -5158,6 +6633,13 @@ func (x *GetLatestOperatorVersionResponse) GetTrezrHelmInfo() *OperatorInfo { return nil } +func (x *GetLatestOperatorVersionResponse) GetSnapshotHelmInfo() *OperatorInfo { + if x != nil { + return x.SnapshotHelmInfo + } + return nil +} + type GalaxyGetWorkloadPerspectiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5172,7 +6654,7 @@ type GalaxyGetWorkloadPerspectiveRequest struct { func (x *GalaxyGetWorkloadPerspectiveRequest) Reset() { *x = GalaxyGetWorkloadPerspectiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[66] + mi := &file_api_v1_k8s_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5185,7 +6667,7 @@ func (x *GalaxyGetWorkloadPerspectiveRequest) String() string { func (*GalaxyGetWorkloadPerspectiveRequest) ProtoMessage() {} func (x *GalaxyGetWorkloadPerspectiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[66] + mi := &file_api_v1_k8s_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5198,7 +6680,7 @@ func (x *GalaxyGetWorkloadPerspectiveRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GalaxyGetWorkloadPerspectiveRequest.ProtoReflect.Descriptor instead. func (*GalaxyGetWorkloadPerspectiveRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{66} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{85} } func (x *GalaxyGetWorkloadPerspectiveRequest) GetTeamId() string { @@ -5242,7 +6724,7 @@ type GalaxyGetWorkloadPerspectiveResponse struct { func (x *GalaxyGetWorkloadPerspectiveResponse) Reset() { *x = GalaxyGetWorkloadPerspectiveResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[67] + mi := &file_api_v1_k8s_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5255,7 +6737,7 @@ func (x *GalaxyGetWorkloadPerspectiveResponse) String() string { func (*GalaxyGetWorkloadPerspectiveResponse) ProtoMessage() {} func (x *GalaxyGetWorkloadPerspectiveResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[67] + mi := &file_api_v1_k8s_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5268,7 +6750,7 @@ func (x *GalaxyGetWorkloadPerspectiveResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GalaxyGetWorkloadPerspectiveResponse.ProtoReflect.Descriptor instead. func (*GalaxyGetWorkloadPerspectiveResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{67} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{86} } func (x *GalaxyGetWorkloadPerspectiveResponse) GetGroupings() []*GalaxyWorkloadGroup { @@ -5310,7 +6792,7 @@ type GalaxyWorkloadGroup struct { func (x *GalaxyWorkloadGroup) Reset() { *x = GalaxyWorkloadGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[68] + mi := &file_api_v1_k8s_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5323,7 +6805,7 @@ func (x *GalaxyWorkloadGroup) String() string { func (*GalaxyWorkloadGroup) ProtoMessage() {} func (x *GalaxyWorkloadGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[68] + mi := &file_api_v1_k8s_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5336,7 +6818,7 @@ func (x *GalaxyWorkloadGroup) ProtoReflect() protoreflect.Message { // Deprecated: Use GalaxyWorkloadGroup.ProtoReflect.Descriptor instead. func (*GalaxyWorkloadGroup) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{68} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{87} } func (x *GalaxyWorkloadGroup) GetGroupKey() string { @@ -5394,7 +6876,7 @@ type PerspectiveDatapointOpts struct { func (x *PerspectiveDatapointOpts) Reset() { *x = PerspectiveDatapointOpts{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[69] + mi := &file_api_v1_k8s_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5407,7 +6889,7 @@ func (x *PerspectiveDatapointOpts) String() string { func (*PerspectiveDatapointOpts) ProtoMessage() {} func (x *PerspectiveDatapointOpts) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[69] + mi := &file_api_v1_k8s_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5420,7 +6902,7 @@ func (x *PerspectiveDatapointOpts) ProtoReflect() protoreflect.Message { // Deprecated: Use PerspectiveDatapointOpts.ProtoReflect.Descriptor instead. func (*PerspectiveDatapointOpts) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{69} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{88} } func (x *PerspectiveDatapointOpts) GetTimeStart() int64 { @@ -5471,7 +6953,7 @@ type ListAuditLogsRequest struct { func (x *ListAuditLogsRequest) Reset() { *x = ListAuditLogsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[70] + mi := &file_api_v1_k8s_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5484,7 +6966,7 @@ func (x *ListAuditLogsRequest) String() string { func (*ListAuditLogsRequest) ProtoMessage() {} func (x *ListAuditLogsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[70] + mi := &file_api_v1_k8s_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5497,7 +6979,7 @@ func (x *ListAuditLogsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogsRequest.ProtoReflect.Descriptor instead. func (*ListAuditLogsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{70} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{89} } func (x *ListAuditLogsRequest) GetTeamId() string { @@ -5619,7 +7101,7 @@ type ListAuditLogsResponse struct { func (x *ListAuditLogsResponse) Reset() { *x = ListAuditLogsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[71] + mi := &file_api_v1_k8s_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5632,7 +7114,7 @@ func (x *ListAuditLogsResponse) String() string { func (*ListAuditLogsResponse) ProtoMessage() {} func (x *ListAuditLogsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[71] + mi := &file_api_v1_k8s_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5645,7 +7127,7 @@ func (x *ListAuditLogsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogsResponse.ProtoReflect.Descriptor instead. func (*ListAuditLogsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{71} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{90} } func (x *ListAuditLogsResponse) GetLogs() []*AuditLogEntry { @@ -5687,7 +7169,7 @@ type ListAuditLogOriginatorsRequest struct { func (x *ListAuditLogOriginatorsRequest) Reset() { *x = ListAuditLogOriginatorsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[72] + mi := &file_api_v1_k8s_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5700,7 +7182,7 @@ func (x *ListAuditLogOriginatorsRequest) String() string { func (*ListAuditLogOriginatorsRequest) ProtoMessage() {} func (x *ListAuditLogOriginatorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[72] + mi := &file_api_v1_k8s_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5713,7 +7195,7 @@ func (x *ListAuditLogOriginatorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogOriginatorsRequest.ProtoReflect.Descriptor instead. func (*ListAuditLogOriginatorsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{72} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{91} } func (x *ListAuditLogOriginatorsRequest) GetTeamId() string { @@ -5820,7 +7302,7 @@ type ListAuditLogOriginatorsResponse struct { func (x *ListAuditLogOriginatorsResponse) Reset() { *x = ListAuditLogOriginatorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[73] + mi := &file_api_v1_k8s_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5833,7 +7315,7 @@ func (x *ListAuditLogOriginatorsResponse) String() string { func (*ListAuditLogOriginatorsResponse) ProtoMessage() {} func (x *ListAuditLogOriginatorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[73] + mi := &file_api_v1_k8s_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5846,7 +7328,7 @@ func (x *ListAuditLogOriginatorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAuditLogOriginatorsResponse.ProtoReflect.Descriptor instead. func (*ListAuditLogOriginatorsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{73} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{92} } func (x *ListAuditLogOriginatorsResponse) GetEmailAddresses() []string { @@ -5872,7 +7354,7 @@ type SendWorkloadEmailRequest struct { func (x *SendWorkloadEmailRequest) Reset() { *x = SendWorkloadEmailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[74] + mi := &file_api_v1_k8s_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5885,7 +7367,7 @@ func (x *SendWorkloadEmailRequest) String() string { func (*SendWorkloadEmailRequest) ProtoMessage() {} func (x *SendWorkloadEmailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[74] + mi := &file_api_v1_k8s_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5898,7 +7380,7 @@ func (x *SendWorkloadEmailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWorkloadEmailRequest.ProtoReflect.Descriptor instead. func (*SendWorkloadEmailRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{74} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{93} } func (x *SendWorkloadEmailRequest) GetTeamId() string { @@ -5948,7 +7430,7 @@ type SendWorkloadEmailResponse struct { func (x *SendWorkloadEmailResponse) Reset() { *x = SendWorkloadEmailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[75] + mi := &file_api_v1_k8s_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5961,7 +7443,7 @@ func (x *SendWorkloadEmailResponse) String() string { func (*SendWorkloadEmailResponse) ProtoMessage() {} func (x *SendWorkloadEmailResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[75] + mi := &file_api_v1_k8s_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5974,7 +7456,7 @@ func (x *SendWorkloadEmailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWorkloadEmailResponse.ProtoReflect.Descriptor instead. func (*SendWorkloadEmailResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{75} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{94} } func (x *SendWorkloadEmailResponse) GetMessage() string { @@ -5996,7 +7478,7 @@ type SendWeeklySummaryEmailRequest struct { func (x *SendWeeklySummaryEmailRequest) Reset() { *x = SendWeeklySummaryEmailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[76] + mi := &file_api_v1_k8s_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6009,7 +7491,7 @@ func (x *SendWeeklySummaryEmailRequest) String() string { func (*SendWeeklySummaryEmailRequest) ProtoMessage() {} func (x *SendWeeklySummaryEmailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[76] + mi := &file_api_v1_k8s_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6022,7 +7504,7 @@ func (x *SendWeeklySummaryEmailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWeeklySummaryEmailRequest.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{76} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{95} } func (x *SendWeeklySummaryEmailRequest) GetRequest() *SendWeeklySummaryEmailRequestData { @@ -6045,7 +7527,7 @@ type SendWeeklySummaryEmailRequestData struct { func (x *SendWeeklySummaryEmailRequestData) Reset() { *x = SendWeeklySummaryEmailRequestData{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[77] + mi := &file_api_v1_k8s_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6058,7 +7540,7 @@ func (x *SendWeeklySummaryEmailRequestData) String() string { func (*SendWeeklySummaryEmailRequestData) ProtoMessage() {} func (x *SendWeeklySummaryEmailRequestData) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[77] + mi := &file_api_v1_k8s_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6071,7 +7553,7 @@ func (x *SendWeeklySummaryEmailRequestData) ProtoReflect() protoreflect.Message // Deprecated: Use SendWeeklySummaryEmailRequestData.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailRequestData) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{77} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{96} } func (x *SendWeeklySummaryEmailRequestData) GetTeamId() string { @@ -6100,7 +7582,7 @@ type SendWeeklySummaryEmailResponse struct { func (x *SendWeeklySummaryEmailResponse) Reset() { *x = SendWeeklySummaryEmailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[78] + mi := &file_api_v1_k8s_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6113,7 +7595,7 @@ func (x *SendWeeklySummaryEmailResponse) String() string { func (*SendWeeklySummaryEmailResponse) ProtoMessage() {} func (x *SendWeeklySummaryEmailResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[78] + mi := &file_api_v1_k8s_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6126,7 +7608,7 @@ func (x *SendWeeklySummaryEmailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendWeeklySummaryEmailResponse.ProtoReflect.Descriptor instead. func (*SendWeeklySummaryEmailResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{78} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{97} } func (x *SendWeeklySummaryEmailResponse) GetMessage() string { @@ -6154,7 +7636,7 @@ type GetClustersNodeInfoRequest struct { func (x *GetClustersNodeInfoRequest) Reset() { *x = GetClustersNodeInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[79] + mi := &file_api_v1_k8s_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6167,7 +7649,7 @@ func (x *GetClustersNodeInfoRequest) String() string { func (*GetClustersNodeInfoRequest) ProtoMessage() {} func (x *GetClustersNodeInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[79] + mi := &file_api_v1_k8s_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6180,7 +7662,7 @@ func (x *GetClustersNodeInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersNodeInfoRequest.ProtoReflect.Descriptor instead. func (*GetClustersNodeInfoRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{79} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{98} } func (x *GetClustersNodeInfoRequest) GetTeamId() string { @@ -6247,7 +7729,7 @@ type GetClustersNodeInfoResponse struct { func (x *GetClustersNodeInfoResponse) Reset() { *x = GetClustersNodeInfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[80] + mi := &file_api_v1_k8s_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6260,7 +7742,7 @@ func (x *GetClustersNodeInfoResponse) String() string { func (*GetClustersNodeInfoResponse) ProtoMessage() {} func (x *GetClustersNodeInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[80] + mi := &file_api_v1_k8s_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6273,7 +7755,7 @@ func (x *GetClustersNodeInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetClustersNodeInfoResponse.ProtoReflect.Descriptor instead. func (*GetClustersNodeInfoResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{80} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{99} } func (x *GetClustersNodeInfoResponse) GetNodeInfo() *NodeInfo { @@ -6318,7 +7800,7 @@ type SearchK8SResourcesRequest struct { func (x *SearchK8SResourcesRequest) Reset() { *x = SearchK8SResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[81] + mi := &file_api_v1_k8s_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6331,7 +7813,7 @@ func (x *SearchK8SResourcesRequest) String() string { func (*SearchK8SResourcesRequest) ProtoMessage() {} func (x *SearchK8SResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[81] + mi := &file_api_v1_k8s_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6344,7 +7826,7 @@ func (x *SearchK8SResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SResourcesRequest.ProtoReflect.Descriptor instead. func (*SearchK8SResourcesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{81} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{100} } func (x *SearchK8SResourcesRequest) GetTeamId() string { @@ -6386,7 +7868,7 @@ type SearchK8SResourcesResponse struct { func (x *SearchK8SResourcesResponse) Reset() { *x = SearchK8SResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[82] + mi := &file_api_v1_k8s_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6399,7 +7881,7 @@ func (x *SearchK8SResourcesResponse) String() string { func (*SearchK8SResourcesResponse) ProtoMessage() {} func (x *SearchK8SResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[82] + mi := &file_api_v1_k8s_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6412,7 +7894,7 @@ func (x *SearchK8SResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SResourcesResponse.ProtoReflect.Descriptor instead. func (*SearchK8SResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{82} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{101} } func (x *SearchK8SResourcesResponse) GetResults() []*K8SSearchResult { @@ -6437,7 +7919,7 @@ type K8SSearchResult struct { func (x *K8SSearchResult) Reset() { *x = K8SSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[83] + mi := &file_api_v1_k8s_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6450,7 +7932,7 @@ func (x *K8SSearchResult) String() string { func (*K8SSearchResult) ProtoMessage() {} func (x *K8SSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[83] + mi := &file_api_v1_k8s_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6463,7 +7945,7 @@ func (x *K8SSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SSearchResult.ProtoReflect.Descriptor instead. func (*K8SSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{83} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{102} } func (x *K8SSearchResult) GetUid() string { @@ -6514,7 +7996,7 @@ type SearchK8SWorkloadsRequest struct { func (x *SearchK8SWorkloadsRequest) Reset() { *x = SearchK8SWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[84] + mi := &file_api_v1_k8s_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6527,7 +8009,7 @@ func (x *SearchK8SWorkloadsRequest) String() string { func (*SearchK8SWorkloadsRequest) ProtoMessage() {} func (x *SearchK8SWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[84] + mi := &file_api_v1_k8s_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6540,7 +8022,7 @@ func (x *SearchK8SWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SWorkloadsRequest.ProtoReflect.Descriptor instead. func (*SearchK8SWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{84} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{103} } func (x *SearchK8SWorkloadsRequest) GetTeamId() string { @@ -6575,7 +8057,7 @@ type SearchK8SWorkloadsResponse struct { func (x *SearchK8SWorkloadsResponse) Reset() { *x = SearchK8SWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[85] + mi := &file_api_v1_k8s_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6588,7 +8070,7 @@ func (x *SearchK8SWorkloadsResponse) String() string { func (*SearchK8SWorkloadsResponse) ProtoMessage() {} func (x *SearchK8SWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[85] + mi := &file_api_v1_k8s_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6601,7 +8083,7 @@ func (x *SearchK8SWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchK8SWorkloadsResponse.ProtoReflect.Descriptor instead. func (*SearchK8SWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{85} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{104} } func (x *SearchK8SWorkloadsResponse) GetResults() []*K8SWorkloadSearchResult { @@ -6623,7 +8105,7 @@ type K8SWorkloadSearchResult struct { func (x *K8SWorkloadSearchResult) Reset() { *x = K8SWorkloadSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[86] + mi := &file_api_v1_k8s_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6636,7 +8118,7 @@ func (x *K8SWorkloadSearchResult) String() string { func (*K8SWorkloadSearchResult) ProtoMessage() {} func (x *K8SWorkloadSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[86] + mi := &file_api_v1_k8s_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6649,7 +8131,7 @@ func (x *K8SWorkloadSearchResult) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SWorkloadSearchResult.ProtoReflect.Descriptor instead. func (*K8SWorkloadSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{86} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{105} } func (x *K8SWorkloadSearchResult) GetKind() string { @@ -6680,7 +8162,7 @@ type MetadataForWorkloadsRequest struct { func (x *MetadataForWorkloadsRequest) Reset() { *x = MetadataForWorkloadsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[87] + mi := &file_api_v1_k8s_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6693,7 +8175,7 @@ func (x *MetadataForWorkloadsRequest) String() string { func (*MetadataForWorkloadsRequest) ProtoMessage() {} func (x *MetadataForWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[87] + mi := &file_api_v1_k8s_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6706,7 +8188,7 @@ func (x *MetadataForWorkloadsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MetadataForWorkloadsRequest.ProtoReflect.Descriptor instead. func (*MetadataForWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{87} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{106} } func (x *MetadataForWorkloadsRequest) GetTeamId() string { @@ -6748,7 +8230,7 @@ type MetadataForWorkloadsResponse struct { func (x *MetadataForWorkloadsResponse) Reset() { *x = MetadataForWorkloadsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[88] + mi := &file_api_v1_k8s_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6761,7 +8243,7 @@ func (x *MetadataForWorkloadsResponse) String() string { func (*MetadataForWorkloadsResponse) ProtoMessage() {} func (x *MetadataForWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[88] + mi := &file_api_v1_k8s_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6774,7 +8256,7 @@ func (x *MetadataForWorkloadsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MetadataForWorkloadsResponse.ProtoReflect.Descriptor instead. func (*MetadataForWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{88} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{107} } func (x *MetadataForWorkloadsResponse) GetWorkloadUidToMetadata() map[string]*WorkloadMetadata { @@ -6797,7 +8279,7 @@ type AddClusterTagsRequest struct { func (x *AddClusterTagsRequest) Reset() { *x = AddClusterTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[89] + mi := &file_api_v1_k8s_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6810,7 +8292,7 @@ func (x *AddClusterTagsRequest) String() string { func (*AddClusterTagsRequest) ProtoMessage() {} func (x *AddClusterTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[89] + mi := &file_api_v1_k8s_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6823,7 +8305,7 @@ func (x *AddClusterTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddClusterTagsRequest.ProtoReflect.Descriptor instead. func (*AddClusterTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{89} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{108} } func (x *AddClusterTagsRequest) GetTeamId() string { @@ -6858,7 +8340,7 @@ type AddClusterTagsResponse struct { func (x *AddClusterTagsResponse) Reset() { *x = AddClusterTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[90] + mi := &file_api_v1_k8s_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6871,7 +8353,7 @@ func (x *AddClusterTagsResponse) String() string { func (*AddClusterTagsResponse) ProtoMessage() {} func (x *AddClusterTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[90] + mi := &file_api_v1_k8s_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6884,7 +8366,7 @@ func (x *AddClusterTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddClusterTagsResponse.ProtoReflect.Descriptor instead. func (*AddClusterTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{90} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{109} } func (x *AddClusterTagsResponse) GetCluster() *Cluster { @@ -6907,7 +8389,7 @@ type RemoveClusterTagsRequest struct { func (x *RemoveClusterTagsRequest) Reset() { *x = RemoveClusterTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[91] + mi := &file_api_v1_k8s_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6920,7 +8402,7 @@ func (x *RemoveClusterTagsRequest) String() string { func (*RemoveClusterTagsRequest) ProtoMessage() {} func (x *RemoveClusterTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[91] + mi := &file_api_v1_k8s_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6933,7 +8415,7 @@ func (x *RemoveClusterTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveClusterTagsRequest.ProtoReflect.Descriptor instead. func (*RemoveClusterTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{91} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{110} } func (x *RemoveClusterTagsRequest) GetTeamId() string { @@ -6968,7 +8450,7 @@ type RemoveClusterTagsResponse struct { func (x *RemoveClusterTagsResponse) Reset() { *x = RemoveClusterTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[92] + mi := &file_api_v1_k8s_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6981,7 +8463,7 @@ func (x *RemoveClusterTagsResponse) String() string { func (*RemoveClusterTagsResponse) ProtoMessage() {} func (x *RemoveClusterTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[92] + mi := &file_api_v1_k8s_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6994,7 +8476,7 @@ func (x *RemoveClusterTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveClusterTagsResponse.ProtoReflect.Descriptor instead. func (*RemoveClusterTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{92} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{111} } func (x *RemoveClusterTagsResponse) GetCluster() *Cluster { @@ -7015,7 +8497,7 @@ type ListTagsRequest struct { func (x *ListTagsRequest) Reset() { *x = ListTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[93] + mi := &file_api_v1_k8s_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7028,7 +8510,7 @@ func (x *ListTagsRequest) String() string { func (*ListTagsRequest) ProtoMessage() {} func (x *ListTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[93] + mi := &file_api_v1_k8s_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7041,7 +8523,7 @@ func (x *ListTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTagsRequest.ProtoReflect.Descriptor instead. func (*ListTagsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{93} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{112} } func (x *ListTagsRequest) GetTeamId() string { @@ -7063,7 +8545,7 @@ type TagSummary struct { func (x *TagSummary) Reset() { *x = TagSummary{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[94] + mi := &file_api_v1_k8s_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7076,7 +8558,7 @@ func (x *TagSummary) String() string { func (*TagSummary) ProtoMessage() {} func (x *TagSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[94] + mi := &file_api_v1_k8s_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7089,7 +8571,7 @@ func (x *TagSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use TagSummary.ProtoReflect.Descriptor instead. func (*TagSummary) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{94} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{113} } func (x *TagSummary) GetTag() string { @@ -7117,7 +8599,7 @@ type ListTagsResponse struct { func (x *ListTagsResponse) Reset() { *x = ListTagsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[95] + mi := &file_api_v1_k8s_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7130,7 +8612,7 @@ func (x *ListTagsResponse) String() string { func (*ListTagsResponse) ProtoMessage() {} func (x *ListTagsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[95] + mi := &file_api_v1_k8s_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7143,7 +8625,7 @@ func (x *ListTagsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTagsResponse.ProtoReflect.Descriptor instead. func (*ListTagsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{95} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{114} } func (x *ListTagsResponse) GetTags() []*TagSummary { @@ -7171,7 +8653,7 @@ type WorkloadMetadata struct { func (x *WorkloadMetadata) Reset() { *x = WorkloadMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[96] + mi := &file_api_v1_k8s_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7184,7 +8666,7 @@ func (x *WorkloadMetadata) String() string { func (*WorkloadMetadata) ProtoMessage() {} func (x *WorkloadMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[96] + mi := &file_api_v1_k8s_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7197,7 +8679,7 @@ func (x *WorkloadMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadMetadata.ProtoReflect.Descriptor instead. func (*WorkloadMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{96} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{115} } func (x *WorkloadMetadata) GetPodUidToNodeMetadata() map[string]*NodeMetadata { @@ -7272,7 +8754,7 @@ type PodMetadata struct { func (x *PodMetadata) Reset() { *x = PodMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[97] + mi := &file_api_v1_k8s_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7285,7 +8767,7 @@ func (x *PodMetadata) String() string { func (*PodMetadata) ProtoMessage() {} func (x *PodMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[97] + mi := &file_api_v1_k8s_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7298,7 +8780,7 @@ func (x *PodMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use PodMetadata.ProtoReflect.Descriptor instead. func (*PodMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{97} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{116} } func (x *PodMetadata) GetName() string { @@ -7362,7 +8844,7 @@ type NodeMetadata struct { func (x *NodeMetadata) Reset() { *x = NodeMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[98] + mi := &file_api_v1_k8s_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7375,7 +8857,7 @@ func (x *NodeMetadata) String() string { func (*NodeMetadata) ProtoMessage() {} func (x *NodeMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[98] + mi := &file_api_v1_k8s_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7388,7 +8870,7 @@ func (x *NodeMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeMetadata.ProtoReflect.Descriptor instead. func (*NodeMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{98} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{117} } func (x *NodeMetadata) GetNodeName() string { @@ -7470,7 +8952,7 @@ type GetRelatedResourcesRequest struct { func (x *GetRelatedResourcesRequest) Reset() { *x = GetRelatedResourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[99] + mi := &file_api_v1_k8s_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7483,7 +8965,7 @@ func (x *GetRelatedResourcesRequest) String() string { func (*GetRelatedResourcesRequest) ProtoMessage() {} func (x *GetRelatedResourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[99] + mi := &file_api_v1_k8s_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7496,7 +8978,7 @@ func (x *GetRelatedResourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRelatedResourcesRequest.ProtoReflect.Descriptor instead. func (*GetRelatedResourcesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{99} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{118} } func (x *GetRelatedResourcesRequest) GetTeamId() string { @@ -7548,7 +9030,7 @@ type GetWorkloadPodHistoryResponse struct { func (x *GetWorkloadPodHistoryResponse) Reset() { *x = GetWorkloadPodHistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[100] + mi := &file_api_v1_k8s_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7561,7 +9043,7 @@ func (x *GetWorkloadPodHistoryResponse) String() string { func (*GetWorkloadPodHistoryResponse) ProtoMessage() {} func (x *GetWorkloadPodHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[100] + mi := &file_api_v1_k8s_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7574,7 +9056,7 @@ func (x *GetWorkloadPodHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadPodHistoryResponse.ProtoReflect.Descriptor instead. func (*GetWorkloadPodHistoryResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{100} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{119} } func (x *GetWorkloadPodHistoryResponse) GetWorkloadUid() string { @@ -7621,7 +9103,7 @@ type JobHistory struct { func (x *JobHistory) Reset() { *x = JobHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[101] + mi := &file_api_v1_k8s_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7634,7 +9116,7 @@ func (x *JobHistory) String() string { func (*JobHistory) ProtoMessage() {} func (x *JobHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[101] + mi := &file_api_v1_k8s_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7647,7 +9129,7 @@ func (x *JobHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use JobHistory.ProtoReflect.Descriptor instead. func (*JobHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{101} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{120} } func (x *JobHistory) GetUid() string { @@ -7708,7 +9190,7 @@ type ReplicaSetHistory struct { func (x *ReplicaSetHistory) Reset() { *x = ReplicaSetHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[102] + mi := &file_api_v1_k8s_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7721,7 +9203,7 @@ func (x *ReplicaSetHistory) String() string { func (*ReplicaSetHistory) ProtoMessage() {} func (x *ReplicaSetHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[102] + mi := &file_api_v1_k8s_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7734,7 +9216,7 @@ func (x *ReplicaSetHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicaSetHistory.ProtoReflect.Descriptor instead. func (*ReplicaSetHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{102} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{121} } func (x *ReplicaSetHistory) GetUid() string { @@ -7796,7 +9278,7 @@ type PodHistory struct { func (x *PodHistory) Reset() { *x = PodHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[103] + mi := &file_api_v1_k8s_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7809,7 +9291,7 @@ func (x *PodHistory) String() string { func (*PodHistory) ProtoMessage() {} func (x *PodHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[103] + mi := &file_api_v1_k8s_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7822,7 +9304,7 @@ func (x *PodHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use PodHistory.ProtoReflect.Descriptor instead. func (*PodHistory) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{103} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{122} } func (x *PodHistory) GetUid() string { @@ -7887,7 +9369,7 @@ type GetRelatedResourcesResponse struct { func (x *GetRelatedResourcesResponse) Reset() { *x = GetRelatedResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[104] + mi := &file_api_v1_k8s_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7900,7 +9382,7 @@ func (x *GetRelatedResourcesResponse) String() string { func (*GetRelatedResourcesResponse) ProtoMessage() {} func (x *GetRelatedResourcesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[104] + mi := &file_api_v1_k8s_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7913,7 +9395,7 @@ func (x *GetRelatedResourcesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRelatedResourcesResponse.ProtoReflect.Descriptor instead. func (*GetRelatedResourcesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{104} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{123} } func (x *GetRelatedResourcesResponse) GetRelations() []*K8SRelatedResource { @@ -7955,7 +9437,7 @@ type K8SRelatedResource struct { func (x *K8SRelatedResource) Reset() { *x = K8SRelatedResource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[105] + mi := &file_api_v1_k8s_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7968,7 +9450,7 @@ func (x *K8SRelatedResource) String() string { func (*K8SRelatedResource) ProtoMessage() {} func (x *K8SRelatedResource) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[105] + mi := &file_api_v1_k8s_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7981,7 +9463,7 @@ func (x *K8SRelatedResource) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SRelatedResource.ProtoReflect.Descriptor instead. func (*K8SRelatedResource) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{105} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{124} } func (x *K8SRelatedResource) GetSourceKind() string { @@ -8047,7 +9529,7 @@ type K8SResourceNode struct { func (x *K8SResourceNode) Reset() { *x = K8SResourceNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[106] + mi := &file_api_v1_k8s_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8060,7 +9542,7 @@ func (x *K8SResourceNode) String() string { func (*K8SResourceNode) ProtoMessage() {} func (x *K8SResourceNode) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[106] + mi := &file_api_v1_k8s_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8073,7 +9555,7 @@ func (x *K8SResourceNode) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SResourceNode.ProtoReflect.Descriptor instead. func (*K8SResourceNode) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{106} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{125} } func (x *K8SResourceNode) GetId() string { @@ -8112,7 +9594,7 @@ type K8SResourceEdge struct { func (x *K8SResourceEdge) Reset() { *x = K8SResourceEdge{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[107] + mi := &file_api_v1_k8s_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8125,7 +9607,7 @@ func (x *K8SResourceEdge) String() string { func (*K8SResourceEdge) ProtoMessage() {} func (x *K8SResourceEdge) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[107] + mi := &file_api_v1_k8s_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8138,7 +9620,7 @@ func (x *K8SResourceEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use K8SResourceEdge.ProtoReflect.Descriptor instead. func (*K8SResourceEdge) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{107} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{126} } func (x *K8SResourceEdge) GetId() string { @@ -8155,47 +9637,158 @@ func (x *K8SResourceEdge) GetSource() string { return "" } -func (x *K8SResourceEdge) GetTarget() string { +func (x *K8SResourceEdge) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *K8SResourceEdge) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +// GetClusterTypeRequest is used to determine the cluster type based on kubelet version +type GetClusterTypeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. +} + +func (x *GetClusterTypeRequest) Reset() { + *x = GetClusterTypeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterTypeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterTypeRequest) ProtoMessage() {} + +func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[127] + 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 GetClusterTypeRequest.ProtoReflect.Descriptor instead. +func (*GetClusterTypeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{127} +} + +func (x *GetClusterTypeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetClusterTypeRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// GetClusterTypeResponse returns the determined cluster type +type GetClusterTypeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterType ClusterType `protobuf:"varint,1,opt,name=cluster_type,json=clusterType,proto3,enum=api.v1.ClusterType" json:"cluster_type,omitempty"` // Detected cluster type + KubeletVersion string `protobuf:"bytes,2,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // The raw kubelet version string +} + +func (x *GetClusterTypeResponse) Reset() { + *x = GetClusterTypeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_k8s_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterTypeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterTypeResponse) ProtoMessage() {} + +func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[128] + 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 GetClusterTypeResponse.ProtoReflect.Descriptor instead. +func (*GetClusterTypeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{128} +} + +func (x *GetClusterTypeResponse) GetClusterType() ClusterType { if x != nil { - return x.Target + return x.ClusterType } - return "" + return ClusterType_CLUSTER_TYPE_UNSPECIFIED } -func (x *K8SResourceEdge) GetLabel() string { +func (x *GetClusterTypeResponse) GetKubeletVersion() string { if x != nil { - return x.Label + return x.KubeletVersion } return "" } -// GetClusterTypeRequest is used to determine the cluster type based on kubelet version -type GetClusterTypeRequest struct { +type GetMigPartedConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetClusterTypeRequest) Reset() { - *x = GetClusterTypeRequest{} +func (x *GetMigPartedConfigRequest) Reset() { + *x = GetMigPartedConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[108] + mi := &file_api_v1_k8s_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterTypeRequest) String() string { +func (x *GetMigPartedConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterTypeRequest) ProtoMessage() {} +func (*GetMigPartedConfigRequest) ProtoMessage() {} -func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[108] +func (x *GetMigPartedConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8206,52 +9799,62 @@ func (x *GetClusterTypeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterTypeRequest.ProtoReflect.Descriptor instead. -func (*GetClusterTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{108} +// Deprecated: Use GetMigPartedConfigRequest.ProtoReflect.Descriptor instead. +func (*GetMigPartedConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{129} } -func (x *GetClusterTypeRequest) GetTeamId() string { +func (x *GetMigPartedConfigRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetClusterTypeRequest) GetClusterId() string { +func (x *GetMigPartedConfigRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -// GetClusterTypeResponse returns the determined cluster type -type GetClusterTypeResponse struct { +type GetMigPartedConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterType ClusterType `protobuf:"varint,1,opt,name=cluster_type,json=clusterType,proto3,enum=api.v1.ClusterType" json:"cluster_type,omitempty"` // Detected cluster type - KubeletVersion string `protobuf:"bytes,2,opt,name=kubelet_version,json=kubeletVersion,proto3" json:"kubelet_version,omitempty"` // The raw kubelet version string + // Whether a mig-parted ConfigMap has been collected for this cluster. + Found bool `protobuf:"varint,1,opt,name=found,proto3" json:"found,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + // Config schema version (e.g. v1). + Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` + // Parsed profile map from config.yaml as JSON: + // {profile-name: [{devices, mig-enabled, mig-devices}, ...]}. + MigConfigsJson string `protobuf:"bytes,5,opt,name=mig_configs_json,json=migConfigsJson,proto3" json:"mig_configs_json,omitempty"` + // Original config.yaml text; authoritative when parse_error is set. + Raw string `protobuf:"bytes,6,opt,name=raw,proto3" json:"raw,omitempty"` + ParseError string `protobuf:"bytes,7,opt,name=parse_error,json=parseError,proto3" json:"parse_error,omitempty"` + LastSeen *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` } -func (x *GetClusterTypeResponse) Reset() { - *x = GetClusterTypeResponse{} +func (x *GetMigPartedConfigResponse) Reset() { + *x = GetMigPartedConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[109] + mi := &file_api_v1_k8s_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetClusterTypeResponse) String() string { +func (x *GetMigPartedConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterTypeResponse) ProtoMessage() {} +func (*GetMigPartedConfigResponse) ProtoMessage() {} -func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[109] +func (x *GetMigPartedConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_k8s_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8262,25 +9865,67 @@ func (x *GetClusterTypeResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetClusterTypeResponse.ProtoReflect.Descriptor instead. -func (*GetClusterTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{109} +// Deprecated: Use GetMigPartedConfigResponse.ProtoReflect.Descriptor instead. +func (*GetMigPartedConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_k8s_proto_rawDescGZIP(), []int{130} } -func (x *GetClusterTypeResponse) GetClusterType() ClusterType { +func (x *GetMigPartedConfigResponse) GetFound() bool { if x != nil { - return x.ClusterType + return x.Found } - return ClusterType_CLUSTER_TYPE_UNSPECIFIED + return false } -func (x *GetClusterTypeResponse) GetKubeletVersion() string { +func (x *GetMigPartedConfigResponse) GetName() string { if x != nil { - return x.KubeletVersion + return x.Name + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetMigConfigsJson() string { + if x != nil { + return x.MigConfigsJson + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetRaw() string { + if x != nil { + return x.Raw + } + return "" +} + +func (x *GetMigPartedConfigResponse) GetParseError() string { + if x != nil { + return x.ParseError } return "" } +func (x *GetMigPartedConfigResponse) GetLastSeen() *timestamppb.Timestamp { + if x != nil { + return x.LastSeen + } + return nil +} + type GetWorkloadsStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8295,7 +9940,7 @@ type GetWorkloadsStatsRequest struct { func (x *GetWorkloadsStatsRequest) Reset() { *x = GetWorkloadsStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[110] + mi := &file_api_v1_k8s_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8308,7 +9953,7 @@ func (x *GetWorkloadsStatsRequest) String() string { func (*GetWorkloadsStatsRequest) ProtoMessage() {} func (x *GetWorkloadsStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[110] + mi := &file_api_v1_k8s_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8321,7 +9966,7 @@ func (x *GetWorkloadsStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadsStatsRequest.ProtoReflect.Descriptor instead. func (*GetWorkloadsStatsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{110} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{131} } func (x *GetWorkloadsStatsRequest) GetTeamId() string { @@ -8367,7 +10012,7 @@ type GetWorkloadsStatsResponse struct { func (x *GetWorkloadsStatsResponse) Reset() { *x = GetWorkloadsStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[111] + mi := &file_api_v1_k8s_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8380,7 +10025,7 @@ func (x *GetWorkloadsStatsResponse) String() string { func (*GetWorkloadsStatsResponse) ProtoMessage() {} func (x *GetWorkloadsStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[111] + mi := &file_api_v1_k8s_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8393,7 +10038,7 @@ func (x *GetWorkloadsStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkloadsStatsResponse.ProtoReflect.Descriptor instead. func (*GetWorkloadsStatsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{111} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{132} } func (x *GetWorkloadsStatsResponse) GetTotal() int32 { @@ -8445,7 +10090,7 @@ type DailyUtilizationRequest struct { func (x *DailyUtilizationRequest) Reset() { *x = DailyUtilizationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[112] + mi := &file_api_v1_k8s_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8458,7 +10103,7 @@ func (x *DailyUtilizationRequest) String() string { func (*DailyUtilizationRequest) ProtoMessage() {} func (x *DailyUtilizationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[112] + mi := &file_api_v1_k8s_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8471,7 +10116,7 @@ func (x *DailyUtilizationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{112} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{133} } func (x *DailyUtilizationRequest) GetTeamId() string { @@ -8515,7 +10160,7 @@ type DailyUtilizationResponse struct { func (x *DailyUtilizationResponse) Reset() { *x = DailyUtilizationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[113] + mi := &file_api_v1_k8s_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8528,7 +10173,7 @@ func (x *DailyUtilizationResponse) String() string { func (*DailyUtilizationResponse) ProtoMessage() {} func (x *DailyUtilizationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[113] + mi := &file_api_v1_k8s_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8541,7 +10186,7 @@ func (x *DailyUtilizationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134} } func (x *DailyUtilizationResponse) GetClusterIdToDailyTotalCoreMinutes() map[string]*DailyUtilizationResponse_Datapoints { @@ -8579,7 +10224,7 @@ type DailyUtilizationInstanceTypeRequest struct { func (x *DailyUtilizationInstanceTypeRequest) Reset() { *x = DailyUtilizationInstanceTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[114] + mi := &file_api_v1_k8s_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8592,7 +10237,7 @@ func (x *DailyUtilizationInstanceTypeRequest) String() string { func (*DailyUtilizationInstanceTypeRequest) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[114] + mi := &file_api_v1_k8s_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8605,7 +10250,7 @@ func (x *DailyUtilizationInstanceTypeRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use DailyUtilizationInstanceTypeRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{114} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{135} } func (x *DailyUtilizationInstanceTypeRequest) GetTeamId() string { @@ -8648,7 +10293,7 @@ type DailyUtilizationInstanceTypeResponse struct { func (x *DailyUtilizationInstanceTypeResponse) Reset() { *x = DailyUtilizationInstanceTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[115] + mi := &file_api_v1_k8s_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8661,7 +10306,7 @@ func (x *DailyUtilizationInstanceTypeResponse) String() string { func (*DailyUtilizationInstanceTypeResponse) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[115] + mi := &file_api_v1_k8s_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8674,7 +10319,7 @@ func (x *DailyUtilizationInstanceTypeResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use DailyUtilizationInstanceTypeResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136} } func (x *DailyUtilizationInstanceTypeResponse) GetClusterIdToDatapoints() map[string]*DailyUtilizationInstanceTypeResponse_Datapoints { @@ -8705,7 +10350,7 @@ type DailyUtilizationNodeTypeRequest struct { func (x *DailyUtilizationNodeTypeRequest) Reset() { *x = DailyUtilizationNodeTypeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[116] + mi := &file_api_v1_k8s_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8718,7 +10363,7 @@ func (x *DailyUtilizationNodeTypeRequest) String() string { func (*DailyUtilizationNodeTypeRequest) ProtoMessage() {} func (x *DailyUtilizationNodeTypeRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[116] + mi := &file_api_v1_k8s_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8731,7 +10376,7 @@ func (x *DailyUtilizationNodeTypeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationNodeTypeRequest.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{116} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{137} } func (x *DailyUtilizationNodeTypeRequest) GetTeamId() string { @@ -8774,7 +10419,7 @@ type DailyUtilizationNodeTypeResponse struct { func (x *DailyUtilizationNodeTypeResponse) Reset() { *x = DailyUtilizationNodeTypeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[117] + mi := &file_api_v1_k8s_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8787,7 +10432,7 @@ func (x *DailyUtilizationNodeTypeResponse) String() string { func (*DailyUtilizationNodeTypeResponse) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[117] + mi := &file_api_v1_k8s_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8800,7 +10445,7 @@ func (x *DailyUtilizationNodeTypeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DailyUtilizationNodeTypeResponse.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138} } func (x *DailyUtilizationNodeTypeResponse) GetClusterIdToDatapoints() map[string]*DailyUtilizationNodeTypeResponse_Datapoints { @@ -8831,7 +10476,7 @@ type LookupNodeInstanceRequest struct { func (x *LookupNodeInstanceRequest) Reset() { *x = LookupNodeInstanceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[118] + mi := &file_api_v1_k8s_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8844,7 +10489,7 @@ func (x *LookupNodeInstanceRequest) String() string { func (*LookupNodeInstanceRequest) ProtoMessage() {} func (x *LookupNodeInstanceRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[118] + mi := &file_api_v1_k8s_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8857,7 +10502,7 @@ func (x *LookupNodeInstanceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupNodeInstanceRequest.ProtoReflect.Descriptor instead. func (*LookupNodeInstanceRequest) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{118} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{139} } func (x *LookupNodeInstanceRequest) GetTeamId() string { @@ -8897,7 +10542,7 @@ type InstanceLookupParams struct { func (x *InstanceLookupParams) Reset() { *x = InstanceLookupParams{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[119] + mi := &file_api_v1_k8s_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8910,7 +10555,7 @@ func (x *InstanceLookupParams) String() string { func (*InstanceLookupParams) ProtoMessage() {} func (x *InstanceLookupParams) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[119] + mi := &file_api_v1_k8s_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8923,7 +10568,7 @@ func (x *InstanceLookupParams) ProtoReflect() protoreflect.Message { // Deprecated: Use InstanceLookupParams.ProtoReflect.Descriptor instead. func (*InstanceLookupParams) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{119} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{140} } func (x *InstanceLookupParams) GetCloudProviderId() int64 { @@ -8977,7 +10622,7 @@ type LookupNodeInstanceResponse struct { func (x *LookupNodeInstanceResponse) Reset() { *x = LookupNodeInstanceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[120] + mi := &file_api_v1_k8s_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8990,7 +10635,7 @@ func (x *LookupNodeInstanceResponse) String() string { func (*LookupNodeInstanceResponse) ProtoMessage() {} func (x *LookupNodeInstanceResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[120] + mi := &file_api_v1_k8s_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9003,7 +10648,7 @@ func (x *LookupNodeInstanceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupNodeInstanceResponse.ProtoReflect.Descriptor instead. func (*LookupNodeInstanceResponse) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{120} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{141} } func (x *LookupNodeInstanceResponse) GetDynamicInstance() *Instance { @@ -9052,7 +10697,7 @@ type GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics struct { func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) Reset() { *x = GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[122] + mi := &file_api_v1_k8s_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9065,7 +10710,7 @@ func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) String() string func (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoMessage() {} func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[122] + mi := &file_api_v1_k8s_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9078,7 +10723,7 @@ func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) ProtoReflect() p // Deprecated: Use GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics.ProtoReflect.Descriptor instead. func (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{27, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{35, 0} } func (x *GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics) GetNodeGroupMetrics() []*NodeGroupMetric { @@ -9099,7 +10744,7 @@ type DailyUtilizationResponse_Datapoints struct { func (x *DailyUtilizationResponse_Datapoints) Reset() { *x = DailyUtilizationResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[133] + mi := &file_api_v1_k8s_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9112,7 +10757,7 @@ func (x *DailyUtilizationResponse_Datapoints) String() string { func (*DailyUtilizationResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[133] + mi := &file_api_v1_k8s_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9125,7 +10770,7 @@ func (x *DailyUtilizationResponse_Datapoints) ProtoReflect() protoreflect.Messag // Deprecated: Use DailyUtilizationResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134, 0} } func (x *DailyUtilizationResponse_Datapoints) GetDatapoints() []*DailyUtilizationResponse_Datapoint { @@ -9147,7 +10792,7 @@ type DailyUtilizationResponse_Datapoint struct { func (x *DailyUtilizationResponse_Datapoint) Reset() { *x = DailyUtilizationResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[134] + mi := &file_api_v1_k8s_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9160,7 +10805,7 @@ func (x *DailyUtilizationResponse_Datapoint) String() string { func (*DailyUtilizationResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[134] + mi := &file_api_v1_k8s_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9173,7 +10818,7 @@ func (x *DailyUtilizationResponse_Datapoint) ProtoReflect() protoreflect.Message // Deprecated: Use DailyUtilizationResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{113, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{134, 1} } func (x *DailyUtilizationResponse_Datapoint) GetTimestamp() int64 { @@ -9201,7 +10846,7 @@ type DailyUtilizationInstanceTypeResponse_Datapoints struct { func (x *DailyUtilizationInstanceTypeResponse_Datapoints) Reset() { *x = DailyUtilizationInstanceTypeResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[137] + mi := &file_api_v1_k8s_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9214,7 +10859,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoints) String() string { func (*DailyUtilizationInstanceTypeResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[137] + mi := &file_api_v1_k8s_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9227,7 +10872,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoints) ProtoReflect() protore // Deprecated: Use DailyUtilizationInstanceTypeResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136, 0} } func (x *DailyUtilizationInstanceTypeResponse_Datapoints) GetDatapoints() []*DailyUtilizationInstanceTypeResponse_Datapoint { @@ -9249,7 +10894,7 @@ type DailyUtilizationInstanceTypeResponse_Datapoint struct { func (x *DailyUtilizationInstanceTypeResponse_Datapoint) Reset() { *x = DailyUtilizationInstanceTypeResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[138] + mi := &file_api_v1_k8s_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9262,7 +10907,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoint) String() string { func (*DailyUtilizationInstanceTypeResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationInstanceTypeResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[138] + mi := &file_api_v1_k8s_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9275,7 +10920,7 @@ func (x *DailyUtilizationInstanceTypeResponse_Datapoint) ProtoReflect() protoref // Deprecated: Use DailyUtilizationInstanceTypeResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationInstanceTypeResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{115, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{136, 1} } func (x *DailyUtilizationInstanceTypeResponse_Datapoint) GetTimestamp() int64 { @@ -9303,7 +10948,7 @@ type DailyUtilizationNodeTypeResponse_Datapoints struct { func (x *DailyUtilizationNodeTypeResponse_Datapoints) Reset() { *x = DailyUtilizationNodeTypeResponse_Datapoints{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[142] + mi := &file_api_v1_k8s_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9316,7 +10961,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoints) String() string { func (*DailyUtilizationNodeTypeResponse_Datapoints) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse_Datapoints) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[142] + mi := &file_api_v1_k8s_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9329,7 +10974,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoints) ProtoReflect() protoreflec // Deprecated: Use DailyUtilizationNodeTypeResponse_Datapoints.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse_Datapoints) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117, 0} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138, 0} } func (x *DailyUtilizationNodeTypeResponse_Datapoints) GetDatapoints() []*DailyUtilizationNodeTypeResponse_Datapoint { @@ -9351,7 +10996,7 @@ type DailyUtilizationNodeTypeResponse_Datapoint struct { func (x *DailyUtilizationNodeTypeResponse_Datapoint) Reset() { *x = DailyUtilizationNodeTypeResponse_Datapoint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_k8s_proto_msgTypes[143] + mi := &file_api_v1_k8s_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9364,7 +11009,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoint) String() string { func (*DailyUtilizationNodeTypeResponse_Datapoint) ProtoMessage() {} func (x *DailyUtilizationNodeTypeResponse_Datapoint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_k8s_proto_msgTypes[143] + mi := &file_api_v1_k8s_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9377,7 +11022,7 @@ func (x *DailyUtilizationNodeTypeResponse_Datapoint) ProtoReflect() protoreflect // Deprecated: Use DailyUtilizationNodeTypeResponse_Datapoint.ProtoReflect.Descriptor instead. func (*DailyUtilizationNodeTypeResponse_Datapoint) Descriptor() ([]byte, []int) { - return file_api_v1_k8s_proto_rawDescGZIP(), []int{117, 1} + return file_api_v1_k8s_proto_rawDescGZIP(), []int{138, 1} } func (x *DailyUtilizationNodeTypeResponse_Datapoint) GetTimestamp() int64 { @@ -9471,7 +11116,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x22, 0xfe, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x04, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, @@ -9492,48 +11137,313 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, - 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, + 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x32, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x56, 0x32, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xbf, 0x04, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x64, 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, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, + 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, + 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x22, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x76, 0x32, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x56, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xb0, 0x02, 0x0a, 0x1a, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 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, + 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 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, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x69, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xa0, 0x02, 0x0a, 0x17, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x27, 0x0a, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x74, 0x6f, 0x70, 0x38, 0x30, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x38, 0x30, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc8, + 0x05, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x04, 0x63, + 0x6f, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x1b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x19, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x1a, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x18, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x43, 0x70, 0x75, 0x12, 0x63, 0x0a, 0x1d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x1b, 0x6f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x5d, 0x0a, 0x1a, 0x6f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x18, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x47, 0x70, 0x75, 0x22, 0xc3, 0x01, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, + 0x9f, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x35, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x22, 0xef, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 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, 0x22, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1b, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, + 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, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfb, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, + 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, + 0x74, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x22, 0xef, 0x02, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 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, 0x22, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x1c, 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, - 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x22, 0x82, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x8e, + 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 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, + 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x3a, 0x02, 0x18, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, + 0xc3, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x12, 0x3e, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, + 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, + 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 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, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x29, + 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, 0x42, 0x0a, 0x15, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x87, 0x01, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, @@ -9541,249 +11451,149 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x65, 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xfb, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, - 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x77, 0x69, 0x74, 0x68, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, - 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xa5, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 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, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x8e, 0x01, - 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 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, 0x1b, - 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, - 0x02, 0x18, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x22, 0xc3, - 0x02, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x12, 0x3e, 0x0a, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, - 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, - 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x60, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x52, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf8, 0x01, - 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x70, - 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2f, 0x0a, 0x14, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x68, 0x6f, 0x75, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x29, 0x0a, - 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x73, - 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, 0x42, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x87, 0x01, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, - 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 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, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x15, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 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, 0x31, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 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, 0x12, 0x3e, 0x0a, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, - 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 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, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xc8, - 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x61, 0x70, 0x1a, 0x52, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 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, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xa7, 0x02, - 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xdd, 0x09, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, - 0x1a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, - 0x89, 0x01, 0x0a, 0x1d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, - 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x19, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, - 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x20, - 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x52, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 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, 0x31, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 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, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 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, 0x22, + 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xc8, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x61, 0x70, 0x1a, 0x52, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 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, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x1c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x12, 0x80, 0x01, 0x0a, 0x1a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x61, 0x7a, 0x5f, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xdd, 0x09, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x1a, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x89, 0x01, + 0x0a, 0x1d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6c, 0x6f, 0x67, - 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x1a, 0x5d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x52, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x92, 0x01, 0x0a, 0x20, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, + 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x1c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x80, + 0x01, 0x0a, 0x1a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x61, 0x7a, 0x5f, 0x74, 0x6f, + 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x10, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8b, 0x01, - 0x0a, 0x1e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x6f, + 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x1a, 0x5d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x10, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -9791,245 +11601,364 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8e, 0x01, 0x0a, 0x21, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, - 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, - 0x1b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, - 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x06, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, - 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, - 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x30, 0x0a, - 0x14, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x72, 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, - 0x72, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x61, 0x67, 0x67, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x12, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x43, 0x70, 0x75, - 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x74, 0x69, 0x6c, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x75, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x17, 0x75, - 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x76, 0x67, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x75, 0x74, - 0x69, 0x6c, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x75, 0x74, 0x69, 0x6c, - 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x68, 0x6f, 0x75, - 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, - 0x65, 0x79, 0x52, 0x0a, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, - 0x0a, 0x0f, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, - 0x72, 0x6c, 0x79, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x12, 0x68, 0x6f, - 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, - 0x6c, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, - 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, - 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8b, 0x01, 0x0a, 0x1e, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, 0x74, + 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x8e, 0x01, 0x0a, 0x21, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x54, 0x6f, 0x55, + 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x01, 0x0a, 0x1b, 0x4c, + 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x41, 0x7a, 0x54, 0x6f, 0x55, 0x74, 0x69, 0x6c, 0x4d, 0x65, + 0x74, 0x72, 0x69, 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, 0x53, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x06, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, + 0x63, 0x70, 0x75, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, + 0x76, 0x72, 0x61, 0x6d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x47, 0x70, 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x20, 0x0a, + 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, + 0x26, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x61, 0x67, 0x67, 0x72, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x67, 0x67, 0x72, 0x5f, + 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, + 0x67, 0x67, 0x72, 0x47, 0x70, 0x75, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x43, 0x70, 0x75, 0x41, 0x76, + 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x75, 0x74, 0x69, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x17, 0x75, 0x74, 0x69, + 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x76, 0x67, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x75, 0x74, 0x69, 0x6c, + 0x47, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x76, 0x67, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x26, 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x75, 0x74, 0x69, 0x6c, 0x47, 0x70, + 0x75, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x68, 0x6f, 0x75, 0x72, 0x6c, + 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, + 0x52, 0x0a, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, + 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, + 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, 0x72, 0x6c, - 0x79, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, - 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, - 0x3f, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x22, 0xf2, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, - 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x02, - 0x18, 0x01, 0x22, 0xb4, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, - 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, - 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, - 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x95, 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, - 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, - 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x9e, - 0x02, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 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, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x79, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x12, 0x68, 0x6f, 0x75, 0x72, + 0x6c, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x10, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0f, 0x68, 0x6f, + 0x75, 0x72, 0x6c, 0x79, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x35, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x0d, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x47, + 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x3f, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xf2, + 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x22, 0x7b, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x02, 0x18, 0x01, + 0x22, 0xb4, 0x02, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3f, 0x0a, 0x10, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6f, 0x73, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x14, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x2d, 0x0a, + 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x22, 0x95, 0x03, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3f, + 0x0a, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x0e, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x9e, 0x02, 0x0a, + 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 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, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x6d, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x9d, - 0x02, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, - 0x73, 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, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x6d, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x9d, 0x02, 0x0a, + 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 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, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x65, - 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, - 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x72, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, - 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, + 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x26, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x22, 0x72, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, + 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 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, 0x12, 0x1c, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x75, 0x69, 0x64, 0x22, 0xab, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x22, 0xa9, 0x02, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x65, 0x72, 0x69, 0x65, 0x73, 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, 0x12, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x55, 0x69, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x22, 0xa7, 0x02, + 0x0a, 0x17, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 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, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x74, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x72, 0x61, 0x6d, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, + 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x69, 0x63, 0x73, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x75, + 0x73, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x55, 0x73, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xdc, 0x01, 0x0a, 0x18, 0x47, 0x50, 0x55, 0x4d, + 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, + 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x6d, 0x69, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, + 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x69, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x50, + 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x22, 0x73, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 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, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, + 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x4a, 0x0a, 0x10, 0x4c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x55, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 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, 0x56, 0x0a, 0x1c, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x09, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, @@ -10362,7 +12291,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x87, 0x07, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, + 0xcb, 0x07, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x7a, 0x78, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, @@ -10418,543 +12347,570 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x72, 0x65, 0x7a, 0x72, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x2a, 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, 0x74, 0x72, 0x65, 0x7a, - 0x72, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x23, 0x47, 0x61, - 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x50, 0x4f, 0x56, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x52, - 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x47, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, - 0x74, 0x73, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, - 0x73, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, + 0x72, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x12, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x33, 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, 0x10, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xe5, 0x01, + 0x0a, 0x23, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 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, 0x1f, + 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, + 0x3b, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, + 0x79, 0x50, 0x4f, 0x56, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x42, 0x79, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x79, 0x12, 0x47, 0x0a, 0x0e, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, + 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x4f, 0x70, 0x74, 0x73, 0x22, 0xb6, 0x03, 0x0a, 0x24, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0x4c, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, - 0x74, 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, 0x25, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x02, 0x0a, 0x13, 0x47, - 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x63, 0x6f, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, + 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x09, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x56, 0x0a, 0x08, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x59, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, + 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x1a, 0x4c, 0x0a, 0x0d, + 0x43, 0x6c, 0x75, 0x73, 0x74, 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, + 0x25, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x52, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 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, 0x2a, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, + 0x02, 0x0a, 0x13, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x98, 0x01, 0x0a, - 0x18, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x40, 0x0a, 0x1d, 0x6e, 0x75, 0x6d, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x6e, 0x75, - 0x6d, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x49, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xa3, 0x05, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 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, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, - 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, - 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x0c, 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, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, - 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x76, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6c, 0x6f, 0x67, - 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x04, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 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, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, - 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 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, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x4a, 0x0a, - 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x18, 0x53, 0x65, - 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 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, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, - 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x19, 0x53, 0x65, - 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x64, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5c, 0x0a, 0x21, 0x53, 0x65, 0x6e, 0x64, 0x57, - 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 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, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x69, 0x70, - 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x1e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, - 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x95, 0x03, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x0f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x42, 0x0a, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, + 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x98, 0x01, 0x0a, 0x18, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x40, 0x0a, 0x1d, 0x6e, 0x75, 0x6d, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x19, 0x6e, 0x75, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x49, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xa3, 0x05, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 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, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, - 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3d, - 0x0a, 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x6f, 0x73, 0x74, - 0x55, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x02, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x13, 0x6d, 0x6f, 0x73, 0x74, - 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x11, 0x6d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x14, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, - 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x12, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x17, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x6d, 0x6f, 0x73, 0x74, 0x55, 0x6e, 0x64, 0x65, 0x72, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x9f, 0x01, 0x0a, - 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x75, + 0x64, 0x69, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x73, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x76, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6c, 0x6f, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x32, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x04, 0x0a, 0x1e, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x6f, 0x72, 0x73, 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, 0x03, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x3a, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x0e, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, + 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 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, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x73, 0x22, 0x4a, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, + 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x9e, 0x01, + 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 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, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x4f, - 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, - 0x8e, 0x01, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0x78, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x57, 0x0a, 0x1a, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x35, + 0x0a, 0x19, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x64, 0x0a, 0x1d, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, + 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5c, 0x0a, 0x21, 0x53, + 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 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, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, + 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x1e, 0x53, 0x65, 0x6e, + 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, + 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x95, 0x03, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 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, 0x1f, 0x0a, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x4d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, + 0x16, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6d, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x4d, 0x6f, 0x73, 0x74, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x4e, 0x6f, 0x64, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x90, 0x02, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, + 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x13, + 0x6d, 0x6f, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x11, 0x6d, 0x6f, 0x73, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x14, 0x6c, 0x65, + 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x17, 0x6d, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x6d, 0x6f, 0x73, 0x74, 0x55, + 0x6e, 0x64, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 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, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x22, 0x4f, 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x17, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x1b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, 0x12, 0x6b, - 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, - 0x6f, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, - 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x1a, 0x5b, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, - 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, - 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6c, 0x74, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x22, 0x78, 0x0a, 0x19, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, + 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x57, + 0x0a, 0x1a, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x41, 0x0a, 0x17, 0x4b, 0x38, 0x73, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc8, 0x02, 0x0a, 0x1b, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 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, 0x12, 0x6b, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x1a, 0x5b, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4b, 0x69, 0x6e, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x78, 0x0a, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, - 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x62, 0x0a, 0x1a, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 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, 0x2e, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x63, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, - 0x67, 0x73, 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, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x18, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 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, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x22, 0x46, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2a, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x1a, 0x62, 0x0a, 0x1a, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x54, + 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x63, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 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, 0x22, 0x3f, 0x0a, 0x0a, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x22, 0xcc, 0x04, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x6a, 0x0a, 0x18, 0x70, 0x6f, 0x64, 0x5f, - 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, - 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x17, 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, - 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, - 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x5d, 0x0a, 0x19, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, - 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, - 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0xce, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 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, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0d, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, - 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, - 0x6e, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, - 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x53, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, - 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0a, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x6a, 0x6f, - 0x62, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x6a, 0x6f, - 0x62, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xf3, 0x01, - 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x70, - 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, - 0x6f, 0x64, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, - 0xb5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, - 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x12, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x69, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x69, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x54, 0x79, 0x70, 0x65, 0x22, 0x49, 0x0a, - 0x0f, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 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, 0x22, 0x67, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x22, 0x4f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 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, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x16, 0x41, 0x64, 0x64, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x66, + 0x0a, 0x18, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x61, 0x67, 0x73, 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, 0x79, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x0c, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6b, - 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x46, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x2a, + 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 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, 0x22, 0x3f, 0x0a, 0x0a, 0x54, 0x61, + 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3a, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x26, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0xcc, 0x04, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x6a, 0x0a, 0x18, + 0x70, 0x6f, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, + 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x14, 0x70, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x67, 0x0a, 0x17, 0x70, 0x6f, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x70, 0x6f, + 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x1a, 0x5d, 0x0a, 0x19, 0x50, 0x6f, + 0x64, 0x55, 0x69, 0x64, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 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, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5b, 0x0a, 0x18, 0x50, 0x6f, 0x64, + 0x55, 0x69, 0x64, 0x54, 0x6f, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, 0x02, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, + 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1e, 0x0a, + 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xce, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 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, 0x12, 0x29, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x29, 0x0a, 0x0d, 0x6b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0d, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4b, 0x69, 0x6e, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x0b, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x26, + 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x0a, 0x4a, 0x6f, 0x62, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, + 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x65, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x26, 0x0a, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x04, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xf9, 0x01, 0x0a, 0x0a, 0x50, 0x6f, 0x64, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, + 0x61, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x05, + 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x12, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, + 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x55, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x49, 0x0a, 0x0f, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 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, 0x22, 0x67, 0x0a, 0x0f, + 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x4f, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 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, 0x79, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x53, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x94, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4d, 0x69, + 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x69, 0x67, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6d, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x4a, 0x73, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x72, 0x61, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x73, 0x65, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 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, @@ -11308,7 +13264,7 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x4b, 0x45, 0x32, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x44, 0x10, 0x03, 0x32, - 0xca, 0x1e, 0x0a, 0x0a, 0x4b, 0x38, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, + 0xb8, 0x25, 0x0a, 0x0a, 0x4b, 0x38, 0x53, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, @@ -11408,204 +13364,259 @@ var file_api_v1_k8s_proto_rawDesc = []byte{ 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, - 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x50, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x46, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, + 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x50, 0x55, 0x4d, 0x69, 0x67, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x64, 0x69, + 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x50, 0x55, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, + 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, - 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, - 0x01, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x49, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x18, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, - 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x63, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, 0x61, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x63, + 0x61, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x49, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, + 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, + 0x1c, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6c, 0x61, 0x78, 0x79, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x53, - 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, + 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x64, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6d, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, + 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, + 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x65, 0x65, 0x6b, 0x6c, + 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, + 0x38, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4b, 0x38, 0x73, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4f, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x46, 0x6f, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5b, 0x0a, 0x12, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, - 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, - 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdc, 0x02, 0x0a, - 0x16, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x64, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, + 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x50, 0x61, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdc, 0x02, 0x0a, 0x16, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x58, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd5, 0x02, 0x0a, 0x12, - 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xd5, 0x02, 0x0a, 0x12, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x55, 0x0a, 0x10, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x44, 0x61, 0x69, 0x6c, 0x79, + 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x44, 0x61, 0x69, - 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, + 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x42, 0x86, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x08, 0x4b, 0x38, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, - 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x64, 0x61, 0x6b, 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, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x61, 0x69, 0x6c, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x42, 0x86, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x42, 0x08, 0x4b, 0x38, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, + 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, + 0x6b, 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 ( @@ -11621,7 +13632,7 @@ func file_api_v1_k8s_proto_rawDescGZIP() []byte { } var file_api_v1_k8s_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_api_v1_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 147) +var file_api_v1_k8s_proto_msgTypes = make([]protoimpl.MessageInfo, 168) var file_api_v1_k8s_proto_goTypes = []interface{}{ (GalaxyPOVNodeGroupBy)(0), // 0: api.v1.GalaxyPOVNodeGroupBy (GalaxyPOVWorkloadGroupBy)(0), // 1: api.v1.GalaxyPOVWorkloadGroupBy @@ -11631,490 +13642,561 @@ var file_api_v1_k8s_proto_goTypes = []interface{}{ (*GetClusterMetadataRequest)(nil), // 5: api.v1.GetClusterMetadataRequest (*GetNodeGroupRequest)(nil), // 6: api.v1.GetNodeGroupRequest (*GetWorkloadsRequest)(nil), // 7: api.v1.GetWorkloadsRequest - (*GetResourcesRequest)(nil), // 8: api.v1.GetResourcesRequest - (*GetPodsRequest)(nil), // 9: api.v1.GetPodsRequest - (*GetPodsResponse)(nil), // 10: api.v1.GetPodsResponse - (*GetWorkloadRequest)(nil), // 11: api.v1.GetWorkloadRequest - (*GetClustersRequest)(nil), // 12: api.v1.GetClustersRequest - (*ListClustersRequest)(nil), // 13: api.v1.ListClustersRequest - (*GetClusterRequest)(nil), // 14: api.v1.GetClusterRequest - (*DeleteClusterRequest)(nil), // 15: api.v1.DeleteClusterRequest - (*DeleteClusterResponse)(nil), // 16: api.v1.DeleteClusterResponse - (*UpdateClusterRequest)(nil), // 17: api.v1.UpdateClusterRequest - (*UpdateClusterResponse)(nil), // 18: api.v1.UpdateClusterResponse - (*GetResourcesResponse)(nil), // 19: api.v1.GetResourcesResponse - (*CreateClusterRequest)(nil), // 20: api.v1.CreateClusterRequest - (*CreateClusterResponse)(nil), // 21: api.v1.CreateClusterResponse - (*ResetClusterTokenRequest)(nil), // 22: api.v1.ResetClusterTokenRequest - (*ResetClusterTokenResponse)(nil), // 23: api.v1.ResetClusterTokenResponse - (*GetNodeGroupsRequest)(nil), // 24: api.v1.GetNodeGroupsRequest - (*GetAllNodeGroupsRequest)(nil), // 25: api.v1.GetAllNodeGroupsRequest - (*GetNodeGroupsResponse)(nil), // 26: api.v1.GetNodeGroupsResponse - (*GetAllNodeGroupsResponse)(nil), // 27: api.v1.GetAllNodeGroupsResponse - (*NodeGroupSet)(nil), // 28: api.v1.NodeGroupSet - (*GetNodeGroupsUtilizationRequest)(nil), // 29: api.v1.GetNodeGroupsUtilizationRequest - (*GetNodeGroupsUtilizationResponse)(nil), // 30: api.v1.GetNodeGroupsUtilizationResponse - (*NodeGroupMetric)(nil), // 31: api.v1.NodeGroupMetric - (*GetNodeGroupResponse)(nil), // 32: api.v1.GetNodeGroupResponse - (*GetClusterResponse)(nil), // 33: api.v1.GetClusterResponse - (*GetClustersResponse)(nil), // 34: api.v1.GetClustersResponse - (*ListClustersResponse)(nil), // 35: api.v1.ListClustersResponse - (*GetNodeResponse)(nil), // 36: api.v1.GetNodeResponse - (*GetWorkloadsResponse)(nil), // 37: api.v1.GetWorkloadsResponse - (*GetWorkloadResponse)(nil), // 38: api.v1.GetWorkloadResponse - (*GetWorkloadContainerPercentilesRequest)(nil), // 39: api.v1.GetWorkloadContainerPercentilesRequest - (*GetWorkloadContainerPercentilesResponse)(nil), // 40: api.v1.GetWorkloadContainerPercentilesResponse - (*GetWorkloadContainerTimeSeriesRequest)(nil), // 41: api.v1.GetWorkloadContainerTimeSeriesRequest - (*GetWorkloadContainerTimeSeriesResponse)(nil), // 42: api.v1.GetWorkloadContainerTimeSeriesResponse - (*GetLatestContainerRequestLimitsRequest)(nil), // 43: api.v1.GetLatestContainerRequestLimitsRequest - (*GetLatestContainerRequestLimitsResponse)(nil), // 44: api.v1.GetLatestContainerRequestLimitsResponse - (*GetForecastWorkloadsRequest)(nil), // 45: api.v1.GetForecastWorkloadsRequest - (*GetForecastWorkloadsResponse)(nil), // 46: api.v1.GetForecastWorkloadsResponse - (*GetForecastWorkloadRequest)(nil), // 47: api.v1.GetForecastWorkloadRequest - (*GetForecastWorkloadResponse)(nil), // 48: api.v1.GetForecastWorkloadResponse - (*GetClusterMetadataResponse)(nil), // 49: api.v1.GetClusterMetadataResponse - (*ClusterElement)(nil), // 50: api.v1.ClusterElement - (*GetAllNamespacesRequest)(nil), // 51: api.v1.GetAllNamespacesRequest - (*GetAllNamespacesResponse)(nil), // 52: api.v1.GetAllNamespacesResponse - (*SearchNamespacesByClusterRequest)(nil), // 53: api.v1.SearchNamespacesByClusterRequest - (*SearchNamespacesByClusterResponse)(nil), // 54: api.v1.SearchNamespacesByClusterResponse - (*ListNamespacesByClusterRequest)(nil), // 55: api.v1.ListNamespacesByClusterRequest - (*ListNamespacesByClusterResponse)(nil), // 56: api.v1.ListNamespacesByClusterResponse - (*NamespaceItem)(nil), // 57: api.v1.NamespaceItem - (*GetAllWorkloadNamesRequest)(nil), // 58: api.v1.GetAllWorkloadNamesRequest - (*GetAllWorkloadNamesResponse)(nil), // 59: api.v1.GetAllWorkloadNamesResponse - (*GetAllWorkloadLabelsRequest)(nil), // 60: api.v1.GetAllWorkloadLabelsRequest - (*GetAllWorkloadLabelsResponse)(nil), // 61: api.v1.GetAllWorkloadLabelsResponse - (*GetAllNodeGroupNamesRequest)(nil), // 62: api.v1.GetAllNodeGroupNamesRequest - (*GetAllNodeGroupNamesResponse)(nil), // 63: api.v1.GetAllNodeGroupNamesResponse - (*Cluster)(nil), // 64: api.v1.Cluster - (*OperatorInfo)(nil), // 65: api.v1.OperatorInfo - (*Container)(nil), // 66: api.v1.Container - (*GetLatestOperatorVersionRequest)(nil), // 67: api.v1.GetLatestOperatorVersionRequest - (*GetLatestOperatorVersionResponse)(nil), // 68: api.v1.GetLatestOperatorVersionResponse - (*GalaxyGetWorkloadPerspectiveRequest)(nil), // 69: api.v1.GalaxyGetWorkloadPerspectiveRequest - (*GalaxyGetWorkloadPerspectiveResponse)(nil), // 70: api.v1.GalaxyGetWorkloadPerspectiveResponse - (*GalaxyWorkloadGroup)(nil), // 71: api.v1.GalaxyWorkloadGroup - (*PerspectiveDatapointOpts)(nil), // 72: api.v1.PerspectiveDatapointOpts - (*ListAuditLogsRequest)(nil), // 73: api.v1.ListAuditLogsRequest - (*ListAuditLogsResponse)(nil), // 74: api.v1.ListAuditLogsResponse - (*ListAuditLogOriginatorsRequest)(nil), // 75: api.v1.ListAuditLogOriginatorsRequest - (*ListAuditLogOriginatorsResponse)(nil), // 76: api.v1.ListAuditLogOriginatorsResponse - (*SendWorkloadEmailRequest)(nil), // 77: api.v1.SendWorkloadEmailRequest - (*SendWorkloadEmailResponse)(nil), // 78: api.v1.SendWorkloadEmailResponse - (*SendWeeklySummaryEmailRequest)(nil), // 79: api.v1.SendWeeklySummaryEmailRequest - (*SendWeeklySummaryEmailRequestData)(nil), // 80: api.v1.SendWeeklySummaryEmailRequestData - (*SendWeeklySummaryEmailResponse)(nil), // 81: api.v1.SendWeeklySummaryEmailResponse - (*GetClustersNodeInfoRequest)(nil), // 82: api.v1.GetClustersNodeInfoRequest - (*GetClustersNodeInfoResponse)(nil), // 83: api.v1.GetClustersNodeInfoResponse - (*SearchK8SResourcesRequest)(nil), // 84: api.v1.SearchK8sResourcesRequest - (*SearchK8SResourcesResponse)(nil), // 85: api.v1.SearchK8sResourcesResponse - (*K8SSearchResult)(nil), // 86: api.v1.K8sSearchResult - (*SearchK8SWorkloadsRequest)(nil), // 87: api.v1.SearchK8sWorkloadsRequest - (*SearchK8SWorkloadsResponse)(nil), // 88: api.v1.SearchK8sWorkloadsResponse - (*K8SWorkloadSearchResult)(nil), // 89: api.v1.K8sWorkloadSearchResult - (*MetadataForWorkloadsRequest)(nil), // 90: api.v1.MetadataForWorkloadsRequest - (*MetadataForWorkloadsResponse)(nil), // 91: api.v1.MetadataForWorkloadsResponse - (*AddClusterTagsRequest)(nil), // 92: api.v1.AddClusterTagsRequest - (*AddClusterTagsResponse)(nil), // 93: api.v1.AddClusterTagsResponse - (*RemoveClusterTagsRequest)(nil), // 94: api.v1.RemoveClusterTagsRequest - (*RemoveClusterTagsResponse)(nil), // 95: api.v1.RemoveClusterTagsResponse - (*ListTagsRequest)(nil), // 96: api.v1.ListTagsRequest - (*TagSummary)(nil), // 97: api.v1.TagSummary - (*ListTagsResponse)(nil), // 98: api.v1.ListTagsResponse - (*WorkloadMetadata)(nil), // 99: api.v1.WorkloadMetadata - (*PodMetadata)(nil), // 100: api.v1.PodMetadata - (*NodeMetadata)(nil), // 101: api.v1.NodeMetadata - (*GetRelatedResourcesRequest)(nil), // 102: api.v1.GetRelatedResourcesRequest - (*GetWorkloadPodHistoryResponse)(nil), // 103: api.v1.GetWorkloadPodHistoryResponse - (*JobHistory)(nil), // 104: api.v1.JobHistory - (*ReplicaSetHistory)(nil), // 105: api.v1.ReplicaSetHistory - (*PodHistory)(nil), // 106: api.v1.PodHistory - (*GetRelatedResourcesResponse)(nil), // 107: api.v1.GetRelatedResourcesResponse - (*K8SRelatedResource)(nil), // 108: api.v1.K8sRelatedResource - (*K8SResourceNode)(nil), // 109: api.v1.K8sResourceNode - (*K8SResourceEdge)(nil), // 110: api.v1.K8sResourceEdge - (*GetClusterTypeRequest)(nil), // 111: api.v1.GetClusterTypeRequest - (*GetClusterTypeResponse)(nil), // 112: api.v1.GetClusterTypeResponse - (*GetWorkloadsStatsRequest)(nil), // 113: api.v1.GetWorkloadsStatsRequest - (*GetWorkloadsStatsResponse)(nil), // 114: api.v1.GetWorkloadsStatsResponse - (*DailyUtilizationRequest)(nil), // 115: api.v1.DailyUtilizationRequest - (*DailyUtilizationResponse)(nil), // 116: api.v1.DailyUtilizationResponse - (*DailyUtilizationInstanceTypeRequest)(nil), // 117: api.v1.DailyUtilizationInstanceTypeRequest - (*DailyUtilizationInstanceTypeResponse)(nil), // 118: api.v1.DailyUtilizationInstanceTypeResponse - (*DailyUtilizationNodeTypeRequest)(nil), // 119: api.v1.DailyUtilizationNodeTypeRequest - (*DailyUtilizationNodeTypeResponse)(nil), // 120: api.v1.DailyUtilizationNodeTypeResponse - (*LookupNodeInstanceRequest)(nil), // 121: api.v1.LookupNodeInstanceRequest - (*InstanceLookupParams)(nil), // 122: api.v1.InstanceLookupParams - (*LookupNodeInstanceResponse)(nil), // 123: api.v1.LookupNodeInstanceResponse - nil, // 124: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry - (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics)(nil), // 125: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - nil, // 126: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry - nil, // 127: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry - nil, // 128: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry - nil, // 129: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry - nil, // 130: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry - nil, // 131: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry - nil, // 132: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry - nil, // 133: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry - nil, // 134: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry - nil, // 135: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry - (*DailyUtilizationResponse_Datapoints)(nil), // 136: api.v1.DailyUtilizationResponse.Datapoints - (*DailyUtilizationResponse_Datapoint)(nil), // 137: api.v1.DailyUtilizationResponse.Datapoint - nil, // 138: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry - nil, // 139: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry - (*DailyUtilizationInstanceTypeResponse_Datapoints)(nil), // 140: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints - (*DailyUtilizationInstanceTypeResponse_Datapoint)(nil), // 141: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint - nil, // 142: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry - nil, // 143: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry - nil, // 144: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry - (*DailyUtilizationNodeTypeResponse_Datapoints)(nil), // 145: api.v1.DailyUtilizationNodeTypeResponse.Datapoints - (*DailyUtilizationNodeTypeResponse_Datapoint)(nil), // 146: api.v1.DailyUtilizationNodeTypeResponse.Datapoint - nil, // 147: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry - nil, // 148: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry - nil, // 149: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry - (*timestamppb.Timestamp)(nil), // 150: google.protobuf.Timestamp - (*WorkloadFilters)(nil), // 151: api.v1.WorkloadFilters - (K8SObjectKind)(0), // 152: api.v1.K8sObjectKind - (*Pagination)(nil), // 153: api.v1.Pagination - (*WorkloadItem)(nil), // 154: api.v1.WorkloadItem - (*NodeGroup)(nil), // 155: api.v1.NodeGroup - (*money.Money)(nil), // 156: google.type.Money - (*ResourceMetrics)(nil), // 157: api.v1.ResourceMetrics - (*CostInfo)(nil), // 158: api.v1.CostInfo - (*NodeInfo)(nil), // 159: api.v1.NodeInfo - (*CostDataPoint)(nil), // 160: api.v1.CostDataPoint - (*ResourceDataPoint)(nil), // 161: api.v1.ResourceDataPoint - (*Node)(nil), // 162: api.v1.Node - (*ResourceSummary)(nil), // 163: api.v1.ResourceSummary - (*ContainerPercentileSummary)(nil), // 164: api.v1.ContainerPercentileSummary - (*ContainerTimeSeries)(nil), // 165: api.v1.ContainerTimeSeries - (*ContainerRequestLimits)(nil), // 166: api.v1.ContainerRequestLimits - (*ForecastResourceMetrics)(nil), // 167: api.v1.ForecastResourceMetrics - (*AuditLogEntry)(nil), // 168: api.v1.AuditLogEntry - (*Instance)(nil), // 169: api.v1.Instance + (*ListWorkloadsPaginatedRequest)(nil), // 8: api.v1.ListWorkloadsPaginatedRequest + (*GetWorkloadsSummaryRequest)(nil), // 9: api.v1.GetWorkloadsSummaryRequest + (*WorkloadMetricEntry)(nil), // 10: api.v1.WorkloadMetricEntry + (*WorkloadMetricBreakdown)(nil), // 11: api.v1.WorkloadMetricBreakdown + (*GetWorkloadsSummaryResponse)(nil), // 12: api.v1.GetWorkloadsSummaryResponse + (*ListWorkloadsPaginatedResponse)(nil), // 13: api.v1.ListWorkloadsPaginatedResponse + (*GetResourcesRequest)(nil), // 14: api.v1.GetResourcesRequest + (*GetPodsRequest)(nil), // 15: api.v1.GetPodsRequest + (*GetPodsResponse)(nil), // 16: api.v1.GetPodsResponse + (*GetWorkloadRequest)(nil), // 17: api.v1.GetWorkloadRequest + (*GetClustersRequest)(nil), // 18: api.v1.GetClustersRequest + (*ListClustersRequest)(nil), // 19: api.v1.ListClustersRequest + (*GetClusterRequest)(nil), // 20: api.v1.GetClusterRequest + (*DeleteClusterRequest)(nil), // 21: api.v1.DeleteClusterRequest + (*DeleteClusterResponse)(nil), // 22: api.v1.DeleteClusterResponse + (*UpdateClusterRequest)(nil), // 23: api.v1.UpdateClusterRequest + (*UpdateClusterResponse)(nil), // 24: api.v1.UpdateClusterResponse + (*GetResourcesResponse)(nil), // 25: api.v1.GetResourcesResponse + (*GetResourceFilterOptionsRequest)(nil), // 26: api.v1.GetResourceFilterOptionsRequest + (*GetResourceFilterOptionsResponse)(nil), // 27: api.v1.GetResourceFilterOptionsResponse + (*CreateClusterRequest)(nil), // 28: api.v1.CreateClusterRequest + (*CreateClusterResponse)(nil), // 29: api.v1.CreateClusterResponse + (*ResetClusterTokenRequest)(nil), // 30: api.v1.ResetClusterTokenRequest + (*ResetClusterTokenResponse)(nil), // 31: api.v1.ResetClusterTokenResponse + (*GetNodeGroupsRequest)(nil), // 32: api.v1.GetNodeGroupsRequest + (*GetAllNodeGroupsRequest)(nil), // 33: api.v1.GetAllNodeGroupsRequest + (*GetNodeGroupsResponse)(nil), // 34: api.v1.GetNodeGroupsResponse + (*GetAllNodeGroupsResponse)(nil), // 35: api.v1.GetAllNodeGroupsResponse + (*NodeGroupSet)(nil), // 36: api.v1.NodeGroupSet + (*GetNodeGroupsUtilizationRequest)(nil), // 37: api.v1.GetNodeGroupsUtilizationRequest + (*GetNodeGroupsUtilizationResponse)(nil), // 38: api.v1.GetNodeGroupsUtilizationResponse + (*NodeGroupMetric)(nil), // 39: api.v1.NodeGroupMetric + (*GetNodeGroupResponse)(nil), // 40: api.v1.GetNodeGroupResponse + (*GetClusterResponse)(nil), // 41: api.v1.GetClusterResponse + (*GetClustersResponse)(nil), // 42: api.v1.GetClustersResponse + (*ListClustersResponse)(nil), // 43: api.v1.ListClustersResponse + (*GetNodeResponse)(nil), // 44: api.v1.GetNodeResponse + (*GetWorkloadsResponse)(nil), // 45: api.v1.GetWorkloadsResponse + (*GetWorkloadResponse)(nil), // 46: api.v1.GetWorkloadResponse + (*GetWorkloadContainerPercentilesRequest)(nil), // 47: api.v1.GetWorkloadContainerPercentilesRequest + (*GetWorkloadContainerPercentilesResponse)(nil), // 48: api.v1.GetWorkloadContainerPercentilesResponse + (*GetWorkloadContainerTimeSeriesRequest)(nil), // 49: api.v1.GetWorkloadContainerTimeSeriesRequest + (*GetWorkloadContainerTimeSeriesResponse)(nil), // 50: api.v1.GetWorkloadContainerTimeSeriesResponse + (*GetLatestContainerRequestLimitsRequest)(nil), // 51: api.v1.GetLatestContainerRequestLimitsRequest + (*GetLatestContainerRequestLimitsResponse)(nil), // 52: api.v1.GetLatestContainerRequestLimitsResponse + (*GetNodeGPUMigInstancesRequest)(nil), // 53: api.v1.GetNodeGPUMigInstancesRequest + (*GetNodeGPUMigInstancesResponse)(nil), // 54: api.v1.GetNodeGPUMigInstancesResponse + (*GetNodeGPUMigInstanceTimeseriesRequest)(nil), // 55: api.v1.GetNodeGPUMigInstanceTimeseriesRequest + (*GPUMigInstanceDataPoint)(nil), // 56: api.v1.GPUMigInstanceDataPoint + (*GPUMigInstanceTimeseries)(nil), // 57: api.v1.GPUMigInstanceTimeseries + (*GetNodeGPUMigInstanceTimeseriesResponse)(nil), // 58: api.v1.GetNodeGPUMigInstanceTimeseriesResponse + (*GetContainerIndividualGPUMetricsRequest)(nil), // 59: api.v1.GetContainerIndividualGPUMetricsRequest + (*GetContainerIndividualGPUMetricsResponse)(nil), // 60: api.v1.GetContainerIndividualGPUMetricsResponse + (*LanguageVersions)(nil), // 61: api.v1.LanguageVersions + (*GetWorkloadLanguagesRequest)(nil), // 62: api.v1.GetWorkloadLanguagesRequest + (*GetWorkloadLanguagesResponse)(nil), // 63: api.v1.GetWorkloadLanguagesResponse + (*GetForecastWorkloadsRequest)(nil), // 64: api.v1.GetForecastWorkloadsRequest + (*GetForecastWorkloadsResponse)(nil), // 65: api.v1.GetForecastWorkloadsResponse + (*GetForecastWorkloadRequest)(nil), // 66: api.v1.GetForecastWorkloadRequest + (*GetForecastWorkloadResponse)(nil), // 67: api.v1.GetForecastWorkloadResponse + (*GetClusterMetadataResponse)(nil), // 68: api.v1.GetClusterMetadataResponse + (*ClusterElement)(nil), // 69: api.v1.ClusterElement + (*GetAllNamespacesRequest)(nil), // 70: api.v1.GetAllNamespacesRequest + (*GetAllNamespacesResponse)(nil), // 71: api.v1.GetAllNamespacesResponse + (*SearchNamespacesByClusterRequest)(nil), // 72: api.v1.SearchNamespacesByClusterRequest + (*SearchNamespacesByClusterResponse)(nil), // 73: api.v1.SearchNamespacesByClusterResponse + (*ListNamespacesByClusterRequest)(nil), // 74: api.v1.ListNamespacesByClusterRequest + (*ListNamespacesByClusterResponse)(nil), // 75: api.v1.ListNamespacesByClusterResponse + (*NamespaceItem)(nil), // 76: api.v1.NamespaceItem + (*GetAllWorkloadNamesRequest)(nil), // 77: api.v1.GetAllWorkloadNamesRequest + (*GetAllWorkloadNamesResponse)(nil), // 78: api.v1.GetAllWorkloadNamesResponse + (*GetAllWorkloadLabelsRequest)(nil), // 79: api.v1.GetAllWorkloadLabelsRequest + (*GetAllWorkloadLabelsResponse)(nil), // 80: api.v1.GetAllWorkloadLabelsResponse + (*GetAllNodeGroupNamesRequest)(nil), // 81: api.v1.GetAllNodeGroupNamesRequest + (*GetAllNodeGroupNamesResponse)(nil), // 82: api.v1.GetAllNodeGroupNamesResponse + (*Cluster)(nil), // 83: api.v1.Cluster + (*OperatorInfo)(nil), // 84: api.v1.OperatorInfo + (*Container)(nil), // 85: api.v1.Container + (*GetLatestOperatorVersionRequest)(nil), // 86: api.v1.GetLatestOperatorVersionRequest + (*GetLatestOperatorVersionResponse)(nil), // 87: api.v1.GetLatestOperatorVersionResponse + (*GalaxyGetWorkloadPerspectiveRequest)(nil), // 88: api.v1.GalaxyGetWorkloadPerspectiveRequest + (*GalaxyGetWorkloadPerspectiveResponse)(nil), // 89: api.v1.GalaxyGetWorkloadPerspectiveResponse + (*GalaxyWorkloadGroup)(nil), // 90: api.v1.GalaxyWorkloadGroup + (*PerspectiveDatapointOpts)(nil), // 91: api.v1.PerspectiveDatapointOpts + (*ListAuditLogsRequest)(nil), // 92: api.v1.ListAuditLogsRequest + (*ListAuditLogsResponse)(nil), // 93: api.v1.ListAuditLogsResponse + (*ListAuditLogOriginatorsRequest)(nil), // 94: api.v1.ListAuditLogOriginatorsRequest + (*ListAuditLogOriginatorsResponse)(nil), // 95: api.v1.ListAuditLogOriginatorsResponse + (*SendWorkloadEmailRequest)(nil), // 96: api.v1.SendWorkloadEmailRequest + (*SendWorkloadEmailResponse)(nil), // 97: api.v1.SendWorkloadEmailResponse + (*SendWeeklySummaryEmailRequest)(nil), // 98: api.v1.SendWeeklySummaryEmailRequest + (*SendWeeklySummaryEmailRequestData)(nil), // 99: api.v1.SendWeeklySummaryEmailRequestData + (*SendWeeklySummaryEmailResponse)(nil), // 100: api.v1.SendWeeklySummaryEmailResponse + (*GetClustersNodeInfoRequest)(nil), // 101: api.v1.GetClustersNodeInfoRequest + (*GetClustersNodeInfoResponse)(nil), // 102: api.v1.GetClustersNodeInfoResponse + (*SearchK8SResourcesRequest)(nil), // 103: api.v1.SearchK8sResourcesRequest + (*SearchK8SResourcesResponse)(nil), // 104: api.v1.SearchK8sResourcesResponse + (*K8SSearchResult)(nil), // 105: api.v1.K8sSearchResult + (*SearchK8SWorkloadsRequest)(nil), // 106: api.v1.SearchK8sWorkloadsRequest + (*SearchK8SWorkloadsResponse)(nil), // 107: api.v1.SearchK8sWorkloadsResponse + (*K8SWorkloadSearchResult)(nil), // 108: api.v1.K8sWorkloadSearchResult + (*MetadataForWorkloadsRequest)(nil), // 109: api.v1.MetadataForWorkloadsRequest + (*MetadataForWorkloadsResponse)(nil), // 110: api.v1.MetadataForWorkloadsResponse + (*AddClusterTagsRequest)(nil), // 111: api.v1.AddClusterTagsRequest + (*AddClusterTagsResponse)(nil), // 112: api.v1.AddClusterTagsResponse + (*RemoveClusterTagsRequest)(nil), // 113: api.v1.RemoveClusterTagsRequest + (*RemoveClusterTagsResponse)(nil), // 114: api.v1.RemoveClusterTagsResponse + (*ListTagsRequest)(nil), // 115: api.v1.ListTagsRequest + (*TagSummary)(nil), // 116: api.v1.TagSummary + (*ListTagsResponse)(nil), // 117: api.v1.ListTagsResponse + (*WorkloadMetadata)(nil), // 118: api.v1.WorkloadMetadata + (*PodMetadata)(nil), // 119: api.v1.PodMetadata + (*NodeMetadata)(nil), // 120: api.v1.NodeMetadata + (*GetRelatedResourcesRequest)(nil), // 121: api.v1.GetRelatedResourcesRequest + (*GetWorkloadPodHistoryResponse)(nil), // 122: api.v1.GetWorkloadPodHistoryResponse + (*JobHistory)(nil), // 123: api.v1.JobHistory + (*ReplicaSetHistory)(nil), // 124: api.v1.ReplicaSetHistory + (*PodHistory)(nil), // 125: api.v1.PodHistory + (*GetRelatedResourcesResponse)(nil), // 126: api.v1.GetRelatedResourcesResponse + (*K8SRelatedResource)(nil), // 127: api.v1.K8sRelatedResource + (*K8SResourceNode)(nil), // 128: api.v1.K8sResourceNode + (*K8SResourceEdge)(nil), // 129: api.v1.K8sResourceEdge + (*GetClusterTypeRequest)(nil), // 130: api.v1.GetClusterTypeRequest + (*GetClusterTypeResponse)(nil), // 131: api.v1.GetClusterTypeResponse + (*GetMigPartedConfigRequest)(nil), // 132: api.v1.GetMigPartedConfigRequest + (*GetMigPartedConfigResponse)(nil), // 133: api.v1.GetMigPartedConfigResponse + (*GetWorkloadsStatsRequest)(nil), // 134: api.v1.GetWorkloadsStatsRequest + (*GetWorkloadsStatsResponse)(nil), // 135: api.v1.GetWorkloadsStatsResponse + (*DailyUtilizationRequest)(nil), // 136: api.v1.DailyUtilizationRequest + (*DailyUtilizationResponse)(nil), // 137: api.v1.DailyUtilizationResponse + (*DailyUtilizationInstanceTypeRequest)(nil), // 138: api.v1.DailyUtilizationInstanceTypeRequest + (*DailyUtilizationInstanceTypeResponse)(nil), // 139: api.v1.DailyUtilizationInstanceTypeResponse + (*DailyUtilizationNodeTypeRequest)(nil), // 140: api.v1.DailyUtilizationNodeTypeRequest + (*DailyUtilizationNodeTypeResponse)(nil), // 141: api.v1.DailyUtilizationNodeTypeResponse + (*LookupNodeInstanceRequest)(nil), // 142: api.v1.LookupNodeInstanceRequest + (*InstanceLookupParams)(nil), // 143: api.v1.InstanceLookupParams + (*LookupNodeInstanceResponse)(nil), // 144: api.v1.LookupNodeInstanceResponse + nil, // 145: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry + (*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics)(nil), // 146: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + nil, // 147: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry + nil, // 148: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry + nil, // 149: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry + nil, // 150: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry + nil, // 151: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry + nil, // 152: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry + nil, // 153: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry + nil, // 154: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry + nil, // 155: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry + nil, // 156: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry + (*DailyUtilizationResponse_Datapoints)(nil), // 157: api.v1.DailyUtilizationResponse.Datapoints + (*DailyUtilizationResponse_Datapoint)(nil), // 158: api.v1.DailyUtilizationResponse.Datapoint + nil, // 159: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry + nil, // 160: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry + (*DailyUtilizationInstanceTypeResponse_Datapoints)(nil), // 161: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints + (*DailyUtilizationInstanceTypeResponse_Datapoint)(nil), // 162: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint + nil, // 163: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry + nil, // 164: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry + nil, // 165: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry + (*DailyUtilizationNodeTypeResponse_Datapoints)(nil), // 166: api.v1.DailyUtilizationNodeTypeResponse.Datapoints + (*DailyUtilizationNodeTypeResponse_Datapoint)(nil), // 167: api.v1.DailyUtilizationNodeTypeResponse.Datapoint + nil, // 168: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry + nil, // 169: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry + nil, // 170: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry + (*timestamppb.Timestamp)(nil), // 171: google.protobuf.Timestamp + (*WorkloadFilters)(nil), // 172: api.v1.WorkloadFilters + (*WorkloadItem)(nil), // 173: api.v1.WorkloadItem + (K8SObjectKind)(0), // 174: api.v1.K8sObjectKind + (*Pagination)(nil), // 175: api.v1.Pagination + (*ResourceFieldFilter)(nil), // 176: api.v1.ResourceFieldFilter + (*ResourceFilterFieldOptions)(nil), // 177: api.v1.ResourceFilterFieldOptions + (*NodeGroup)(nil), // 178: api.v1.NodeGroup + (*money.Money)(nil), // 179: google.type.Money + (*ResourceMetrics)(nil), // 180: api.v1.ResourceMetrics + (*CostInfo)(nil), // 181: api.v1.CostInfo + (*NodeInfo)(nil), // 182: api.v1.NodeInfo + (*CostDataPoint)(nil), // 183: api.v1.CostDataPoint + (*ResourceDataPoint)(nil), // 184: api.v1.ResourceDataPoint + (*Node)(nil), // 185: api.v1.Node + (*ResourceSummary)(nil), // 186: api.v1.ResourceSummary + (*ContainerPercentileSummary)(nil), // 187: api.v1.ContainerPercentileSummary + (*ContainerTimeSeries)(nil), // 188: api.v1.ContainerTimeSeries + (*ContainerRequestLimits)(nil), // 189: api.v1.ContainerRequestLimits + (*GPUMigInstance)(nil), // 190: api.v1.GPUMigInstance + (*ContainerIndividualGPUMetrics)(nil), // 191: api.v1.ContainerIndividualGPUMetrics + (*ForecastResourceMetrics)(nil), // 192: api.v1.ForecastResourceMetrics + (*AuditLogEntry)(nil), // 193: api.v1.AuditLogEntry + (*Instance)(nil), // 194: api.v1.Instance } var file_api_v1_k8s_proto_depIdxs = []int32{ - 150, // 0: api.v1.GetNodeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 1: api.v1.GetNodeRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 2: api.v1.GetWorkloadPodHistoryRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 3: api.v1.GetWorkloadPodHistoryRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 4: api.v1.GetNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 5: api.v1.GetNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 6: api.v1.GetWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 7: api.v1.GetWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp - 151, // 8: api.v1.GetWorkloadsRequest.filters:type_name -> api.v1.WorkloadFilters - 152, // 9: api.v1.GetResourcesRequest.kind:type_name -> api.v1.K8sObjectKind - 153, // 10: api.v1.GetResourcesRequest.pagination:type_name -> api.v1.Pagination - 153, // 11: api.v1.GetPodsRequest.pagination:type_name -> api.v1.Pagination - 150, // 12: api.v1.GetPodsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 13: api.v1.GetPodsRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 14: api.v1.GetPodsResponse.workload_items:type_name -> api.v1.WorkloadItem - 153, // 15: api.v1.GetPodsResponse.pagination:type_name -> api.v1.Pagination - 150, // 16: api.v1.GetWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 17: api.v1.GetWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 18: api.v1.GetClustersRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 19: api.v1.GetClustersRequest.end_time:type_name -> google.protobuf.Timestamp - 153, // 20: api.v1.ListClustersRequest.pagination:type_name -> api.v1.Pagination - 150, // 21: api.v1.GetClusterRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 22: api.v1.GetClusterRequest.end_time:type_name -> google.protobuf.Timestamp - 64, // 23: api.v1.UpdateClusterResponse.cluster:type_name -> api.v1.Cluster - 154, // 24: api.v1.GetResourcesResponse.workload_items:type_name -> api.v1.WorkloadItem - 153, // 25: api.v1.GetResourcesResponse.pagination:type_name -> api.v1.Pagination - 64, // 26: api.v1.CreateClusterResponse.cluster:type_name -> api.v1.Cluster - 150, // 27: api.v1.GetNodeGroupsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 28: api.v1.GetNodeGroupsRequest.end_time:type_name -> google.protobuf.Timestamp - 155, // 29: api.v1.GetNodeGroupsResponse.node_groups:type_name -> api.v1.NodeGroup - 124, // 30: api.v1.GetAllNodeGroupsResponse.node_group_map:type_name -> api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry - 155, // 31: api.v1.NodeGroupSet.node_groups:type_name -> api.v1.NodeGroup - 150, // 32: api.v1.GetNodeGroupsUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 33: api.v1.GetNodeGroupsUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp - 126, // 34: api.v1.GetNodeGroupsUtilizationResponse.node_group_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry - 127, // 35: api.v1.GetNodeGroupsUtilizationResponse.instance_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry - 128, // 36: api.v1.GetNodeGroupsUtilizationResponse.reservation_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry - 129, // 37: api.v1.GetNodeGroupsUtilizationResponse.logical_az_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry - 156, // 38: api.v1.NodeGroupMetric.hourly_cost:type_name -> google.type.Money - 156, // 39: api.v1.NodeGroupMetric.hourly_cpu_cost:type_name -> google.type.Money - 156, // 40: api.v1.NodeGroupMetric.hourly_memory_cost:type_name -> google.type.Money - 156, // 41: api.v1.NodeGroupMetric.hourly_gpu_cost:type_name -> google.type.Money - 150, // 42: api.v1.NodeGroupMetric.bucket_time:type_name -> google.protobuf.Timestamp - 155, // 43: api.v1.GetNodeGroupResponse.node_group:type_name -> api.v1.NodeGroup - 64, // 44: api.v1.GetClusterResponse.cluster:type_name -> api.v1.Cluster - 64, // 45: api.v1.GetClustersResponse.clusters:type_name -> api.v1.Cluster - 157, // 46: api.v1.GetClustersResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 47: api.v1.GetClustersResponse.cost_info:type_name -> api.v1.CostInfo - 159, // 48: api.v1.GetClustersResponse.node_info:type_name -> api.v1.NodeInfo - 160, // 49: api.v1.GetClustersResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 50: api.v1.GetClustersResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 64, // 51: api.v1.ListClustersResponse.clusters:type_name -> api.v1.Cluster - 153, // 52: api.v1.ListClustersResponse.pagination:type_name -> api.v1.Pagination - 162, // 53: api.v1.GetNodeResponse.node:type_name -> api.v1.Node - 157, // 54: api.v1.GetNodeResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 55: api.v1.GetNodeResponse.cost_info:type_name -> api.v1.CostInfo - 160, // 56: api.v1.GetNodeResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 57: api.v1.GetNodeResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 154, // 58: api.v1.GetWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem - 158, // 59: api.v1.GetWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo - 157, // 60: api.v1.GetWorkloadsResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 61: api.v1.GetWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary - 154, // 62: api.v1.GetWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem - 158, // 63: api.v1.GetWorkloadResponse.cost_info:type_name -> api.v1.CostInfo - 157, // 64: api.v1.GetWorkloadResponse.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 65: api.v1.GetWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary - 160, // 66: api.v1.GetWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 67: api.v1.GetWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 150, // 68: api.v1.GetWorkloadContainerPercentilesRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 69: api.v1.GetWorkloadContainerPercentilesRequest.end_time:type_name -> google.protobuf.Timestamp - 164, // 70: api.v1.GetWorkloadContainerPercentilesResponse.containers:type_name -> api.v1.ContainerPercentileSummary - 150, // 71: api.v1.GetWorkloadContainerTimeSeriesRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 72: api.v1.GetWorkloadContainerTimeSeriesRequest.end_time:type_name -> google.protobuf.Timestamp - 165, // 73: api.v1.GetWorkloadContainerTimeSeriesResponse.containers:type_name -> api.v1.ContainerTimeSeries - 166, // 74: api.v1.GetLatestContainerRequestLimitsResponse.containers:type_name -> api.v1.ContainerRequestLimits - 150, // 75: api.v1.GetForecastWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 76: api.v1.GetForecastWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 77: api.v1.GetForecastWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem - 158, // 78: api.v1.GetForecastWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo - 167, // 79: api.v1.GetForecastWorkloadsResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics - 163, // 80: api.v1.GetForecastWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary - 150, // 81: api.v1.GetForecastWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 82: api.v1.GetForecastWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 154, // 83: api.v1.GetForecastWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem - 158, // 84: api.v1.GetForecastWorkloadResponse.cost_info:type_name -> api.v1.CostInfo - 167, // 85: api.v1.GetForecastWorkloadResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics - 163, // 86: api.v1.GetForecastWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary - 160, // 87: api.v1.GetForecastWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 88: api.v1.GetForecastWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint - 64, // 89: api.v1.GetClusterMetadataResponse.clusters:type_name -> api.v1.Cluster - 50, // 90: api.v1.GetAllNamespacesResponse.cluster_id_with_namespaces:type_name -> api.v1.ClusterElement - 57, // 91: api.v1.ListNamespacesByClusterResponse.namespaces:type_name -> api.v1.NamespaceItem - 152, // 92: api.v1.GetAllWorkloadNamesRequest.kinds:type_name -> api.v1.K8sObjectKind - 50, // 93: api.v1.GetAllWorkloadNamesResponse.cluster_id_with_workload_name:type_name -> api.v1.ClusterElement - 152, // 94: api.v1.GetAllWorkloadLabelsRequest.kinds:type_name -> api.v1.K8sObjectKind - 50, // 95: api.v1.GetAllWorkloadLabelsResponse.cluster_id_with_labels:type_name -> api.v1.ClusterElement - 50, // 96: api.v1.GetAllNodeGroupNamesResponse.cluster_id_with_node_group_names:type_name -> api.v1.ClusterElement - 157, // 97: api.v1.Cluster.resource_metrics:type_name -> api.v1.ResourceMetrics - 158, // 98: api.v1.Cluster.cost_info:type_name -> api.v1.CostInfo - 159, // 99: api.v1.Cluster.node_info:type_name -> api.v1.NodeInfo - 160, // 100: api.v1.Cluster.cost_data_points:type_name -> api.v1.CostDataPoint - 161, // 101: api.v1.Cluster.resource_data_points:type_name -> api.v1.ResourceDataPoint - 162, // 102: api.v1.Cluster.most_expensive_node:type_name -> api.v1.Node - 162, // 103: api.v1.Cluster.least_expensive_node:type_name -> api.v1.Node - 162, // 104: api.v1.Cluster.most_underutilized_node:type_name -> api.v1.Node - 66, // 105: api.v1.Cluster.most_underutilized_container:type_name -> api.v1.Container - 65, // 106: api.v1.Cluster.zxp_info:type_name -> api.v1.OperatorInfo - 65, // 107: api.v1.Cluster.zxp_helm_info:type_name -> api.v1.OperatorInfo - 65, // 108: api.v1.Cluster.dakr_op_info:type_name -> api.v1.OperatorInfo - 65, // 109: api.v1.Cluster.node_op_info:type_name -> api.v1.OperatorInfo - 65, // 110: api.v1.Cluster.security_op_info:type_name -> api.v1.OperatorInfo - 65, // 111: api.v1.Cluster.network_op_info:type_name -> api.v1.OperatorInfo - 157, // 112: api.v1.Container.resource_metrics:type_name -> api.v1.ResourceMetrics - 65, // 113: api.v1.GetLatestOperatorVersionResponse.zxp_info:type_name -> api.v1.OperatorInfo - 65, // 114: api.v1.GetLatestOperatorVersionResponse.zxp_helm_info:type_name -> api.v1.OperatorInfo - 65, // 115: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_info:type_name -> api.v1.OperatorInfo - 65, // 116: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_helm_info:type_name -> api.v1.OperatorInfo - 65, // 117: api.v1.GetLatestOperatorVersionResponse.dakr_op_info:type_name -> api.v1.OperatorInfo - 65, // 118: api.v1.GetLatestOperatorVersionResponse.dakr_op_helm_info:type_name -> api.v1.OperatorInfo - 65, // 119: api.v1.GetLatestOperatorVersionResponse.node_op_info_aws:type_name -> api.v1.OperatorInfo - 65, // 120: api.v1.GetLatestOperatorVersionResponse.node_op_info_azure:type_name -> api.v1.OperatorInfo - 65, // 121: api.v1.GetLatestOperatorVersionResponse.node_op_info_gcp:type_name -> api.v1.OperatorInfo - 65, // 122: api.v1.GetLatestOperatorVersionResponse.node_op_info_oci:type_name -> api.v1.OperatorInfo - 65, // 123: api.v1.GetLatestOperatorVersionResponse.security_op_info:type_name -> api.v1.OperatorInfo - 65, // 124: api.v1.GetLatestOperatorVersionResponse.security_op_helm_info:type_name -> api.v1.OperatorInfo - 65, // 125: api.v1.GetLatestOperatorVersionResponse.trezr_info:type_name -> api.v1.OperatorInfo - 65, // 126: api.v1.GetLatestOperatorVersionResponse.trezr_helm_info:type_name -> api.v1.OperatorInfo - 1, // 127: api.v1.GalaxyGetWorkloadPerspectiveRequest.group_by:type_name -> api.v1.GalaxyPOVWorkloadGroupBy - 72, // 128: api.v1.GalaxyGetWorkloadPerspectiveRequest.datapoint_opts:type_name -> api.v1.PerspectiveDatapointOpts - 71, // 129: api.v1.GalaxyGetWorkloadPerspectiveResponse.groupings:type_name -> api.v1.GalaxyWorkloadGroup - 130, // 130: api.v1.GalaxyGetWorkloadPerspectiveResponse.clusters:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry - 131, // 131: api.v1.GalaxyGetWorkloadPerspectiveResponse.workloads:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry - 158, // 132: api.v1.GalaxyWorkloadGroup.cost_info:type_name -> api.v1.CostInfo - 157, // 133: api.v1.GalaxyWorkloadGroup.resource_metrics:type_name -> api.v1.ResourceMetrics - 163, // 134: api.v1.GalaxyWorkloadGroup.resource_summary:type_name -> api.v1.ResourceSummary - 152, // 135: api.v1.ListAuditLogsRequest.workload_type:type_name -> api.v1.K8sObjectKind - 150, // 136: api.v1.ListAuditLogsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 137: api.v1.ListAuditLogsRequest.end_time:type_name -> google.protobuf.Timestamp - 153, // 138: api.v1.ListAuditLogsRequest.pagination:type_name -> api.v1.Pagination - 168, // 139: api.v1.ListAuditLogsResponse.logs:type_name -> api.v1.AuditLogEntry - 153, // 140: api.v1.ListAuditLogsResponse.pagination:type_name -> api.v1.Pagination - 152, // 141: api.v1.ListAuditLogOriginatorsRequest.workload_type:type_name -> api.v1.K8sObjectKind - 150, // 142: api.v1.ListAuditLogOriginatorsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 143: api.v1.ListAuditLogOriginatorsRequest.end_time:type_name -> google.protobuf.Timestamp - 80, // 144: api.v1.SendWeeklySummaryEmailRequest.request:type_name -> api.v1.SendWeeklySummaryEmailRequestData - 150, // 145: api.v1.GetClustersNodeInfoRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 146: api.v1.GetClustersNodeInfoRequest.end_time:type_name -> google.protobuf.Timestamp - 159, // 147: api.v1.GetClustersNodeInfoResponse.node_info:type_name -> api.v1.NodeInfo - 162, // 148: api.v1.GetClustersNodeInfoResponse.most_expensive_node:type_name -> api.v1.Node - 162, // 149: api.v1.GetClustersNodeInfoResponse.least_expensive_node:type_name -> api.v1.Node - 162, // 150: api.v1.GetClustersNodeInfoResponse.most_underutilized_node:type_name -> api.v1.Node - 86, // 151: api.v1.SearchK8sResourcesResponse.results:type_name -> api.v1.K8sSearchResult - 89, // 152: api.v1.SearchK8sWorkloadsResponse.results:type_name -> api.v1.K8sWorkloadSearchResult - 132, // 153: api.v1.MetadataForWorkloadsRequest.workload_uid_to_kind:type_name -> api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry - 133, // 154: api.v1.MetadataForWorkloadsResponse.workload_uid_to_metadata:type_name -> api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry - 64, // 155: api.v1.AddClusterTagsResponse.cluster:type_name -> api.v1.Cluster - 64, // 156: api.v1.RemoveClusterTagsResponse.cluster:type_name -> api.v1.Cluster - 97, // 157: api.v1.ListTagsResponse.tags:type_name -> api.v1.TagSummary - 134, // 158: api.v1.WorkloadMetadata.pod_uid_to_node_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry - 135, // 159: api.v1.WorkloadMetadata.pod_uid_to_pod_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToPodMetadataEntry - 152, // 160: api.v1.WorkloadMetadata.kind:type_name -> api.v1.K8sObjectKind - 152, // 161: api.v1.GetRelatedResourcesRequest.kind:type_name -> api.v1.K8sObjectKind - 105, // 162: api.v1.GetWorkloadPodHistoryResponse.replica_sets:type_name -> api.v1.ReplicaSetHistory - 106, // 163: api.v1.GetWorkloadPodHistoryResponse.direct_pods:type_name -> api.v1.PodHistory - 104, // 164: api.v1.GetWorkloadPodHistoryResponse.jobs:type_name -> api.v1.JobHistory - 150, // 165: api.v1.JobHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 166: api.v1.JobHistory.deleted_at:type_name -> google.protobuf.Timestamp - 106, // 167: api.v1.JobHistory.pods:type_name -> api.v1.PodHistory - 150, // 168: api.v1.ReplicaSetHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 169: api.v1.ReplicaSetHistory.deleted_at:type_name -> google.protobuf.Timestamp - 106, // 170: api.v1.ReplicaSetHistory.pods:type_name -> api.v1.PodHistory - 150, // 171: api.v1.PodHistory.created_at:type_name -> google.protobuf.Timestamp - 150, // 172: api.v1.PodHistory.deleted_at:type_name -> google.protobuf.Timestamp - 108, // 173: api.v1.GetRelatedResourcesResponse.relations:type_name -> api.v1.K8sRelatedResource - 109, // 174: api.v1.GetRelatedResourcesResponse.nodes:type_name -> api.v1.K8sResourceNode - 110, // 175: api.v1.GetRelatedResourcesResponse.edges:type_name -> api.v1.K8sResourceEdge - 2, // 176: api.v1.GetClusterTypeResponse.cluster_type:type_name -> api.v1.ClusterType - 150, // 177: api.v1.GetWorkloadsStatsRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 178: api.v1.GetWorkloadsStatsRequest.end_time:type_name -> google.protobuf.Timestamp - 150, // 179: api.v1.DailyUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 180: api.v1.DailyUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp - 138, // 181: api.v1.DailyUtilizationResponse.cluster_id_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry - 139, // 182: api.v1.DailyUtilizationResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry - 150, // 183: api.v1.DailyUtilizationInstanceTypeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 184: api.v1.DailyUtilizationInstanceTypeRequest.end_time:type_name -> google.protobuf.Timestamp - 142, // 185: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry - 143, // 186: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry - 150, // 187: api.v1.DailyUtilizationNodeTypeRequest.start_time:type_name -> google.protobuf.Timestamp - 150, // 188: api.v1.DailyUtilizationNodeTypeRequest.end_time:type_name -> google.protobuf.Timestamp - 147, // 189: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry - 148, // 190: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry - 169, // 191: api.v1.LookupNodeInstanceResponse.dynamic_instance:type_name -> api.v1.Instance - 169, // 192: api.v1.LookupNodeInstanceResponse.cached_instance:type_name -> api.v1.Instance - 122, // 193: api.v1.LookupNodeInstanceResponse.lookup_params:type_name -> api.v1.InstanceLookupParams - 155, // 194: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroup - 31, // 195: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics.node_group_metrics:type_name -> api.v1.NodeGroupMetric - 125, // 196: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 197: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 198: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 125, // 199: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics - 64, // 200: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry.value:type_name -> api.v1.Cluster - 154, // 201: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry.value:type_name -> api.v1.WorkloadItem - 152, // 202: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry.value:type_name -> api.v1.K8sObjectKind - 99, // 203: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry.value:type_name -> api.v1.WorkloadMetadata - 101, // 204: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry.value:type_name -> api.v1.NodeMetadata - 100, // 205: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry.value:type_name -> api.v1.PodMetadata - 137, // 206: api.v1.DailyUtilizationResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationResponse.Datapoint - 136, // 207: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry.value:type_name -> api.v1.DailyUtilizationResponse.Datapoints - 64, // 208: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 141, // 209: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint - 144, // 210: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.instance_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry - 140, // 211: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoints - 64, // 212: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 146, // 213: api.v1.DailyUtilizationNodeTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint - 149, // 214: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.node_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry - 145, // 215: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoints - 64, // 216: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster - 113, // 217: api.v1.K8SService.GetWorkloadsStats:input_type -> api.v1.GetWorkloadsStatsRequest - 12, // 218: api.v1.K8SService.GetClusters:input_type -> api.v1.GetClustersRequest - 13, // 219: api.v1.K8SService.ListClusters:input_type -> api.v1.ListClustersRequest - 14, // 220: api.v1.K8SService.GetCluster:input_type -> api.v1.GetClusterRequest - 5, // 221: api.v1.K8SService.GetClusterMetadata:input_type -> api.v1.GetClusterMetadataRequest - 51, // 222: api.v1.K8SService.GetAllNamespaces:input_type -> api.v1.GetAllNamespacesRequest - 53, // 223: api.v1.K8SService.SearchNamespacesByCluster:input_type -> api.v1.SearchNamespacesByClusterRequest - 55, // 224: api.v1.K8SService.ListNamespacesByCluster:input_type -> api.v1.ListNamespacesByClusterRequest - 58, // 225: api.v1.K8SService.GetAllWorkloadNames:input_type -> api.v1.GetAllWorkloadNamesRequest - 60, // 226: api.v1.K8SService.GetAllWorkloadLabels:input_type -> api.v1.GetAllWorkloadLabelsRequest - 62, // 227: api.v1.K8SService.GetAllNodeGroupNames:input_type -> api.v1.GetAllNodeGroupNamesRequest - 90, // 228: api.v1.K8SService.MetadataForWorkloads:input_type -> api.v1.MetadataForWorkloadsRequest - 24, // 229: api.v1.K8SService.GetNodeGroups:input_type -> api.v1.GetNodeGroupsRequest - 25, // 230: api.v1.K8SService.GetAllNodeGroups:input_type -> api.v1.GetAllNodeGroupsRequest - 29, // 231: api.v1.K8SService.GetNodeGroupsUtilization:input_type -> api.v1.GetNodeGroupsUtilizationRequest - 6, // 232: api.v1.K8SService.GetNodeGroup:input_type -> api.v1.GetNodeGroupRequest - 3, // 233: api.v1.K8SService.GetNode:input_type -> api.v1.GetNodeRequest - 7, // 234: api.v1.K8SService.GetWorkloads:input_type -> api.v1.GetWorkloadsRequest - 11, // 235: api.v1.K8SService.GetWorkload:input_type -> api.v1.GetWorkloadRequest - 39, // 236: api.v1.K8SService.GetWorkloadContainerPercentiles:input_type -> api.v1.GetWorkloadContainerPercentilesRequest - 41, // 237: api.v1.K8SService.GetWorkloadContainerTimeSeries:input_type -> api.v1.GetWorkloadContainerTimeSeriesRequest - 43, // 238: api.v1.K8SService.GetLatestContainerRequestLimits:input_type -> api.v1.GetLatestContainerRequestLimitsRequest - 45, // 239: api.v1.K8SService.GetForecastWorkloads:input_type -> api.v1.GetForecastWorkloadsRequest - 47, // 240: api.v1.K8SService.GetForecastWorkload:input_type -> api.v1.GetForecastWorkloadRequest - 8, // 241: api.v1.K8SService.GetResources:input_type -> api.v1.GetResourcesRequest - 9, // 242: api.v1.K8SService.GetPods:input_type -> api.v1.GetPodsRequest - 67, // 243: api.v1.K8SService.GetLatestOperatorVersion:input_type -> api.v1.GetLatestOperatorVersionRequest - 69, // 244: api.v1.K8SService.GalaxyGetWorkloadPerspective:input_type -> api.v1.GalaxyGetWorkloadPerspectiveRequest - 73, // 245: api.v1.K8SService.ListAuditLogs:input_type -> api.v1.ListAuditLogsRequest - 75, // 246: api.v1.K8SService.ListAuditLogOriginators:input_type -> api.v1.ListAuditLogOriginatorsRequest - 77, // 247: api.v1.K8SService.SendWorkloadEmail:input_type -> api.v1.SendWorkloadEmailRequest - 79, // 248: api.v1.K8SService.SendWeeklySummaryEmail:input_type -> api.v1.SendWeeklySummaryEmailRequest - 82, // 249: api.v1.K8SService.GetClustersNodeInfo:input_type -> api.v1.GetClustersNodeInfoRequest - 84, // 250: api.v1.K8SService.SearchK8sResources:input_type -> api.v1.SearchK8sResourcesRequest - 87, // 251: api.v1.K8SService.SearchK8sWorkloads:input_type -> api.v1.SearchK8sWorkloadsRequest - 111, // 252: api.v1.K8SService.GetClusterType:input_type -> api.v1.GetClusterTypeRequest - 102, // 253: api.v1.K8SService.GetRelationsForKind:input_type -> api.v1.GetRelatedResourcesRequest - 121, // 254: api.v1.K8SService.LookupNodeInstance:input_type -> api.v1.LookupNodeInstanceRequest - 4, // 255: api.v1.K8SService.GetWorkloadPodHistory:input_type -> api.v1.GetWorkloadPodHistoryRequest - 92, // 256: api.v1.K8SService.AddClusterTags:input_type -> api.v1.AddClusterTagsRequest - 94, // 257: api.v1.K8SService.RemoveClusterTags:input_type -> api.v1.RemoveClusterTagsRequest - 96, // 258: api.v1.K8SService.ListTags:input_type -> api.v1.ListTagsRequest - 20, // 259: api.v1.ClusterMutationService.CreateCluster:input_type -> api.v1.CreateClusterRequest - 15, // 260: api.v1.ClusterMutationService.DeleteCluster:input_type -> api.v1.DeleteClusterRequest - 17, // 261: api.v1.ClusterMutationService.UpdateCluster:input_type -> api.v1.UpdateClusterRequest - 22, // 262: api.v1.ClusterMutationService.ResetClusterToken:input_type -> api.v1.ResetClusterTokenRequest - 115, // 263: api.v1.UtilizationService.DailyUtilization:input_type -> api.v1.DailyUtilizationRequest - 117, // 264: api.v1.UtilizationService.DailyUtilizationInstanceType:input_type -> api.v1.DailyUtilizationInstanceTypeRequest - 119, // 265: api.v1.UtilizationService.DailyUtilizationNodeType:input_type -> api.v1.DailyUtilizationNodeTypeRequest - 114, // 266: api.v1.K8SService.GetWorkloadsStats:output_type -> api.v1.GetWorkloadsStatsResponse - 34, // 267: api.v1.K8SService.GetClusters:output_type -> api.v1.GetClustersResponse - 35, // 268: api.v1.K8SService.ListClusters:output_type -> api.v1.ListClustersResponse - 33, // 269: api.v1.K8SService.GetCluster:output_type -> api.v1.GetClusterResponse - 49, // 270: api.v1.K8SService.GetClusterMetadata:output_type -> api.v1.GetClusterMetadataResponse - 52, // 271: api.v1.K8SService.GetAllNamespaces:output_type -> api.v1.GetAllNamespacesResponse - 54, // 272: api.v1.K8SService.SearchNamespacesByCluster:output_type -> api.v1.SearchNamespacesByClusterResponse - 56, // 273: api.v1.K8SService.ListNamespacesByCluster:output_type -> api.v1.ListNamespacesByClusterResponse - 59, // 274: api.v1.K8SService.GetAllWorkloadNames:output_type -> api.v1.GetAllWorkloadNamesResponse - 61, // 275: api.v1.K8SService.GetAllWorkloadLabels:output_type -> api.v1.GetAllWorkloadLabelsResponse - 63, // 276: api.v1.K8SService.GetAllNodeGroupNames:output_type -> api.v1.GetAllNodeGroupNamesResponse - 91, // 277: api.v1.K8SService.MetadataForWorkloads:output_type -> api.v1.MetadataForWorkloadsResponse - 26, // 278: api.v1.K8SService.GetNodeGroups:output_type -> api.v1.GetNodeGroupsResponse - 27, // 279: api.v1.K8SService.GetAllNodeGroups:output_type -> api.v1.GetAllNodeGroupsResponse - 30, // 280: api.v1.K8SService.GetNodeGroupsUtilization:output_type -> api.v1.GetNodeGroupsUtilizationResponse - 32, // 281: api.v1.K8SService.GetNodeGroup:output_type -> api.v1.GetNodeGroupResponse - 36, // 282: api.v1.K8SService.GetNode:output_type -> api.v1.GetNodeResponse - 37, // 283: api.v1.K8SService.GetWorkloads:output_type -> api.v1.GetWorkloadsResponse - 38, // 284: api.v1.K8SService.GetWorkload:output_type -> api.v1.GetWorkloadResponse - 40, // 285: api.v1.K8SService.GetWorkloadContainerPercentiles:output_type -> api.v1.GetWorkloadContainerPercentilesResponse - 42, // 286: api.v1.K8SService.GetWorkloadContainerTimeSeries:output_type -> api.v1.GetWorkloadContainerTimeSeriesResponse - 44, // 287: api.v1.K8SService.GetLatestContainerRequestLimits:output_type -> api.v1.GetLatestContainerRequestLimitsResponse - 46, // 288: api.v1.K8SService.GetForecastWorkloads:output_type -> api.v1.GetForecastWorkloadsResponse - 48, // 289: api.v1.K8SService.GetForecastWorkload:output_type -> api.v1.GetForecastWorkloadResponse - 19, // 290: api.v1.K8SService.GetResources:output_type -> api.v1.GetResourcesResponse - 10, // 291: api.v1.K8SService.GetPods:output_type -> api.v1.GetPodsResponse - 68, // 292: api.v1.K8SService.GetLatestOperatorVersion:output_type -> api.v1.GetLatestOperatorVersionResponse - 70, // 293: api.v1.K8SService.GalaxyGetWorkloadPerspective:output_type -> api.v1.GalaxyGetWorkloadPerspectiveResponse - 74, // 294: api.v1.K8SService.ListAuditLogs:output_type -> api.v1.ListAuditLogsResponse - 76, // 295: api.v1.K8SService.ListAuditLogOriginators:output_type -> api.v1.ListAuditLogOriginatorsResponse - 78, // 296: api.v1.K8SService.SendWorkloadEmail:output_type -> api.v1.SendWorkloadEmailResponse - 81, // 297: api.v1.K8SService.SendWeeklySummaryEmail:output_type -> api.v1.SendWeeklySummaryEmailResponse - 83, // 298: api.v1.K8SService.GetClustersNodeInfo:output_type -> api.v1.GetClustersNodeInfoResponse - 85, // 299: api.v1.K8SService.SearchK8sResources:output_type -> api.v1.SearchK8sResourcesResponse - 88, // 300: api.v1.K8SService.SearchK8sWorkloads:output_type -> api.v1.SearchK8sWorkloadsResponse - 112, // 301: api.v1.K8SService.GetClusterType:output_type -> api.v1.GetClusterTypeResponse - 107, // 302: api.v1.K8SService.GetRelationsForKind:output_type -> api.v1.GetRelatedResourcesResponse - 123, // 303: api.v1.K8SService.LookupNodeInstance:output_type -> api.v1.LookupNodeInstanceResponse - 103, // 304: api.v1.K8SService.GetWorkloadPodHistory:output_type -> api.v1.GetWorkloadPodHistoryResponse - 93, // 305: api.v1.K8SService.AddClusterTags:output_type -> api.v1.AddClusterTagsResponse - 95, // 306: api.v1.K8SService.RemoveClusterTags:output_type -> api.v1.RemoveClusterTagsResponse - 98, // 307: api.v1.K8SService.ListTags:output_type -> api.v1.ListTagsResponse - 21, // 308: api.v1.ClusterMutationService.CreateCluster:output_type -> api.v1.CreateClusterResponse - 16, // 309: api.v1.ClusterMutationService.DeleteCluster:output_type -> api.v1.DeleteClusterResponse - 18, // 310: api.v1.ClusterMutationService.UpdateCluster:output_type -> api.v1.UpdateClusterResponse - 23, // 311: api.v1.ClusterMutationService.ResetClusterToken:output_type -> api.v1.ResetClusterTokenResponse - 116, // 312: api.v1.UtilizationService.DailyUtilization:output_type -> api.v1.DailyUtilizationResponse - 118, // 313: api.v1.UtilizationService.DailyUtilizationInstanceType:output_type -> api.v1.DailyUtilizationInstanceTypeResponse - 120, // 314: api.v1.UtilizationService.DailyUtilizationNodeType:output_type -> api.v1.DailyUtilizationNodeTypeResponse - 266, // [266:315] is the sub-list for method output_type - 217, // [217:266] is the sub-list for method input_type - 217, // [217:217] is the sub-list for extension type_name - 217, // [217:217] is the sub-list for extension extendee - 0, // [0:217] is the sub-list for field type_name + 171, // 0: api.v1.GetNodeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 1: api.v1.GetNodeRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 2: api.v1.GetWorkloadPodHistoryRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 3: api.v1.GetWorkloadPodHistoryRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 4: api.v1.GetNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 5: api.v1.GetNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 6: api.v1.GetWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 7: api.v1.GetWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 8: api.v1.GetWorkloadsRequest.filters:type_name -> api.v1.WorkloadFilters + 171, // 9: api.v1.ListWorkloadsPaginatedRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 10: api.v1.ListWorkloadsPaginatedRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 11: api.v1.ListWorkloadsPaginatedRequest.filters:type_name -> api.v1.WorkloadFilters + 171, // 12: api.v1.GetWorkloadsSummaryRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 13: api.v1.GetWorkloadsSummaryRequest.end_time:type_name -> google.protobuf.Timestamp + 172, // 14: api.v1.GetWorkloadsSummaryRequest.filters:type_name -> api.v1.WorkloadFilters + 10, // 15: api.v1.WorkloadMetricBreakdown.top_entries:type_name -> api.v1.WorkloadMetricEntry + 11, // 16: api.v1.GetWorkloadsSummaryResponse.cost:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 17: api.v1.GetWorkloadsSummaryResponse.cpu_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 18: api.v1.GetWorkloadsSummaryResponse.memory_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 19: api.v1.GetWorkloadsSummaryResponse.gpu_usage:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 20: api.v1.GetWorkloadsSummaryResponse.optimization_potential_cost:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 21: api.v1.GetWorkloadsSummaryResponse.optimization_potential_cpu:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 22: api.v1.GetWorkloadsSummaryResponse.optimization_potential_memory:type_name -> api.v1.WorkloadMetricBreakdown + 11, // 23: api.v1.GetWorkloadsSummaryResponse.optimization_potential_gpu:type_name -> api.v1.WorkloadMetricBreakdown + 173, // 24: api.v1.ListWorkloadsPaginatedResponse.workload_items:type_name -> api.v1.WorkloadItem + 174, // 25: api.v1.GetResourcesRequest.kind:type_name -> api.v1.K8sObjectKind + 175, // 26: api.v1.GetResourcesRequest.pagination:type_name -> api.v1.Pagination + 176, // 27: api.v1.GetResourcesRequest.filters:type_name -> api.v1.ResourceFieldFilter + 175, // 28: api.v1.GetPodsRequest.pagination:type_name -> api.v1.Pagination + 171, // 29: api.v1.GetPodsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 30: api.v1.GetPodsRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 31: api.v1.GetPodsResponse.workload_items:type_name -> api.v1.WorkloadItem + 175, // 32: api.v1.GetPodsResponse.pagination:type_name -> api.v1.Pagination + 171, // 33: api.v1.GetWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 34: api.v1.GetWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 35: api.v1.GetClustersRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 36: api.v1.GetClustersRequest.end_time:type_name -> google.protobuf.Timestamp + 175, // 37: api.v1.ListClustersRequest.pagination:type_name -> api.v1.Pagination + 171, // 38: api.v1.GetClusterRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 39: api.v1.GetClusterRequest.end_time:type_name -> google.protobuf.Timestamp + 83, // 40: api.v1.UpdateClusterResponse.cluster:type_name -> api.v1.Cluster + 173, // 41: api.v1.GetResourcesResponse.workload_items:type_name -> api.v1.WorkloadItem + 175, // 42: api.v1.GetResourcesResponse.pagination:type_name -> api.v1.Pagination + 174, // 43: api.v1.GetResourceFilterOptionsRequest.kind:type_name -> api.v1.K8sObjectKind + 177, // 44: api.v1.GetResourceFilterOptionsResponse.options:type_name -> api.v1.ResourceFilterFieldOptions + 83, // 45: api.v1.CreateClusterResponse.cluster:type_name -> api.v1.Cluster + 171, // 46: api.v1.GetNodeGroupsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 47: api.v1.GetNodeGroupsRequest.end_time:type_name -> google.protobuf.Timestamp + 178, // 48: api.v1.GetNodeGroupsResponse.node_groups:type_name -> api.v1.NodeGroup + 145, // 49: api.v1.GetAllNodeGroupsResponse.node_group_map:type_name -> api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry + 178, // 50: api.v1.NodeGroupSet.node_groups:type_name -> api.v1.NodeGroup + 171, // 51: api.v1.GetNodeGroupsUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 52: api.v1.GetNodeGroupsUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp + 147, // 53: api.v1.GetNodeGroupsUtilizationResponse.node_group_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry + 148, // 54: api.v1.GetNodeGroupsUtilizationResponse.instance_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry + 149, // 55: api.v1.GetNodeGroupsUtilizationResponse.reservation_type_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry + 150, // 56: api.v1.GetNodeGroupsUtilizationResponse.logical_az_to_util_metrics:type_name -> api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry + 179, // 57: api.v1.NodeGroupMetric.hourly_cost:type_name -> google.type.Money + 179, // 58: api.v1.NodeGroupMetric.hourly_cpu_cost:type_name -> google.type.Money + 179, // 59: api.v1.NodeGroupMetric.hourly_memory_cost:type_name -> google.type.Money + 179, // 60: api.v1.NodeGroupMetric.hourly_gpu_cost:type_name -> google.type.Money + 171, // 61: api.v1.NodeGroupMetric.bucket_time:type_name -> google.protobuf.Timestamp + 178, // 62: api.v1.GetNodeGroupResponse.node_group:type_name -> api.v1.NodeGroup + 83, // 63: api.v1.GetClusterResponse.cluster:type_name -> api.v1.Cluster + 83, // 64: api.v1.GetClustersResponse.clusters:type_name -> api.v1.Cluster + 180, // 65: api.v1.GetClustersResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 66: api.v1.GetClustersResponse.cost_info:type_name -> api.v1.CostInfo + 182, // 67: api.v1.GetClustersResponse.node_info:type_name -> api.v1.NodeInfo + 183, // 68: api.v1.GetClustersResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 69: api.v1.GetClustersResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 83, // 70: api.v1.ListClustersResponse.clusters:type_name -> api.v1.Cluster + 175, // 71: api.v1.ListClustersResponse.pagination:type_name -> api.v1.Pagination + 185, // 72: api.v1.GetNodeResponse.node:type_name -> api.v1.Node + 180, // 73: api.v1.GetNodeResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 74: api.v1.GetNodeResponse.cost_info:type_name -> api.v1.CostInfo + 183, // 75: api.v1.GetNodeResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 76: api.v1.GetNodeResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 173, // 77: api.v1.GetWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem + 181, // 78: api.v1.GetWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo + 180, // 79: api.v1.GetWorkloadsResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 80: api.v1.GetWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary + 173, // 81: api.v1.GetWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem + 181, // 82: api.v1.GetWorkloadResponse.cost_info:type_name -> api.v1.CostInfo + 180, // 83: api.v1.GetWorkloadResponse.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 84: api.v1.GetWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary + 183, // 85: api.v1.GetWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 86: api.v1.GetWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 171, // 87: api.v1.GetWorkloadContainerPercentilesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 88: api.v1.GetWorkloadContainerPercentilesRequest.end_time:type_name -> google.protobuf.Timestamp + 187, // 89: api.v1.GetWorkloadContainerPercentilesResponse.containers:type_name -> api.v1.ContainerPercentileSummary + 171, // 90: api.v1.GetWorkloadContainerTimeSeriesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 91: api.v1.GetWorkloadContainerTimeSeriesRequest.end_time:type_name -> google.protobuf.Timestamp + 188, // 92: api.v1.GetWorkloadContainerTimeSeriesResponse.containers:type_name -> api.v1.ContainerTimeSeries + 189, // 93: api.v1.GetLatestContainerRequestLimitsResponse.containers:type_name -> api.v1.ContainerRequestLimits + 190, // 94: api.v1.GetNodeGPUMigInstancesResponse.instances:type_name -> api.v1.GPUMigInstance + 171, // 95: api.v1.GetNodeGPUMigInstancesResponse.collected_at:type_name -> google.protobuf.Timestamp + 171, // 96: api.v1.GetNodeGPUMigInstanceTimeseriesRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 97: api.v1.GetNodeGPUMigInstanceTimeseriesRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 98: api.v1.GPUMigInstanceDataPoint.timestamp:type_name -> google.protobuf.Timestamp + 56, // 99: api.v1.GPUMigInstanceTimeseries.points:type_name -> api.v1.GPUMigInstanceDataPoint + 57, // 100: api.v1.GetNodeGPUMigInstanceTimeseriesResponse.instances:type_name -> api.v1.GPUMigInstanceTimeseries + 191, // 101: api.v1.GetContainerIndividualGPUMetricsResponse.containers:type_name -> api.v1.ContainerIndividualGPUMetrics + 61, // 102: api.v1.GetWorkloadLanguagesResponse.languages:type_name -> api.v1.LanguageVersions + 171, // 103: api.v1.GetForecastWorkloadsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 104: api.v1.GetForecastWorkloadsRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 105: api.v1.GetForecastWorkloadsResponse.workload_items:type_name -> api.v1.WorkloadItem + 181, // 106: api.v1.GetForecastWorkloadsResponse.cost_info:type_name -> api.v1.CostInfo + 192, // 107: api.v1.GetForecastWorkloadsResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics + 186, // 108: api.v1.GetForecastWorkloadsResponse.resource_summary:type_name -> api.v1.ResourceSummary + 171, // 109: api.v1.GetForecastWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 110: api.v1.GetForecastWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 173, // 111: api.v1.GetForecastWorkloadResponse.workload_item:type_name -> api.v1.WorkloadItem + 181, // 112: api.v1.GetForecastWorkloadResponse.cost_info:type_name -> api.v1.CostInfo + 192, // 113: api.v1.GetForecastWorkloadResponse.resource_metrics:type_name -> api.v1.ForecastResourceMetrics + 186, // 114: api.v1.GetForecastWorkloadResponse.resource_summary:type_name -> api.v1.ResourceSummary + 183, // 115: api.v1.GetForecastWorkloadResponse.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 116: api.v1.GetForecastWorkloadResponse.resource_data_points:type_name -> api.v1.ResourceDataPoint + 83, // 117: api.v1.GetClusterMetadataResponse.clusters:type_name -> api.v1.Cluster + 69, // 118: api.v1.GetAllNamespacesResponse.cluster_id_with_namespaces:type_name -> api.v1.ClusterElement + 76, // 119: api.v1.ListNamespacesByClusterResponse.namespaces:type_name -> api.v1.NamespaceItem + 174, // 120: api.v1.GetAllWorkloadNamesRequest.kinds:type_name -> api.v1.K8sObjectKind + 69, // 121: api.v1.GetAllWorkloadNamesResponse.cluster_id_with_workload_name:type_name -> api.v1.ClusterElement + 174, // 122: api.v1.GetAllWorkloadLabelsRequest.kinds:type_name -> api.v1.K8sObjectKind + 69, // 123: api.v1.GetAllWorkloadLabelsResponse.cluster_id_with_labels:type_name -> api.v1.ClusterElement + 69, // 124: api.v1.GetAllNodeGroupNamesResponse.cluster_id_with_node_group_names:type_name -> api.v1.ClusterElement + 180, // 125: api.v1.Cluster.resource_metrics:type_name -> api.v1.ResourceMetrics + 181, // 126: api.v1.Cluster.cost_info:type_name -> api.v1.CostInfo + 182, // 127: api.v1.Cluster.node_info:type_name -> api.v1.NodeInfo + 183, // 128: api.v1.Cluster.cost_data_points:type_name -> api.v1.CostDataPoint + 184, // 129: api.v1.Cluster.resource_data_points:type_name -> api.v1.ResourceDataPoint + 185, // 130: api.v1.Cluster.most_expensive_node:type_name -> api.v1.Node + 185, // 131: api.v1.Cluster.least_expensive_node:type_name -> api.v1.Node + 185, // 132: api.v1.Cluster.most_underutilized_node:type_name -> api.v1.Node + 85, // 133: api.v1.Cluster.most_underutilized_container:type_name -> api.v1.Container + 84, // 134: api.v1.Cluster.zxp_info:type_name -> api.v1.OperatorInfo + 84, // 135: api.v1.Cluster.zxp_helm_info:type_name -> api.v1.OperatorInfo + 84, // 136: api.v1.Cluster.dakr_op_info:type_name -> api.v1.OperatorInfo + 84, // 137: api.v1.Cluster.node_op_info:type_name -> api.v1.OperatorInfo + 84, // 138: api.v1.Cluster.security_op_info:type_name -> api.v1.OperatorInfo + 84, // 139: api.v1.Cluster.network_op_info:type_name -> api.v1.OperatorInfo + 180, // 140: api.v1.Container.resource_metrics:type_name -> api.v1.ResourceMetrics + 84, // 141: api.v1.GetLatestOperatorVersionResponse.zxp_info:type_name -> api.v1.OperatorInfo + 84, // 142: api.v1.GetLatestOperatorVersionResponse.zxp_helm_info:type_name -> api.v1.OperatorInfo + 84, // 143: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_info:type_name -> api.v1.OperatorInfo + 84, // 144: api.v1.GetLatestOperatorVersionResponse.zxp_netmon_helm_info:type_name -> api.v1.OperatorInfo + 84, // 145: api.v1.GetLatestOperatorVersionResponse.dakr_op_info:type_name -> api.v1.OperatorInfo + 84, // 146: api.v1.GetLatestOperatorVersionResponse.dakr_op_helm_info:type_name -> api.v1.OperatorInfo + 84, // 147: api.v1.GetLatestOperatorVersionResponse.node_op_info_aws:type_name -> api.v1.OperatorInfo + 84, // 148: api.v1.GetLatestOperatorVersionResponse.node_op_info_azure:type_name -> api.v1.OperatorInfo + 84, // 149: api.v1.GetLatestOperatorVersionResponse.node_op_info_gcp:type_name -> api.v1.OperatorInfo + 84, // 150: api.v1.GetLatestOperatorVersionResponse.node_op_info_oci:type_name -> api.v1.OperatorInfo + 84, // 151: api.v1.GetLatestOperatorVersionResponse.security_op_info:type_name -> api.v1.OperatorInfo + 84, // 152: api.v1.GetLatestOperatorVersionResponse.security_op_helm_info:type_name -> api.v1.OperatorInfo + 84, // 153: api.v1.GetLatestOperatorVersionResponse.trezr_info:type_name -> api.v1.OperatorInfo + 84, // 154: api.v1.GetLatestOperatorVersionResponse.trezr_helm_info:type_name -> api.v1.OperatorInfo + 84, // 155: api.v1.GetLatestOperatorVersionResponse.snapshot_helm_info:type_name -> api.v1.OperatorInfo + 1, // 156: api.v1.GalaxyGetWorkloadPerspectiveRequest.group_by:type_name -> api.v1.GalaxyPOVWorkloadGroupBy + 91, // 157: api.v1.GalaxyGetWorkloadPerspectiveRequest.datapoint_opts:type_name -> api.v1.PerspectiveDatapointOpts + 90, // 158: api.v1.GalaxyGetWorkloadPerspectiveResponse.groupings:type_name -> api.v1.GalaxyWorkloadGroup + 151, // 159: api.v1.GalaxyGetWorkloadPerspectiveResponse.clusters:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry + 152, // 160: api.v1.GalaxyGetWorkloadPerspectiveResponse.workloads:type_name -> api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry + 181, // 161: api.v1.GalaxyWorkloadGroup.cost_info:type_name -> api.v1.CostInfo + 180, // 162: api.v1.GalaxyWorkloadGroup.resource_metrics:type_name -> api.v1.ResourceMetrics + 186, // 163: api.v1.GalaxyWorkloadGroup.resource_summary:type_name -> api.v1.ResourceSummary + 174, // 164: api.v1.ListAuditLogsRequest.workload_type:type_name -> api.v1.K8sObjectKind + 171, // 165: api.v1.ListAuditLogsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 166: api.v1.ListAuditLogsRequest.end_time:type_name -> google.protobuf.Timestamp + 175, // 167: api.v1.ListAuditLogsRequest.pagination:type_name -> api.v1.Pagination + 193, // 168: api.v1.ListAuditLogsResponse.logs:type_name -> api.v1.AuditLogEntry + 175, // 169: api.v1.ListAuditLogsResponse.pagination:type_name -> api.v1.Pagination + 174, // 170: api.v1.ListAuditLogOriginatorsRequest.workload_type:type_name -> api.v1.K8sObjectKind + 171, // 171: api.v1.ListAuditLogOriginatorsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 172: api.v1.ListAuditLogOriginatorsRequest.end_time:type_name -> google.protobuf.Timestamp + 99, // 173: api.v1.SendWeeklySummaryEmailRequest.request:type_name -> api.v1.SendWeeklySummaryEmailRequestData + 171, // 174: api.v1.GetClustersNodeInfoRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 175: api.v1.GetClustersNodeInfoRequest.end_time:type_name -> google.protobuf.Timestamp + 182, // 176: api.v1.GetClustersNodeInfoResponse.node_info:type_name -> api.v1.NodeInfo + 185, // 177: api.v1.GetClustersNodeInfoResponse.most_expensive_node:type_name -> api.v1.Node + 185, // 178: api.v1.GetClustersNodeInfoResponse.least_expensive_node:type_name -> api.v1.Node + 185, // 179: api.v1.GetClustersNodeInfoResponse.most_underutilized_node:type_name -> api.v1.Node + 105, // 180: api.v1.SearchK8sResourcesResponse.results:type_name -> api.v1.K8sSearchResult + 108, // 181: api.v1.SearchK8sWorkloadsResponse.results:type_name -> api.v1.K8sWorkloadSearchResult + 153, // 182: api.v1.MetadataForWorkloadsRequest.workload_uid_to_kind:type_name -> api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry + 154, // 183: api.v1.MetadataForWorkloadsResponse.workload_uid_to_metadata:type_name -> api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry + 83, // 184: api.v1.AddClusterTagsResponse.cluster:type_name -> api.v1.Cluster + 83, // 185: api.v1.RemoveClusterTagsResponse.cluster:type_name -> api.v1.Cluster + 116, // 186: api.v1.ListTagsResponse.tags:type_name -> api.v1.TagSummary + 155, // 187: api.v1.WorkloadMetadata.pod_uid_to_node_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry + 156, // 188: api.v1.WorkloadMetadata.pod_uid_to_pod_metadata:type_name -> api.v1.WorkloadMetadata.PodUidToPodMetadataEntry + 174, // 189: api.v1.WorkloadMetadata.kind:type_name -> api.v1.K8sObjectKind + 174, // 190: api.v1.GetRelatedResourcesRequest.kind:type_name -> api.v1.K8sObjectKind + 124, // 191: api.v1.GetWorkloadPodHistoryResponse.replica_sets:type_name -> api.v1.ReplicaSetHistory + 125, // 192: api.v1.GetWorkloadPodHistoryResponse.direct_pods:type_name -> api.v1.PodHistory + 123, // 193: api.v1.GetWorkloadPodHistoryResponse.jobs:type_name -> api.v1.JobHistory + 171, // 194: api.v1.JobHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 195: api.v1.JobHistory.deleted_at:type_name -> google.protobuf.Timestamp + 125, // 196: api.v1.JobHistory.pods:type_name -> api.v1.PodHistory + 171, // 197: api.v1.ReplicaSetHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 198: api.v1.ReplicaSetHistory.deleted_at:type_name -> google.protobuf.Timestamp + 125, // 199: api.v1.ReplicaSetHistory.pods:type_name -> api.v1.PodHistory + 171, // 200: api.v1.PodHistory.created_at:type_name -> google.protobuf.Timestamp + 171, // 201: api.v1.PodHistory.deleted_at:type_name -> google.protobuf.Timestamp + 127, // 202: api.v1.GetRelatedResourcesResponse.relations:type_name -> api.v1.K8sRelatedResource + 128, // 203: api.v1.GetRelatedResourcesResponse.nodes:type_name -> api.v1.K8sResourceNode + 129, // 204: api.v1.GetRelatedResourcesResponse.edges:type_name -> api.v1.K8sResourceEdge + 2, // 205: api.v1.GetClusterTypeResponse.cluster_type:type_name -> api.v1.ClusterType + 171, // 206: api.v1.GetMigPartedConfigResponse.last_seen:type_name -> google.protobuf.Timestamp + 171, // 207: api.v1.GetWorkloadsStatsRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 208: api.v1.GetWorkloadsStatsRequest.end_time:type_name -> google.protobuf.Timestamp + 171, // 209: api.v1.DailyUtilizationRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 210: api.v1.DailyUtilizationRequest.end_time:type_name -> google.protobuf.Timestamp + 159, // 211: api.v1.DailyUtilizationResponse.cluster_id_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry + 160, // 212: api.v1.DailyUtilizationResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry + 171, // 213: api.v1.DailyUtilizationInstanceTypeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 214: api.v1.DailyUtilizationInstanceTypeRequest.end_time:type_name -> google.protobuf.Timestamp + 163, // 215: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry + 164, // 216: api.v1.DailyUtilizationInstanceTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry + 171, // 217: api.v1.DailyUtilizationNodeTypeRequest.start_time:type_name -> google.protobuf.Timestamp + 171, // 218: api.v1.DailyUtilizationNodeTypeRequest.end_time:type_name -> google.protobuf.Timestamp + 168, // 219: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry + 169, // 220: api.v1.DailyUtilizationNodeTypeResponse.cluster_id_to_meta:type_name -> api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry + 194, // 221: api.v1.LookupNodeInstanceResponse.dynamic_instance:type_name -> api.v1.Instance + 194, // 222: api.v1.LookupNodeInstanceResponse.cached_instance:type_name -> api.v1.Instance + 143, // 223: api.v1.LookupNodeInstanceResponse.lookup_params:type_name -> api.v1.InstanceLookupParams + 178, // 224: api.v1.GetAllNodeGroupsResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroup + 39, // 225: api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics.node_group_metrics:type_name -> api.v1.NodeGroupMetric + 146, // 226: api.v1.GetNodeGroupsUtilizationResponse.NodeGroupToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 227: api.v1.GetNodeGroupsUtilizationResponse.InstanceTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 228: api.v1.GetNodeGroupsUtilizationResponse.ReservationTypeToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 146, // 229: api.v1.GetNodeGroupsUtilizationResponse.LogicalAzToUtilMetricsEntry.value:type_name -> api.v1.GetNodeGroupsUtilizationResponse.ListNodeGroupMetrics + 83, // 230: api.v1.GalaxyGetWorkloadPerspectiveResponse.ClustersEntry.value:type_name -> api.v1.Cluster + 173, // 231: api.v1.GalaxyGetWorkloadPerspectiveResponse.WorkloadsEntry.value:type_name -> api.v1.WorkloadItem + 174, // 232: api.v1.MetadataForWorkloadsRequest.WorkloadUidToKindEntry.value:type_name -> api.v1.K8sObjectKind + 118, // 233: api.v1.MetadataForWorkloadsResponse.WorkloadUidToMetadataEntry.value:type_name -> api.v1.WorkloadMetadata + 120, // 234: api.v1.WorkloadMetadata.PodUidToNodeMetadataEntry.value:type_name -> api.v1.NodeMetadata + 119, // 235: api.v1.WorkloadMetadata.PodUidToPodMetadataEntry.value:type_name -> api.v1.PodMetadata + 158, // 236: api.v1.DailyUtilizationResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationResponse.Datapoint + 157, // 237: api.v1.DailyUtilizationResponse.ClusterIdToDailyTotalCoreMinutesEntry.value:type_name -> api.v1.DailyUtilizationResponse.Datapoints + 83, // 238: api.v1.DailyUtilizationResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 162, // 239: api.v1.DailyUtilizationInstanceTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint + 165, // 240: api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.instance_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoint.InstanceTypeToDailyTotalCoreMinutesEntry + 161, // 241: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationInstanceTypeResponse.Datapoints + 83, // 242: api.v1.DailyUtilizationInstanceTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 167, // 243: api.v1.DailyUtilizationNodeTypeResponse.Datapoints.datapoints:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint + 170, // 244: api.v1.DailyUtilizationNodeTypeResponse.Datapoint.node_type_to_daily_total_core_minutes:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoint.NodeTypeToDailyTotalCoreMinutesEntry + 166, // 245: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToDatapointsEntry.value:type_name -> api.v1.DailyUtilizationNodeTypeResponse.Datapoints + 83, // 246: api.v1.DailyUtilizationNodeTypeResponse.ClusterIdToMetaEntry.value:type_name -> api.v1.Cluster + 134, // 247: api.v1.K8SService.GetWorkloadsStats:input_type -> api.v1.GetWorkloadsStatsRequest + 18, // 248: api.v1.K8SService.GetClusters:input_type -> api.v1.GetClustersRequest + 19, // 249: api.v1.K8SService.ListClusters:input_type -> api.v1.ListClustersRequest + 20, // 250: api.v1.K8SService.GetCluster:input_type -> api.v1.GetClusterRequest + 5, // 251: api.v1.K8SService.GetClusterMetadata:input_type -> api.v1.GetClusterMetadataRequest + 70, // 252: api.v1.K8SService.GetAllNamespaces:input_type -> api.v1.GetAllNamespacesRequest + 72, // 253: api.v1.K8SService.SearchNamespacesByCluster:input_type -> api.v1.SearchNamespacesByClusterRequest + 74, // 254: api.v1.K8SService.ListNamespacesByCluster:input_type -> api.v1.ListNamespacesByClusterRequest + 77, // 255: api.v1.K8SService.GetAllWorkloadNames:input_type -> api.v1.GetAllWorkloadNamesRequest + 79, // 256: api.v1.K8SService.GetAllWorkloadLabels:input_type -> api.v1.GetAllWorkloadLabelsRequest + 81, // 257: api.v1.K8SService.GetAllNodeGroupNames:input_type -> api.v1.GetAllNodeGroupNamesRequest + 109, // 258: api.v1.K8SService.MetadataForWorkloads:input_type -> api.v1.MetadataForWorkloadsRequest + 32, // 259: api.v1.K8SService.GetNodeGroups:input_type -> api.v1.GetNodeGroupsRequest + 33, // 260: api.v1.K8SService.GetAllNodeGroups:input_type -> api.v1.GetAllNodeGroupsRequest + 37, // 261: api.v1.K8SService.GetNodeGroupsUtilization:input_type -> api.v1.GetNodeGroupsUtilizationRequest + 6, // 262: api.v1.K8SService.GetNodeGroup:input_type -> api.v1.GetNodeGroupRequest + 3, // 263: api.v1.K8SService.GetNode:input_type -> api.v1.GetNodeRequest + 7, // 264: api.v1.K8SService.GetWorkloads:input_type -> api.v1.GetWorkloadsRequest + 8, // 265: api.v1.K8SService.ListWorkloadsPaginated:input_type -> api.v1.ListWorkloadsPaginatedRequest + 9, // 266: api.v1.K8SService.GetWorkloadsSummary:input_type -> api.v1.GetWorkloadsSummaryRequest + 17, // 267: api.v1.K8SService.GetWorkload:input_type -> api.v1.GetWorkloadRequest + 47, // 268: api.v1.K8SService.GetWorkloadContainerPercentiles:input_type -> api.v1.GetWorkloadContainerPercentilesRequest + 49, // 269: api.v1.K8SService.GetWorkloadContainerTimeSeries:input_type -> api.v1.GetWorkloadContainerTimeSeriesRequest + 51, // 270: api.v1.K8SService.GetLatestContainerRequestLimits:input_type -> api.v1.GetLatestContainerRequestLimitsRequest + 53, // 271: api.v1.K8SService.GetNodeGPUMigInstances:input_type -> api.v1.GetNodeGPUMigInstancesRequest + 55, // 272: api.v1.K8SService.GetNodeGPUMigInstanceTimeseries:input_type -> api.v1.GetNodeGPUMigInstanceTimeseriesRequest + 59, // 273: api.v1.K8SService.GetContainerIndividualGPUMetrics:input_type -> api.v1.GetContainerIndividualGPUMetricsRequest + 62, // 274: api.v1.K8SService.GetWorkloadLanguages:input_type -> api.v1.GetWorkloadLanguagesRequest + 64, // 275: api.v1.K8SService.GetForecastWorkloads:input_type -> api.v1.GetForecastWorkloadsRequest + 66, // 276: api.v1.K8SService.GetForecastWorkload:input_type -> api.v1.GetForecastWorkloadRequest + 14, // 277: api.v1.K8SService.GetResources:input_type -> api.v1.GetResourcesRequest + 26, // 278: api.v1.K8SService.GetResourceFilterOptions:input_type -> api.v1.GetResourceFilterOptionsRequest + 15, // 279: api.v1.K8SService.GetPods:input_type -> api.v1.GetPodsRequest + 86, // 280: api.v1.K8SService.GetLatestOperatorVersion:input_type -> api.v1.GetLatestOperatorVersionRequest + 88, // 281: api.v1.K8SService.GalaxyGetWorkloadPerspective:input_type -> api.v1.GalaxyGetWorkloadPerspectiveRequest + 92, // 282: api.v1.K8SService.ListAuditLogs:input_type -> api.v1.ListAuditLogsRequest + 94, // 283: api.v1.K8SService.ListAuditLogOriginators:input_type -> api.v1.ListAuditLogOriginatorsRequest + 96, // 284: api.v1.K8SService.SendWorkloadEmail:input_type -> api.v1.SendWorkloadEmailRequest + 98, // 285: api.v1.K8SService.SendWeeklySummaryEmail:input_type -> api.v1.SendWeeklySummaryEmailRequest + 101, // 286: api.v1.K8SService.GetClustersNodeInfo:input_type -> api.v1.GetClustersNodeInfoRequest + 103, // 287: api.v1.K8SService.SearchK8sResources:input_type -> api.v1.SearchK8sResourcesRequest + 106, // 288: api.v1.K8SService.SearchK8sWorkloads:input_type -> api.v1.SearchK8sWorkloadsRequest + 130, // 289: api.v1.K8SService.GetClusterType:input_type -> api.v1.GetClusterTypeRequest + 121, // 290: api.v1.K8SService.GetRelationsForKind:input_type -> api.v1.GetRelatedResourcesRequest + 142, // 291: api.v1.K8SService.LookupNodeInstance:input_type -> api.v1.LookupNodeInstanceRequest + 4, // 292: api.v1.K8SService.GetWorkloadPodHistory:input_type -> api.v1.GetWorkloadPodHistoryRequest + 111, // 293: api.v1.K8SService.AddClusterTags:input_type -> api.v1.AddClusterTagsRequest + 113, // 294: api.v1.K8SService.RemoveClusterTags:input_type -> api.v1.RemoveClusterTagsRequest + 115, // 295: api.v1.K8SService.ListTags:input_type -> api.v1.ListTagsRequest + 132, // 296: api.v1.K8SService.GetMigPartedConfig:input_type -> api.v1.GetMigPartedConfigRequest + 28, // 297: api.v1.ClusterMutationService.CreateCluster:input_type -> api.v1.CreateClusterRequest + 21, // 298: api.v1.ClusterMutationService.DeleteCluster:input_type -> api.v1.DeleteClusterRequest + 23, // 299: api.v1.ClusterMutationService.UpdateCluster:input_type -> api.v1.UpdateClusterRequest + 30, // 300: api.v1.ClusterMutationService.ResetClusterToken:input_type -> api.v1.ResetClusterTokenRequest + 136, // 301: api.v1.UtilizationService.DailyUtilization:input_type -> api.v1.DailyUtilizationRequest + 138, // 302: api.v1.UtilizationService.DailyUtilizationInstanceType:input_type -> api.v1.DailyUtilizationInstanceTypeRequest + 140, // 303: api.v1.UtilizationService.DailyUtilizationNodeType:input_type -> api.v1.DailyUtilizationNodeTypeRequest + 135, // 304: api.v1.K8SService.GetWorkloadsStats:output_type -> api.v1.GetWorkloadsStatsResponse + 42, // 305: api.v1.K8SService.GetClusters:output_type -> api.v1.GetClustersResponse + 43, // 306: api.v1.K8SService.ListClusters:output_type -> api.v1.ListClustersResponse + 41, // 307: api.v1.K8SService.GetCluster:output_type -> api.v1.GetClusterResponse + 68, // 308: api.v1.K8SService.GetClusterMetadata:output_type -> api.v1.GetClusterMetadataResponse + 71, // 309: api.v1.K8SService.GetAllNamespaces:output_type -> api.v1.GetAllNamespacesResponse + 73, // 310: api.v1.K8SService.SearchNamespacesByCluster:output_type -> api.v1.SearchNamespacesByClusterResponse + 75, // 311: api.v1.K8SService.ListNamespacesByCluster:output_type -> api.v1.ListNamespacesByClusterResponse + 78, // 312: api.v1.K8SService.GetAllWorkloadNames:output_type -> api.v1.GetAllWorkloadNamesResponse + 80, // 313: api.v1.K8SService.GetAllWorkloadLabels:output_type -> api.v1.GetAllWorkloadLabelsResponse + 82, // 314: api.v1.K8SService.GetAllNodeGroupNames:output_type -> api.v1.GetAllNodeGroupNamesResponse + 110, // 315: api.v1.K8SService.MetadataForWorkloads:output_type -> api.v1.MetadataForWorkloadsResponse + 34, // 316: api.v1.K8SService.GetNodeGroups:output_type -> api.v1.GetNodeGroupsResponse + 35, // 317: api.v1.K8SService.GetAllNodeGroups:output_type -> api.v1.GetAllNodeGroupsResponse + 38, // 318: api.v1.K8SService.GetNodeGroupsUtilization:output_type -> api.v1.GetNodeGroupsUtilizationResponse + 40, // 319: api.v1.K8SService.GetNodeGroup:output_type -> api.v1.GetNodeGroupResponse + 44, // 320: api.v1.K8SService.GetNode:output_type -> api.v1.GetNodeResponse + 45, // 321: api.v1.K8SService.GetWorkloads:output_type -> api.v1.GetWorkloadsResponse + 13, // 322: api.v1.K8SService.ListWorkloadsPaginated:output_type -> api.v1.ListWorkloadsPaginatedResponse + 12, // 323: api.v1.K8SService.GetWorkloadsSummary:output_type -> api.v1.GetWorkloadsSummaryResponse + 46, // 324: api.v1.K8SService.GetWorkload:output_type -> api.v1.GetWorkloadResponse + 48, // 325: api.v1.K8SService.GetWorkloadContainerPercentiles:output_type -> api.v1.GetWorkloadContainerPercentilesResponse + 50, // 326: api.v1.K8SService.GetWorkloadContainerTimeSeries:output_type -> api.v1.GetWorkloadContainerTimeSeriesResponse + 52, // 327: api.v1.K8SService.GetLatestContainerRequestLimits:output_type -> api.v1.GetLatestContainerRequestLimitsResponse + 54, // 328: api.v1.K8SService.GetNodeGPUMigInstances:output_type -> api.v1.GetNodeGPUMigInstancesResponse + 58, // 329: api.v1.K8SService.GetNodeGPUMigInstanceTimeseries:output_type -> api.v1.GetNodeGPUMigInstanceTimeseriesResponse + 60, // 330: api.v1.K8SService.GetContainerIndividualGPUMetrics:output_type -> api.v1.GetContainerIndividualGPUMetricsResponse + 63, // 331: api.v1.K8SService.GetWorkloadLanguages:output_type -> api.v1.GetWorkloadLanguagesResponse + 65, // 332: api.v1.K8SService.GetForecastWorkloads:output_type -> api.v1.GetForecastWorkloadsResponse + 67, // 333: api.v1.K8SService.GetForecastWorkload:output_type -> api.v1.GetForecastWorkloadResponse + 25, // 334: api.v1.K8SService.GetResources:output_type -> api.v1.GetResourcesResponse + 27, // 335: api.v1.K8SService.GetResourceFilterOptions:output_type -> api.v1.GetResourceFilterOptionsResponse + 16, // 336: api.v1.K8SService.GetPods:output_type -> api.v1.GetPodsResponse + 87, // 337: api.v1.K8SService.GetLatestOperatorVersion:output_type -> api.v1.GetLatestOperatorVersionResponse + 89, // 338: api.v1.K8SService.GalaxyGetWorkloadPerspective:output_type -> api.v1.GalaxyGetWorkloadPerspectiveResponse + 93, // 339: api.v1.K8SService.ListAuditLogs:output_type -> api.v1.ListAuditLogsResponse + 95, // 340: api.v1.K8SService.ListAuditLogOriginators:output_type -> api.v1.ListAuditLogOriginatorsResponse + 97, // 341: api.v1.K8SService.SendWorkloadEmail:output_type -> api.v1.SendWorkloadEmailResponse + 100, // 342: api.v1.K8SService.SendWeeklySummaryEmail:output_type -> api.v1.SendWeeklySummaryEmailResponse + 102, // 343: api.v1.K8SService.GetClustersNodeInfo:output_type -> api.v1.GetClustersNodeInfoResponse + 104, // 344: api.v1.K8SService.SearchK8sResources:output_type -> api.v1.SearchK8sResourcesResponse + 107, // 345: api.v1.K8SService.SearchK8sWorkloads:output_type -> api.v1.SearchK8sWorkloadsResponse + 131, // 346: api.v1.K8SService.GetClusterType:output_type -> api.v1.GetClusterTypeResponse + 126, // 347: api.v1.K8SService.GetRelationsForKind:output_type -> api.v1.GetRelatedResourcesResponse + 144, // 348: api.v1.K8SService.LookupNodeInstance:output_type -> api.v1.LookupNodeInstanceResponse + 122, // 349: api.v1.K8SService.GetWorkloadPodHistory:output_type -> api.v1.GetWorkloadPodHistoryResponse + 112, // 350: api.v1.K8SService.AddClusterTags:output_type -> api.v1.AddClusterTagsResponse + 114, // 351: api.v1.K8SService.RemoveClusterTags:output_type -> api.v1.RemoveClusterTagsResponse + 117, // 352: api.v1.K8SService.ListTags:output_type -> api.v1.ListTagsResponse + 133, // 353: api.v1.K8SService.GetMigPartedConfig:output_type -> api.v1.GetMigPartedConfigResponse + 29, // 354: api.v1.ClusterMutationService.CreateCluster:output_type -> api.v1.CreateClusterResponse + 22, // 355: api.v1.ClusterMutationService.DeleteCluster:output_type -> api.v1.DeleteClusterResponse + 24, // 356: api.v1.ClusterMutationService.UpdateCluster:output_type -> api.v1.UpdateClusterResponse + 31, // 357: api.v1.ClusterMutationService.ResetClusterToken:output_type -> api.v1.ResetClusterTokenResponse + 137, // 358: api.v1.UtilizationService.DailyUtilization:output_type -> api.v1.DailyUtilizationResponse + 139, // 359: api.v1.UtilizationService.DailyUtilizationInstanceType:output_type -> api.v1.DailyUtilizationInstanceTypeResponse + 141, // 360: api.v1.UtilizationService.DailyUtilizationNodeType:output_type -> api.v1.DailyUtilizationNodeTypeResponse + 304, // [304:361] is the sub-list for method output_type + 247, // [247:304] is the sub-list for method input_type + 247, // [247:247] is the sub-list for extension type_name + 247, // [247:247] is the sub-list for extension extendee + 0, // [0:247] is the sub-list for field type_name } func init() { file_api_v1_k8s_proto_init() } @@ -12186,7 +14268,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResourcesRequest); i { + switch v := v.(*ListWorkloadsPaginatedRequest); i { case 0: return &v.state case 1: @@ -12198,7 +14280,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPodsRequest); i { + switch v := v.(*GetWorkloadsSummaryRequest); i { case 0: return &v.state case 1: @@ -12210,7 +14292,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPodsResponse); i { + switch v := v.(*WorkloadMetricEntry); i { case 0: return &v.state case 1: @@ -12222,7 +14304,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRequest); i { + switch v := v.(*WorkloadMetricBreakdown); i { case 0: return &v.state case 1: @@ -12234,7 +14316,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClustersRequest); i { + switch v := v.(*GetWorkloadsSummaryResponse); i { case 0: return &v.state case 1: @@ -12246,7 +14328,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClustersRequest); i { + switch v := v.(*ListWorkloadsPaginatedResponse); i { case 0: return &v.state case 1: @@ -12258,7 +14340,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRequest); i { + switch v := v.(*GetResourcesRequest); i { case 0: return &v.state case 1: @@ -12270,7 +14352,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRequest); i { + switch v := v.(*GetPodsRequest); i { case 0: return &v.state case 1: @@ -12282,7 +14364,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterResponse); i { + switch v := v.(*GetPodsResponse); i { case 0: return &v.state case 1: @@ -12294,7 +14376,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRequest); i { + switch v := v.(*GetWorkloadRequest); i { case 0: return &v.state case 1: @@ -12306,7 +14388,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterResponse); i { + switch v := v.(*GetClustersRequest); i { case 0: return &v.state case 1: @@ -12318,7 +14400,7 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResourcesResponse); i { + switch v := v.(*ListClustersRequest); i { case 0: return &v.state case 1: @@ -12330,6 +14412,102 @@ func file_api_v1_k8s_proto_init() { } } file_api_v1_k8s_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourcesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourceFilterOptionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetResourceFilterOptionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateClusterRequest); i { case 0: return &v.state @@ -12341,8 +14519,140 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterResponse); i { + file_api_v1_k8s_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetClusterTokenRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetClusterTokenResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAllNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAllNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupSet); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsUtilizationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsUtilizationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupResponse); i { case 0: return &v.state case 1: @@ -12353,8 +14663,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetClusterTokenRequest); i { + file_api_v1_k8s_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterResponse); i { case 0: return &v.state case 1: @@ -12365,8 +14675,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetClusterTokenResponse); i { + file_api_v1_k8s_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClustersResponse); i { case 0: return &v.state case 1: @@ -12377,8 +14687,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsRequest); i { + file_api_v1_k8s_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClustersResponse); i { case 0: return &v.state case 1: @@ -12389,8 +14699,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllNodeGroupsRequest); i { + file_api_v1_k8s_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeResponse); i { case 0: return &v.state case 1: @@ -12401,8 +14711,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsResponse); i { + file_api_v1_k8s_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsResponse); i { case 0: return &v.state case 1: @@ -12413,8 +14723,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAllNodeGroupsResponse); i { + file_api_v1_k8s_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadResponse); i { case 0: return &v.state case 1: @@ -12425,8 +14735,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupSet); i { + file_api_v1_k8s_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerPercentilesRequest); i { case 0: return &v.state case 1: @@ -12437,8 +14747,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsUtilizationRequest); i { + file_api_v1_k8s_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerPercentilesResponse); i { case 0: return &v.state case 1: @@ -12449,8 +14759,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsUtilizationResponse); i { + file_api_v1_k8s_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerTimeSeriesRequest); i { case 0: return &v.state case 1: @@ -12461,8 +14771,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupMetric); i { + file_api_v1_k8s_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerTimeSeriesResponse); i { case 0: return &v.state case 1: @@ -12473,8 +14783,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupResponse); i { + file_api_v1_k8s_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestContainerRequestLimitsRequest); i { case 0: return &v.state case 1: @@ -12485,8 +14795,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterResponse); i { + file_api_v1_k8s_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestContainerRequestLimitsResponse); i { case 0: return &v.state case 1: @@ -12497,8 +14807,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClustersResponse); i { + file_api_v1_k8s_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstancesRequest); i { case 0: return &v.state case 1: @@ -12509,8 +14819,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClustersResponse); i { + file_api_v1_k8s_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstancesResponse); i { case 0: return &v.state case 1: @@ -12521,8 +14831,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeResponse); i { + file_api_v1_k8s_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstanceTimeseriesRequest); i { case 0: return &v.state case 1: @@ -12533,8 +14843,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsResponse); i { + file_api_v1_k8s_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GPUMigInstanceDataPoint); i { case 0: return &v.state case 1: @@ -12545,8 +14855,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadResponse); i { + file_api_v1_k8s_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GPUMigInstanceTimeseries); i { case 0: return &v.state case 1: @@ -12557,8 +14867,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerPercentilesRequest); i { + file_api_v1_k8s_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGPUMigInstanceTimeseriesResponse); i { case 0: return &v.state case 1: @@ -12569,8 +14879,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerPercentilesResponse); i { + file_api_v1_k8s_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetContainerIndividualGPUMetricsRequest); i { case 0: return &v.state case 1: @@ -12581,8 +14891,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerTimeSeriesRequest); i { + file_api_v1_k8s_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetContainerIndividualGPUMetricsResponse); i { case 0: return &v.state case 1: @@ -12593,8 +14903,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerTimeSeriesResponse); i { + file_api_v1_k8s_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LanguageVersions); i { case 0: return &v.state case 1: @@ -12605,8 +14915,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestContainerRequestLimitsRequest); i { + file_api_v1_k8s_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadLanguagesRequest); i { case 0: return &v.state case 1: @@ -12617,8 +14927,8 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestContainerRequestLimitsResponse); i { + file_api_v1_k8s_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadLanguagesResponse); i { case 0: return &v.state case 1: @@ -12629,7 +14939,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadsRequest); i { case 0: return &v.state @@ -12641,7 +14951,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadsResponse); i { case 0: return &v.state @@ -12653,7 +14963,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadRequest); i { case 0: return &v.state @@ -12665,7 +14975,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetForecastWorkloadResponse); i { case 0: return &v.state @@ -12677,7 +14987,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterMetadataResponse); i { case 0: return &v.state @@ -12689,7 +14999,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClusterElement); i { case 0: return &v.state @@ -12701,7 +15011,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNamespacesRequest); i { case 0: return &v.state @@ -12713,7 +15023,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNamespacesResponse); i { case 0: return &v.state @@ -12725,7 +15035,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchNamespacesByClusterRequest); i { case 0: return &v.state @@ -12737,7 +15047,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchNamespacesByClusterResponse); i { case 0: return &v.state @@ -12749,7 +15059,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNamespacesByClusterRequest); i { case 0: return &v.state @@ -12761,7 +15071,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNamespacesByClusterResponse); i { case 0: return &v.state @@ -12773,7 +15083,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamespaceItem); i { case 0: return &v.state @@ -12785,7 +15095,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadNamesRequest); i { case 0: return &v.state @@ -12797,7 +15107,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadNamesResponse); i { case 0: return &v.state @@ -12809,7 +15119,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadLabelsRequest); i { case 0: return &v.state @@ -12821,7 +15131,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllWorkloadLabelsResponse); i { case 0: return &v.state @@ -12833,7 +15143,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNodeGroupNamesRequest); i { case 0: return &v.state @@ -12845,7 +15155,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAllNodeGroupNamesResponse); i { case 0: return &v.state @@ -12857,7 +15167,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Cluster); i { case 0: return &v.state @@ -12869,7 +15179,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OperatorInfo); i { case 0: return &v.state @@ -12881,7 +15191,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Container); i { case 0: return &v.state @@ -12893,7 +15203,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLatestOperatorVersionRequest); i { case 0: return &v.state @@ -12905,7 +15215,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLatestOperatorVersionResponse); i { case 0: return &v.state @@ -12917,7 +15227,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyGetWorkloadPerspectiveRequest); i { case 0: return &v.state @@ -12929,7 +15239,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyGetWorkloadPerspectiveResponse); i { case 0: return &v.state @@ -12941,7 +15251,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GalaxyWorkloadGroup); i { case 0: return &v.state @@ -12953,7 +15263,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PerspectiveDatapointOpts); i { case 0: return &v.state @@ -12965,7 +15275,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogsRequest); i { case 0: return &v.state @@ -12977,7 +15287,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogsResponse); i { case 0: return &v.state @@ -12989,7 +15299,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogOriginatorsRequest); i { case 0: return &v.state @@ -13001,7 +15311,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAuditLogOriginatorsResponse); i { case 0: return &v.state @@ -13013,7 +15323,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWorkloadEmailRequest); i { case 0: return &v.state @@ -13025,7 +15335,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWorkloadEmailResponse); i { case 0: return &v.state @@ -13037,7 +15347,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailRequest); i { case 0: return &v.state @@ -13049,7 +15359,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailRequestData); i { case 0: return &v.state @@ -13061,7 +15371,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendWeeklySummaryEmailResponse); i { case 0: return &v.state @@ -13073,7 +15383,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClustersNodeInfoRequest); i { case 0: return &v.state @@ -13085,7 +15395,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClustersNodeInfoResponse); i { case 0: return &v.state @@ -13097,7 +15407,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SResourcesRequest); i { case 0: return &v.state @@ -13109,7 +15419,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SResourcesResponse); i { case 0: return &v.state @@ -13121,7 +15431,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SSearchResult); i { case 0: return &v.state @@ -13133,7 +15443,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SWorkloadsRequest); i { case 0: return &v.state @@ -13145,7 +15455,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchK8SWorkloadsResponse); i { case 0: return &v.state @@ -13157,7 +15467,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SWorkloadSearchResult); i { case 0: return &v.state @@ -13169,7 +15479,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetadataForWorkloadsRequest); i { case 0: return &v.state @@ -13181,7 +15491,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetadataForWorkloadsResponse); i { case 0: return &v.state @@ -13193,7 +15503,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddClusterTagsRequest); i { case 0: return &v.state @@ -13205,7 +15515,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddClusterTagsResponse); i { case 0: return &v.state @@ -13217,7 +15527,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveClusterTagsRequest); i { case 0: return &v.state @@ -13229,7 +15539,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveClusterTagsResponse); i { case 0: return &v.state @@ -13241,7 +15551,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTagsRequest); i { case 0: return &v.state @@ -13253,7 +15563,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TagSummary); i { case 0: return &v.state @@ -13265,7 +15575,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTagsResponse); i { case 0: return &v.state @@ -13277,7 +15587,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkloadMetadata); i { case 0: return &v.state @@ -13289,7 +15599,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodMetadata); i { case 0: return &v.state @@ -13301,7 +15611,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeMetadata); i { case 0: return &v.state @@ -13313,7 +15623,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRelatedResourcesRequest); i { case 0: return &v.state @@ -13325,7 +15635,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadPodHistoryResponse); i { case 0: return &v.state @@ -13337,7 +15647,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobHistory); i { case 0: return &v.state @@ -13349,7 +15659,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicaSetHistory); i { case 0: return &v.state @@ -13361,7 +15671,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PodHistory); i { case 0: return &v.state @@ -13373,7 +15683,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRelatedResourcesResponse); i { case 0: return &v.state @@ -13385,7 +15695,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SRelatedResource); i { case 0: return &v.state @@ -13397,7 +15707,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SResourceNode); i { case 0: return &v.state @@ -13409,7 +15719,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*K8SResourceEdge); i { case 0: return &v.state @@ -13421,7 +15731,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterTypeRequest); i { case 0: return &v.state @@ -13433,7 +15743,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetClusterTypeResponse); i { case 0: return &v.state @@ -13445,7 +15755,31 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigPartedConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigPartedConfigResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_k8s_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadsStatsRequest); i { case 0: return &v.state @@ -13457,7 +15791,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkloadsStatsResponse); i { case 0: return &v.state @@ -13469,7 +15803,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationRequest); i { case 0: return &v.state @@ -13481,7 +15815,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse); i { case 0: return &v.state @@ -13493,7 +15827,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeRequest); i { case 0: return &v.state @@ -13505,7 +15839,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse); i { case 0: return &v.state @@ -13517,7 +15851,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeRequest); i { case 0: return &v.state @@ -13529,7 +15863,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse); i { case 0: return &v.state @@ -13541,7 +15875,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LookupNodeInstanceRequest); i { case 0: return &v.state @@ -13553,7 +15887,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InstanceLookupParams); i { case 0: return &v.state @@ -13565,7 +15899,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LookupNodeInstanceResponse); i { case 0: return &v.state @@ -13577,7 +15911,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNodeGroupsUtilizationResponse_ListNodeGroupMetrics); i { case 0: return &v.state @@ -13589,7 +15923,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse_Datapoints); i { case 0: return &v.state @@ -13601,7 +15935,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationResponse_Datapoint); i { case 0: return &v.state @@ -13613,7 +15947,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse_Datapoints); i { case 0: return &v.state @@ -13625,7 +15959,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationInstanceTypeResponse_Datapoint); i { case 0: return &v.state @@ -13637,7 +15971,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse_Datapoints); i { case 0: return &v.state @@ -13649,7 +15983,7 @@ func file_api_v1_k8s_proto_init() { return nil } } - file_api_v1_k8s_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_api_v1_k8s_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DailyUtilizationNodeTypeResponse_Datapoint); i { case 0: return &v.state @@ -13668,29 +16002,35 @@ func file_api_v1_k8s_proto_init() { file_api_v1_k8s_proto_msgTypes[4].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[5].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[6].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[8].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[10].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[21].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[26].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[36].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[38].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[42].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[12].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[14].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[16].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[17].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[23].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[29].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[34].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[44].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[46].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[50].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[51].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[52].OneofWrappers = []interface{}{} file_api_v1_k8s_proto_msgTypes[61].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[70].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[72].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[79].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[99].OneofWrappers = []interface{}{} - file_api_v1_k8s_proto_msgTypes[110].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[63].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[80].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[89].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[91].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[98].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[118].OneofWrappers = []interface{}{} + file_api_v1_k8s_proto_msgTypes[131].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_k8s_proto_rawDesc, NumEnums: 3, - NumMessages: 147, + NumMessages: 168, NumExtensions: 0, NumServices: 3, }, diff --git a/internal/gen/api/v1/profiling.pb.go b/internal/gen/api/v1/profiling.pb.go index 027b83b..01fcf07 100644 --- a/internal/gen/api/v1/profiling.pb.go +++ b/internal/gen/api/v1/profiling.pb.go @@ -7,6 +7,7 @@ package apiv1 import ( + 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" @@ -135,6 +136,10 @@ type GetWorkloadProfilesRequest struct { Workloads []*ProfilingWorkloadKey `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` StartTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` EndTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + // When set to 1D or 7D, serve from the persisted workload_profile_cache + // snapshot for that window instead of computing live over start_time/end_time. + // UNSPECIFIED (default) preserves today's live-compute behavior. + Window ProfileWindow `protobuf:"varint,13,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } func (x *GetWorkloadProfilesRequest) Reset() { @@ -204,6 +209,13 @@ func (x *GetWorkloadProfilesRequest) GetEndTime() *timestamppb.Timestamp { return nil } +func (x *GetWorkloadProfilesRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + type GetWorkloadProfilesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -251,6 +263,182 @@ func (x *GetWorkloadProfilesResponse) GetWorkloadProfiles() []*WorkloadProfileRe return nil } +type GetWorkloadProfileAvailabilityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *GetWorkloadProfileAvailabilityRequest) Reset() { + *x = GetWorkloadProfileAvailabilityRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadProfileAvailabilityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadProfileAvailabilityRequest) ProtoMessage() {} + +func (x *GetWorkloadProfileAvailabilityRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[3] + 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 GetWorkloadProfileAvailabilityRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadProfileAvailabilityRequest) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{3} +} + +func (x *GetWorkloadProfileAvailabilityRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadProfileAvailabilityRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ProfileWindowAvailability summarizes the cached-snapshot state for a single +// profile window. available reflects both presence (workload_count > 0) and +// freshness (latest_computed_at within the window's staleness threshold). +type ProfileWindowAvailability struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Available bool `protobuf:"varint,1,opt,name=available,proto3" json:"available,omitempty"` + LatestComputedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=latest_computed_at,json=latestComputedAt,proto3" json:"latest_computed_at,omitempty"` + WorkloadCount int32 `protobuf:"varint,3,opt,name=workload_count,json=workloadCount,proto3" json:"workload_count,omitempty"` +} + +func (x *ProfileWindowAvailability) Reset() { + *x = ProfileWindowAvailability{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProfileWindowAvailability) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProfileWindowAvailability) ProtoMessage() {} + +func (x *ProfileWindowAvailability) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[4] + 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 ProfileWindowAvailability.ProtoReflect.Descriptor instead. +func (*ProfileWindowAvailability) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{4} +} + +func (x *ProfileWindowAvailability) GetAvailable() bool { + if x != nil { + return x.Available + } + return false +} + +func (x *ProfileWindowAvailability) GetLatestComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.LatestComputedAt + } + return nil +} + +func (x *ProfileWindowAvailability) GetWorkloadCount() int32 { + if x != nil { + return x.WorkloadCount + } + return 0 +} + +type GetWorkloadProfileAvailabilityResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window_1D *ProfileWindowAvailability `protobuf:"bytes,1,opt,name=window_1d,json=window1d,proto3" json:"window_1d,omitempty"` + Window_7D *ProfileWindowAvailability `protobuf:"bytes,2,opt,name=window_7d,json=window7d,proto3" json:"window_7d,omitempty"` +} + +func (x *GetWorkloadProfileAvailabilityResponse) Reset() { + *x = GetWorkloadProfileAvailabilityResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadProfileAvailabilityResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadProfileAvailabilityResponse) ProtoMessage() {} + +func (x *GetWorkloadProfileAvailabilityResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[5] + 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 GetWorkloadProfileAvailabilityResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadProfileAvailabilityResponse) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{5} +} + +func (x *GetWorkloadProfileAvailabilityResponse) GetWindow_1D() *ProfileWindowAvailability { + if x != nil { + return x.Window_1D + } + return nil +} + +func (x *GetWorkloadProfileAvailabilityResponse) GetWindow_7D() *ProfileWindowAvailability { + if x != nil { + return x.Window_7D + } + return nil +} + type WorkloadProfileResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -262,12 +450,21 @@ type WorkloadProfileResult struct { Classification *ProfilingClassification `protobuf:"bytes,4,opt,name=classification,proto3" json:"classification,omitempty"` Confidence float64 `protobuf:"fixed64,5,opt,name=confidence,proto3" json:"confidence,omitempty"` DataQuality *ProfileDataQuality `protobuf:"bytes,6,opt,name=data_quality,json=dataQuality,proto3" json:"data_quality,omitempty"` + // The window over which this profile's distributions were computed. + WindowStart *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=window_start,json=windowStart,proto3" json:"window_start,omitempty"` + WindowEnd *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=window_end,json=windowEnd,proto3" json:"window_end,omitempty"` + // distribution_source identifies how the percentile distributions were + // derived. "exact_timeseries" = exact percentiles over the deduplicated + // busiest-pod-per-minute series (engine path); "sketch" = GK sketch + // aggregates (tail may collapse onto max — do not label as P99 on fleet + // screens). + DistributionSource string `protobuf:"bytes,9,opt,name=distribution_source,json=distributionSource,proto3" json:"distribution_source,omitempty"` } func (x *WorkloadProfileResult) Reset() { *x = WorkloadProfileResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[3] + mi := &file_api_v1_profiling_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -280,7 +477,7 @@ func (x *WorkloadProfileResult) String() string { func (*WorkloadProfileResult) ProtoMessage() {} func (x *WorkloadProfileResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[3] + mi := &file_api_v1_profiling_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -293,7 +490,7 @@ func (x *WorkloadProfileResult) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadProfileResult.ProtoReflect.Descriptor instead. func (*WorkloadProfileResult) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{3} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{6} } func (x *WorkloadProfileResult) GetKind() string { @@ -338,6 +535,27 @@ func (x *WorkloadProfileResult) GetDataQuality() *ProfileDataQuality { return nil } +func (x *WorkloadProfileResult) GetWindowStart() *timestamppb.Timestamp { + if x != nil { + return x.WindowStart + } + return nil +} + +func (x *WorkloadProfileResult) GetWindowEnd() *timestamppb.Timestamp { + if x != nil { + return x.WindowEnd + } + return nil +} + +func (x *WorkloadProfileResult) GetDistributionSource() string { + if x != nil { + return x.DistributionSource + } + return "" +} + type ContainerProfileResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -377,7 +595,7 @@ type ContainerProfileResult struct { func (x *ContainerProfileResult) Reset() { *x = ContainerProfileResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[4] + mi := &file_api_v1_profiling_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -390,7 +608,7 @@ func (x *ContainerProfileResult) String() string { func (*ContainerProfileResult) ProtoMessage() {} func (x *ContainerProfileResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[4] + mi := &file_api_v1_profiling_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -403,7 +621,7 @@ func (x *ContainerProfileResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerProfileResult.ProtoReflect.Descriptor instead. func (*ContainerProfileResult) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{4} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{7} } func (x *ContainerProfileResult) GetContainerName() string { @@ -568,7 +786,7 @@ type ProfilingBehavior struct { func (x *ProfilingBehavior) Reset() { *x = ProfilingBehavior{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[5] + mi := &file_api_v1_profiling_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -581,7 +799,7 @@ func (x *ProfilingBehavior) String() string { func (*ProfilingBehavior) ProtoMessage() {} func (x *ProfilingBehavior) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[5] + mi := &file_api_v1_profiling_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +812,7 @@ func (x *ProfilingBehavior) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingBehavior.ProtoReflect.Descriptor instead. func (*ProfilingBehavior) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{5} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{8} } func (x *ProfilingBehavior) GetCpuVolatility() string { @@ -657,7 +875,7 @@ type ProfilingSignalValues struct { func (x *ProfilingSignalValues) Reset() { *x = ProfilingSignalValues{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[6] + mi := &file_api_v1_profiling_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -670,7 +888,7 @@ func (x *ProfilingSignalValues) String() string { func (*ProfilingSignalValues) ProtoMessage() {} func (x *ProfilingSignalValues) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[6] + mi := &file_api_v1_profiling_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -683,7 +901,7 @@ func (x *ProfilingSignalValues) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingSignalValues.ProtoReflect.Descriptor instead. func (*ProfilingSignalValues) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{6} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{9} } func (x *ProfilingSignalValues) GetCvCpu() float64 { @@ -807,7 +1025,7 @@ type ProfilingAdjustmentEvidence struct { func (x *ProfilingAdjustmentEvidence) Reset() { *x = ProfilingAdjustmentEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[7] + mi := &file_api_v1_profiling_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -820,7 +1038,7 @@ func (x *ProfilingAdjustmentEvidence) String() string { func (*ProfilingAdjustmentEvidence) ProtoMessage() {} func (x *ProfilingAdjustmentEvidence) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[7] + mi := &file_api_v1_profiling_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -833,7 +1051,7 @@ func (x *ProfilingAdjustmentEvidence) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingAdjustmentEvidence.ProtoReflect.Descriptor instead. func (*ProfilingAdjustmentEvidence) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{7} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{10} } func (x *ProfilingAdjustmentEvidence) GetSelectedCpuPercentile() int32 { @@ -926,7 +1144,7 @@ type ProfilingAdjustment struct { func (x *ProfilingAdjustment) Reset() { *x = ProfilingAdjustment{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[8] + mi := &file_api_v1_profiling_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -939,7 +1157,7 @@ func (x *ProfilingAdjustment) String() string { func (*ProfilingAdjustment) ProtoMessage() {} func (x *ProfilingAdjustment) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[8] + mi := &file_api_v1_profiling_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -952,7 +1170,7 @@ func (x *ProfilingAdjustment) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingAdjustment.ProtoReflect.Descriptor instead. func (*ProfilingAdjustment) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{8} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{11} } func (x *ProfilingAdjustment) GetReason() string { @@ -985,7 +1203,7 @@ type ProfilingResourceRecommendation struct { func (x *ProfilingResourceRecommendation) Reset() { *x = ProfilingResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[9] + mi := &file_api_v1_profiling_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -998,7 +1216,7 @@ func (x *ProfilingResourceRecommendation) String() string { func (*ProfilingResourceRecommendation) ProtoMessage() {} func (x *ProfilingResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[9] + mi := &file_api_v1_profiling_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1011,7 +1229,7 @@ func (x *ProfilingResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingResourceRecommendation.ProtoReflect.Descriptor instead. func (*ProfilingResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{9} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{12} } func (x *ProfilingResourceRecommendation) GetCpuRequestMillicores() int64 { @@ -1062,7 +1280,7 @@ type ProfilingClassification struct { func (x *ProfilingClassification) Reset() { *x = ProfilingClassification{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[10] + mi := &file_api_v1_profiling_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1075,7 +1293,7 @@ func (x *ProfilingClassification) String() string { func (*ProfilingClassification) ProtoMessage() {} func (x *ProfilingClassification) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[10] + mi := &file_api_v1_profiling_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1088,7 +1306,7 @@ func (x *ProfilingClassification) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfilingClassification.ProtoReflect.Descriptor instead. func (*ProfilingClassification) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{10} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{13} } func (x *ProfilingClassification) GetDominantResource() string { @@ -1125,7 +1343,7 @@ type ProfileDataQuality struct { func (x *ProfileDataQuality) Reset() { *x = ProfileDataQuality{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[11] + mi := &file_api_v1_profiling_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1138,7 +1356,7 @@ func (x *ProfileDataQuality) String() string { func (*ProfileDataQuality) ProtoMessage() {} func (x *ProfileDataQuality) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[11] + mi := &file_api_v1_profiling_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1151,7 +1369,7 @@ func (x *ProfileDataQuality) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileDataQuality.ProtoReflect.Descriptor instead. func (*ProfileDataQuality) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{11} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{14} } func (x *ProfileDataQuality) GetTotalDataPoints() int32 { @@ -1189,7 +1407,7 @@ type ProfileKey struct { func (x *ProfileKey) Reset() { *x = ProfileKey{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[12] + mi := &file_api_v1_profiling_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1202,7 +1420,7 @@ func (x *ProfileKey) String() string { func (*ProfileKey) ProtoMessage() {} func (x *ProfileKey) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[12] + mi := &file_api_v1_profiling_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1215,7 +1433,7 @@ func (x *ProfileKey) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileKey.ProtoReflect.Descriptor instead. func (*ProfileKey) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{12} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{15} } func (x *ProfileKey) GetKind() string { @@ -1266,7 +1484,7 @@ type MetricPercentilesCompact struct { func (x *MetricPercentilesCompact) Reset() { *x = MetricPercentilesCompact{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[13] + mi := &file_api_v1_profiling_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1279,7 +1497,7 @@ func (x *MetricPercentilesCompact) String() string { func (*MetricPercentilesCompact) ProtoMessage() {} func (x *MetricPercentilesCompact) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[13] + mi := &file_api_v1_profiling_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1292,7 +1510,7 @@ func (x *MetricPercentilesCompact) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricPercentilesCompact.ProtoReflect.Descriptor instead. func (*MetricPercentilesCompact) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{13} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{16} } func (x *MetricPercentilesCompact) GetAvg() float64 { @@ -1384,12 +1602,28 @@ type ContainerProfileSnapshot struct { InsufficientData bool `protobuf:"varint,12,opt,name=insufficient_data,json=insufficientData,proto3" json:"insufficient_data,omitempty"` CurrentCpuRequestMillicores int64 `protobuf:"varint,13,opt,name=current_cpu_request_millicores,json=currentCpuRequestMillicores,proto3" json:"current_cpu_request_millicores,omitempty"` CurrentMemoryRequestBytes int64 `protobuf:"varint,14,opt,name=current_memory_request_bytes,json=currentMemoryRequestBytes,proto3" json:"current_memory_request_bytes,omitempty"` + // Container-level startup timing (scheduled -> Ready condition). + AvgTimeToReadyMs float64 `protobuf:"fixed64,15,opt,name=avg_time_to_ready_ms,json=avgTimeToReadyMs,proto3" json:"avg_time_to_ready_ms,omitempty"` + P50TimeToReadyMs float64 `protobuf:"fixed64,16,opt,name=p50_time_to_ready_ms,json=p50TimeToReadyMs,proto3" json:"p50_time_to_ready_ms,omitempty"` + P75TimeToReadyMs float64 `protobuf:"fixed64,17,opt,name=p75_time_to_ready_ms,json=p75TimeToReadyMs,proto3" json:"p75_time_to_ready_ms,omitempty"` + P95TimeToReadyMs float64 `protobuf:"fixed64,18,opt,name=p95_time_to_ready_ms,json=p95TimeToReadyMs,proto3" json:"p95_time_to_ready_ms,omitempty"` + P99TimeToReadyMs float64 `protobuf:"fixed64,19,opt,name=p99_time_to_ready_ms,json=p99TimeToReadyMs,proto3" json:"p99_time_to_ready_ms,omitempty"` + P999TimeToReadyMs float64 `protobuf:"fixed64,20,opt,name=p999_time_to_ready_ms,json=p999TimeToReadyMs,proto3" json:"p999_time_to_ready_ms,omitempty"` + MaxTimeToReadyMs float64 `protobuf:"fixed64,21,opt,name=max_time_to_ready_ms,json=maxTimeToReadyMs,proto3" json:"max_time_to_ready_ms,omitempty"` + // Container-level startup timing (container create -> Running state). + AvgTimeToRunningMs float64 `protobuf:"fixed64,22,opt,name=avg_time_to_running_ms,json=avgTimeToRunningMs,proto3" json:"avg_time_to_running_ms,omitempty"` + P50TimeToRunningMs float64 `protobuf:"fixed64,23,opt,name=p50_time_to_running_ms,json=p50TimeToRunningMs,proto3" json:"p50_time_to_running_ms,omitempty"` + P75TimeToRunningMs float64 `protobuf:"fixed64,24,opt,name=p75_time_to_running_ms,json=p75TimeToRunningMs,proto3" json:"p75_time_to_running_ms,omitempty"` + P95TimeToRunningMs float64 `protobuf:"fixed64,25,opt,name=p95_time_to_running_ms,json=p95TimeToRunningMs,proto3" json:"p95_time_to_running_ms,omitempty"` + P99TimeToRunningMs float64 `protobuf:"fixed64,26,opt,name=p99_time_to_running_ms,json=p99TimeToRunningMs,proto3" json:"p99_time_to_running_ms,omitempty"` + P999TimeToRunningMs float64 `protobuf:"fixed64,27,opt,name=p999_time_to_running_ms,json=p999TimeToRunningMs,proto3" json:"p999_time_to_running_ms,omitempty"` + MaxTimeToRunningMs float64 `protobuf:"fixed64,28,opt,name=max_time_to_running_ms,json=maxTimeToRunningMs,proto3" json:"max_time_to_running_ms,omitempty"` } func (x *ContainerProfileSnapshot) Reset() { *x = ContainerProfileSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[14] + mi := &file_api_v1_profiling_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1402,7 +1636,7 @@ func (x *ContainerProfileSnapshot) String() string { func (*ContainerProfileSnapshot) ProtoMessage() {} func (x *ContainerProfileSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[14] + mi := &file_api_v1_profiling_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1415,7 +1649,7 @@ func (x *ContainerProfileSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerProfileSnapshot.ProtoReflect.Descriptor instead. func (*ContainerProfileSnapshot) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{14} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{17} } func (x *ContainerProfileSnapshot) GetContainerName() string { @@ -1516,6 +1750,212 @@ func (x *ContainerProfileSnapshot) GetCurrentMemoryRequestBytes() int64 { return 0 } +func (x *ContainerProfileSnapshot) GetAvgTimeToReadyMs() float64 { + if x != nil { + return x.AvgTimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP50TimeToReadyMs() float64 { + if x != nil { + return x.P50TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP75TimeToReadyMs() float64 { + if x != nil { + return x.P75TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP95TimeToReadyMs() float64 { + if x != nil { + return x.P95TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP99TimeToReadyMs() float64 { + if x != nil { + return x.P99TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP999TimeToReadyMs() float64 { + if x != nil { + return x.P999TimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetMaxTimeToReadyMs() float64 { + if x != nil { + return x.MaxTimeToReadyMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetAvgTimeToRunningMs() float64 { + if x != nil { + return x.AvgTimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP50TimeToRunningMs() float64 { + if x != nil { + return x.P50TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP75TimeToRunningMs() float64 { + if x != nil { + return x.P75TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP95TimeToRunningMs() float64 { + if x != nil { + return x.P95TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP99TimeToRunningMs() float64 { + if x != nil { + return x.P99TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetP999TimeToRunningMs() float64 { + if x != nil { + return x.P999TimeToRunningMs + } + return 0 +} + +func (x *ContainerProfileSnapshot) GetMaxTimeToRunningMs() float64 { + if x != nil { + return x.MaxTimeToRunningMs + } + return 0 +} + +// WorkloadPeerConnectivity describes one outbound (egress) internal +// workload-to-workload traffic edge from the profiled workload to a destination +// workload in the same cluster, aggregated over the profile window. Only +// internal cluster traffic is represented here (destination workload +// name/namespace populated); external egress is out of scope. +type WorkloadPeerConnectivity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Stable owner-workload UID of the destination, resolved at ingestion. Used + // for stable peer identity — name/namespace alone can collide across workload + // replacements. + DstWorkloadUid string `protobuf:"bytes,1,opt,name=dst_workload_uid,json=dstWorkloadUid,proto3" json:"dst_workload_uid,omitempty"` + DstWorkloadName string `protobuf:"bytes,2,opt,name=dst_workload_name,json=dstWorkloadName,proto3" json:"dst_workload_name,omitempty"` + DstNamespace string `protobuf:"bytes,3,opt,name=dst_namespace,json=dstNamespace,proto3" json:"dst_namespace,omitempty"` + // traffic_type mirrors models.TrafficType (e.g. INTERNAL_SAME_NODE, + // INTERNAL_SAME_AZ, INTERNAL_CROSS_AZ). Kept as a string to match the + // ClickHouse-stored classification. + TrafficType string `protobuf:"bytes,4,opt,name=traffic_type,json=trafficType,proto3" json:"traffic_type,omitempty"` + // Total transmit/receive bytes over the profile window for this edge. + TxBytes int64 `protobuf:"varint,5,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"` + RxBytes int64 `protobuf:"varint,6,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"` + // Total network cost attributed to this edge over the window. + Cost *money.Money `protobuf:"bytes,7,opt,name=cost,proto3" json:"cost,omitempty"` +} + +func (x *WorkloadPeerConnectivity) Reset() { + *x = WorkloadPeerConnectivity{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_profiling_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadPeerConnectivity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadPeerConnectivity) ProtoMessage() {} + +func (x *WorkloadPeerConnectivity) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_profiling_proto_msgTypes[18] + 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 WorkloadPeerConnectivity.ProtoReflect.Descriptor instead. +func (*WorkloadPeerConnectivity) Descriptor() ([]byte, []int) { + return file_api_v1_profiling_proto_rawDescGZIP(), []int{18} +} + +func (x *WorkloadPeerConnectivity) GetDstWorkloadUid() string { + if x != nil { + return x.DstWorkloadUid + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetDstWorkloadName() string { + if x != nil { + return x.DstWorkloadName + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetDstNamespace() string { + if x != nil { + return x.DstNamespace + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetTrafficType() string { + if x != nil { + return x.TrafficType + } + return "" +} + +func (x *WorkloadPeerConnectivity) GetTxBytes() int64 { + if x != nil { + return x.TxBytes + } + return 0 +} + +func (x *WorkloadPeerConnectivity) GetRxBytes() int64 { + if x != nil { + return x.RxBytes + } + return 0 +} + +func (x *WorkloadPeerConnectivity) GetCost() *money.Money { + if x != nil { + return x.Cost + } + return nil +} + type WorkloadProfileSnapshot struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1527,12 +1967,41 @@ type WorkloadProfileSnapshot struct { DataQuality *ProfileDataQuality `protobuf:"bytes,4,opt,name=data_quality,json=dataQuality,proto3" json:"data_quality,omitempty"` ComputedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` UiUrl string `protobuf:"bytes,6,opt,name=ui_url,json=uiUrl,proto3" json:"ui_url,omitempty"` + // Workload-level startup aggregates, pooled across every container of every + // pod in the window. Mirrors WorkloadHealthSummary's startup fields. + AvgTimeToReadyMs float64 `protobuf:"fixed64,7,opt,name=avg_time_to_ready_ms,json=avgTimeToReadyMs,proto3" json:"avg_time_to_ready_ms,omitempty"` + P50TimeToReadyMs float64 `protobuf:"fixed64,8,opt,name=p50_time_to_ready_ms,json=p50TimeToReadyMs,proto3" json:"p50_time_to_ready_ms,omitempty"` + P75TimeToReadyMs float64 `protobuf:"fixed64,9,opt,name=p75_time_to_ready_ms,json=p75TimeToReadyMs,proto3" json:"p75_time_to_ready_ms,omitempty"` + P95TimeToReadyMs float64 `protobuf:"fixed64,10,opt,name=p95_time_to_ready_ms,json=p95TimeToReadyMs,proto3" json:"p95_time_to_ready_ms,omitempty"` + P99TimeToReadyMs float64 `protobuf:"fixed64,11,opt,name=p99_time_to_ready_ms,json=p99TimeToReadyMs,proto3" json:"p99_time_to_ready_ms,omitempty"` + P999TimeToReadyMs float64 `protobuf:"fixed64,12,opt,name=p999_time_to_ready_ms,json=p999TimeToReadyMs,proto3" json:"p999_time_to_ready_ms,omitempty"` + MaxTimeToReadyMs float64 `protobuf:"fixed64,13,opt,name=max_time_to_ready_ms,json=maxTimeToReadyMs,proto3" json:"max_time_to_ready_ms,omitempty"` + // Always false from this pipeline: the batched cluster-wide fetch does not + // compute a previous-period comparison, matching the existing precedent in + // GetWorkloadHealthSummaries's cluster-list handler. + StartupDegraded bool `protobuf:"varint,14,opt,name=startup_degraded,json=startupDegraded,proto3" json:"startup_degraded,omitempty"` + // False when no container_startup_lifecycles rows matched this workload in + // the window — i.e. no pod lifecycle transitions (Pending, ContainerCreating, + // Running, or Ready) were observed for it, so the zero-valued timing fields + // above mean "no data" rather than a real zero-latency startup. + // + // Reflects workload-level (time_to_ready_ms) presence only. A workload can + // have has_startup_data=false with all *_time_to_ready_ms fields zero, while + // its containers[].{avg,p50,...}_time_to_running_ms are still populated — + // e.g. containers that reached Running but never became Ready in the + // window. Do not use this flag to gate reads of container-level + // *_time_to_running_ms; check each container's own fields instead. + HasStartupData bool `protobuf:"varint,15,opt,name=has_startup_data,json=hasStartupData,proto3" json:"has_startup_data,omitempty"` + // peers carries the top outbound internal workload-to-workload traffic edges + // from this workload over the profile window (capped, ranked by tx+rx bytes). + // Only internal cluster traffic is included; external egress is excluded. + Peers []*WorkloadPeerConnectivity `protobuf:"bytes,16,rep,name=peers,proto3" json:"peers,omitempty"` } func (x *WorkloadProfileSnapshot) Reset() { *x = WorkloadProfileSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_profiling_proto_msgTypes[15] + mi := &file_api_v1_profiling_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1545,7 +2014,7 @@ func (x *WorkloadProfileSnapshot) String() string { func (*WorkloadProfileSnapshot) ProtoMessage() {} func (x *WorkloadProfileSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_profiling_proto_msgTypes[15] + mi := &file_api_v1_profiling_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1558,7 +2027,7 @@ func (x *WorkloadProfileSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadProfileSnapshot.ProtoReflect.Descriptor instead. func (*WorkloadProfileSnapshot) Descriptor() ([]byte, []int) { - return file_api_v1_profiling_proto_rawDescGZIP(), []int{15} + return file_api_v1_profiling_proto_rawDescGZIP(), []int{19} } func (x *WorkloadProfileSnapshot) GetKey() *ProfileKey { @@ -1603,6 +2072,76 @@ func (x *WorkloadProfileSnapshot) GetUiUrl() string { return "" } +func (x *WorkloadProfileSnapshot) GetAvgTimeToReadyMs() float64 { + if x != nil { + return x.AvgTimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP50TimeToReadyMs() float64 { + if x != nil { + return x.P50TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP75TimeToReadyMs() float64 { + if x != nil { + return x.P75TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP95TimeToReadyMs() float64 { + if x != nil { + return x.P95TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP99TimeToReadyMs() float64 { + if x != nil { + return x.P99TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetP999TimeToReadyMs() float64 { + if x != nil { + return x.P999TimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetMaxTimeToReadyMs() float64 { + if x != nil { + return x.MaxTimeToReadyMs + } + return 0 +} + +func (x *WorkloadProfileSnapshot) GetStartupDegraded() bool { + if x != nil { + return x.StartupDegraded + } + return false +} + +func (x *WorkloadProfileSnapshot) GetHasStartupData() bool { + if x != nil { + return x.HasStartupData + } + return false +} + +func (x *WorkloadProfileSnapshot) GetPeers() []*WorkloadPeerConnectivity { + if x != nil { + return x.Peers + } + return nil +} + var File_api_v1_profiling_proto protoreflect.FileDescriptor var file_api_v1_profiling_proto_rawDesc = []byte{ @@ -1610,390 +2149,532 @@ var file_api_v1_profiling_proto_rawDesc = []byte{ 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3c, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x22, 0xa8, 0x02, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 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, 0x12, 0x3a, 0x0a, 0x09, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, - 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, + 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x3c, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xd7, 0x02, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 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, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, + 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x06, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x22, 0x5f, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 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, 0xaa, 0x01, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0xa8, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x31, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x31, 0x64, 0x12, 0x3e, 0x0a, 0x09, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x37, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x37, 0x64, 0x22, 0xd0, 0x03, 0x0a, 0x15, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, + 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x69, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, - 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x02, 0x0a, 0x15, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x22, 0xc9, 0x09, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, - 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x45, 0x0a, - 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x23, - 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x52, - 0x69, 0x73, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, - 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe9, - 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x6f, 0x6c, 0x61, - 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x70, - 0x75, 0x56, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, - 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, - 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, - 0x6c, 0x65, 0x61, 0x6b, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x61, 0x6b, 0x52, 0x69, 0x73, 0x6b, 0x12, - 0x3e, 0x0a, 0x1b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, 0x70, 0x75, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, - 0x29, 0x0a, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xb0, 0x04, 0x0a, 0x15, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x63, 0x76, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x63, 0x76, 0x43, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x63, - 0x76, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, - 0x63, 0x76, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x70, 0x75, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x06, 0x74, 0x69, 0x70, 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x74, - 0x69, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x74, 0x69, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x32, - 0x61, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x32, 0x61, - 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x32, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, 0x32, 0x61, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x5f, 0x63, 0x70, 0x75, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x62, 0x69, 0x6d, 0x6f, - 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, 0x62, 0x69, 0x6d, - 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x53, - 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, - 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, - 0x64, 0x52, 0x53, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x61, 0x74, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0d, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x70, 0x75, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x74, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0xdc, 0x05, - 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x36, 0x0a, - 0x17, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x12, 0x5d, 0x0a, 0x1c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x11, 0x62, 0x61, 0x73, 0x65, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x14, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, - 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, - 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x15, 0x63, 0x70, 0x75, 0x41, 0x64, 0x6a, 0x75, 0x73, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x59, 0x0a, - 0x1a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x18, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x13, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, - 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, - 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x42, - 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x73, - 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, - 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x48, 0x6f, 0x75, 0x72, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0a, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, - 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x70, 0x30, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x32, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, - 0x32, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, - 0x39, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x39, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, 0x39, 0x39, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x70, 0x31, 0x30, 0x30, 0x22, 0xa9, 0x07, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, - 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, - 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x09, - 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x67, - 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x61, 0x63, 0x74, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, - 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x16, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x65, 0x6e, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x45, 0x6e, 0x64, 0x12, 0x2f, 0x0a, + 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xc9, + 0x09, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, + 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x14, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, - 0x74, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, + 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x4d, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, + 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, + 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, + 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x66, 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x2b, 0x0a, - 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, - 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x12, 0x37, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0b, 0x61, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, + 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, + 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, 0x12, + 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3b, 0x0a, + 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x11, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x56, 0x6f, 0x6c, + 0x61, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x69, 0x6d, 0x6f, 0x64, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, + 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x6b, + 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x61, 0x6b, 0x52, 0x69, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x1b, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x19, 0x63, 0x70, 0x75, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x61, + 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xb0, 0x04, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x15, 0x0a, 0x06, 0x63, 0x76, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x05, 0x63, 0x76, 0x43, 0x70, 0x75, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x76, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x63, 0x76, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x43, 0x70, 0x75, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x69, 0x70, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x06, 0x74, 0x69, 0x70, 0x43, 0x70, 0x75, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x70, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x74, 0x69, 0x70, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x32, 0x61, 0x5f, 0x63, 0x70, + 0x75, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x32, 0x61, 0x43, 0x70, 0x75, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x32, 0x61, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x09, 0x70, 0x32, 0x61, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x25, + 0x0a, 0x0e, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x70, 0x75, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x10, 0x62, 0x69, 0x6d, 0x6f, 0x64, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x65, + 0x6e, 0x64, 0x5f, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x53, 0x6c, 0x6f, 0x70, 0x65, + 0x12, 0x33, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, + 0x5f, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x52, 0x53, 0x71, + 0x75, 0x61, 0x72, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x73, + 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x70, 0x75, 0x12, 0x2b, 0x0a, 0x11, + 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0xdc, 0x05, 0x0a, 0x1b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x43, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, + 0x5d, 0x0a, 0x1c, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x1a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x13, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x61, 0x73, + 0x65, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x34, + 0x0a, 0x16, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, + 0x62, 0x61, 0x73, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x64, 0x6a, 0x75, + 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x15, 0x63, 0x70, 0x75, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x1a, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x18, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x70, 0x75, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x30, + 0x0a, 0x14, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x70, 0x75, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x43, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf5, 0x01, + 0x0a, 0x1f, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x14, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, + 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x22, 0xcb, 0x02, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x24, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, - 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x0c, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x64, - 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x75, 0x69, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x69, 0x55, 0x72, 0x6c, 0x2a, 0x5d, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, - 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, - 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, - 0x57, 0x5f, 0x31, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, - 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x37, 0x44, 0x10, 0x02, 0x32, 0x72, 0x0a, - 0x10, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x70, + 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x67, 0x70, 0x75, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9a, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, + 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x70, 0x75, 0x42, 0x75, 0x72, 0x73, 0x74, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, + 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, + 0x73, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x70, + 0x61, 0x6e, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, + 0x74, 0x69, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xd0, 0x01, + 0x0a, 0x18, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x0e, 0x0a, 0x02, + 0x70, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x70, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x32, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x32, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x35, 0x30, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, + 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x70, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x39, 0x39, 0x39, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x39, 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, + 0x22, 0xe9, 0x0c, 0x0a, 0x18, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x08, 0x67, + 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, + 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, + 0x74, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x54, 0x0a, 0x15, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, + 0x52, 0x13, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, + 0x0d, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0b, 0x66, 0x73, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x52, 0x0c, 0x66, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x4f, 0x0a, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x64, 0x61, 0x74, 0x61, 0x44, 0x61, 0x79, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, + 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69, 0x65, + 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x43, 0x0a, 0x1e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x1c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x61, 0x76, 0x67, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x35, 0x30, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x37, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x39, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x39, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, + 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x70, 0x39, 0x39, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x30, 0x0a, 0x15, + 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x70, 0x39, 0x39, + 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, + 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x61, + 0x78, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x32, + 0x0a, 0x16, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x70, 0x35, 0x30, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x70, 0x37, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, + 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x70, 0x39, + 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x70, 0x39, 0x35, 0x54, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, + 0x0a, 0x16, 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, + 0x70, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x4d, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x73, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x13, 0x70, 0x39, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x6d, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, + 0x65, 0x54, 0x6f, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x22, 0x96, 0x02, 0x0a, + 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x73, 0x74, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x73, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x64, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x05, 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, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x78, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, + 0x04, 0x63, 0x6f, 0x73, 0x74, 0x22, 0xaa, 0x06, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x24, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x65, + 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, + 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x52, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x15, 0x0a, 0x06, + 0x75, 0x69, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x69, + 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x14, 0x61, 0x76, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x61, 0x76, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x35, 0x30, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x35, 0x30, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x37, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x37, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x39, 0x35, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x39, 0x35, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x70, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x10, 0x70, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x4d, 0x73, 0x12, 0x30, 0x0a, 0x15, 0x70, 0x39, 0x39, 0x39, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x11, 0x70, 0x39, 0x39, 0x39, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, + 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x52, 0x65, + 0x61, 0x64, 0x79, 0x4d, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x5f, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x44, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, + 0x12, 0x28, 0x0a, 0x10, 0x68, 0x61, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x68, 0x61, 0x73, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x05, 0x70, 0x65, + 0x65, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x52, 0x05, 0x70, 0x65, 0x65, + 0x72, 0x73, 0x2a, 0x5d, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, + 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, + 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x31, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, + 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x5f, 0x37, 0x44, 0x10, + 0x02, 0x32, 0xf3, 0x01, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x8c, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x42, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, - 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8c, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, + 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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 ( @@ -2009,72 +2690,87 @@ func file_api_v1_profiling_proto_rawDescGZIP() []byte { } var file_api_v1_profiling_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_v1_profiling_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_api_v1_profiling_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_api_v1_profiling_proto_goTypes = []interface{}{ - (ProfileWindow)(0), // 0: api.v1.ProfileWindow - (*ProfilingWorkloadKey)(nil), // 1: api.v1.ProfilingWorkloadKey - (*GetWorkloadProfilesRequest)(nil), // 2: api.v1.GetWorkloadProfilesRequest - (*GetWorkloadProfilesResponse)(nil), // 3: api.v1.GetWorkloadProfilesResponse - (*WorkloadProfileResult)(nil), // 4: api.v1.WorkloadProfileResult - (*ContainerProfileResult)(nil), // 5: api.v1.ContainerProfileResult - (*ProfilingBehavior)(nil), // 6: api.v1.ProfilingBehavior - (*ProfilingSignalValues)(nil), // 7: api.v1.ProfilingSignalValues - (*ProfilingAdjustmentEvidence)(nil), // 8: api.v1.ProfilingAdjustmentEvidence - (*ProfilingAdjustment)(nil), // 9: api.v1.ProfilingAdjustment - (*ProfilingResourceRecommendation)(nil), // 10: api.v1.ProfilingResourceRecommendation - (*ProfilingClassification)(nil), // 11: api.v1.ProfilingClassification - (*ProfileDataQuality)(nil), // 12: api.v1.ProfileDataQuality - (*ProfileKey)(nil), // 13: api.v1.ProfileKey - (*MetricPercentilesCompact)(nil), // 14: api.v1.MetricPercentilesCompact - (*ContainerProfileSnapshot)(nil), // 15: api.v1.ContainerProfileSnapshot - (*WorkloadProfileSnapshot)(nil), // 16: api.v1.WorkloadProfileSnapshot - (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp - (*MetricPercentiles)(nil), // 18: api.v1.MetricPercentiles + (ProfileWindow)(0), // 0: api.v1.ProfileWindow + (*ProfilingWorkloadKey)(nil), // 1: api.v1.ProfilingWorkloadKey + (*GetWorkloadProfilesRequest)(nil), // 2: api.v1.GetWorkloadProfilesRequest + (*GetWorkloadProfilesResponse)(nil), // 3: api.v1.GetWorkloadProfilesResponse + (*GetWorkloadProfileAvailabilityRequest)(nil), // 4: api.v1.GetWorkloadProfileAvailabilityRequest + (*ProfileWindowAvailability)(nil), // 5: api.v1.ProfileWindowAvailability + (*GetWorkloadProfileAvailabilityResponse)(nil), // 6: api.v1.GetWorkloadProfileAvailabilityResponse + (*WorkloadProfileResult)(nil), // 7: api.v1.WorkloadProfileResult + (*ContainerProfileResult)(nil), // 8: api.v1.ContainerProfileResult + (*ProfilingBehavior)(nil), // 9: api.v1.ProfilingBehavior + (*ProfilingSignalValues)(nil), // 10: api.v1.ProfilingSignalValues + (*ProfilingAdjustmentEvidence)(nil), // 11: api.v1.ProfilingAdjustmentEvidence + (*ProfilingAdjustment)(nil), // 12: api.v1.ProfilingAdjustment + (*ProfilingResourceRecommendation)(nil), // 13: api.v1.ProfilingResourceRecommendation + (*ProfilingClassification)(nil), // 14: api.v1.ProfilingClassification + (*ProfileDataQuality)(nil), // 15: api.v1.ProfileDataQuality + (*ProfileKey)(nil), // 16: api.v1.ProfileKey + (*MetricPercentilesCompact)(nil), // 17: api.v1.MetricPercentilesCompact + (*ContainerProfileSnapshot)(nil), // 18: api.v1.ContainerProfileSnapshot + (*WorkloadPeerConnectivity)(nil), // 19: api.v1.WorkloadPeerConnectivity + (*WorkloadProfileSnapshot)(nil), // 20: api.v1.WorkloadProfileSnapshot + (*timestamppb.Timestamp)(nil), // 21: google.protobuf.Timestamp + (*MetricPercentiles)(nil), // 22: api.v1.MetricPercentiles + (*money.Money)(nil), // 23: google.type.Money } var file_api_v1_profiling_proto_depIdxs = []int32{ 1, // 0: api.v1.GetWorkloadProfilesRequest.workloads:type_name -> api.v1.ProfilingWorkloadKey - 17, // 1: api.v1.GetWorkloadProfilesRequest.start_time:type_name -> google.protobuf.Timestamp - 17, // 2: api.v1.GetWorkloadProfilesRequest.end_time:type_name -> google.protobuf.Timestamp - 4, // 3: api.v1.GetWorkloadProfilesResponse.workload_profiles:type_name -> api.v1.WorkloadProfileResult - 5, // 4: api.v1.WorkloadProfileResult.containers:type_name -> api.v1.ContainerProfileResult - 11, // 5: api.v1.WorkloadProfileResult.classification:type_name -> api.v1.ProfilingClassification - 12, // 6: api.v1.WorkloadProfileResult.data_quality:type_name -> api.v1.ProfileDataQuality - 18, // 7: api.v1.ContainerProfileResult.cpu_usage:type_name -> api.v1.MetricPercentiles - 18, // 8: api.v1.ContainerProfileResult.memory_usage:type_name -> api.v1.MetricPercentiles - 18, // 9: api.v1.ContainerProfileResult.gpu_usage:type_name -> api.v1.MetricPercentiles - 18, // 10: api.v1.ContainerProfileResult.gpu_vram_usage:type_name -> api.v1.MetricPercentiles - 18, // 11: api.v1.ContainerProfileResult.network_receive_bytes:type_name -> api.v1.MetricPercentiles - 18, // 12: api.v1.ContainerProfileResult.network_transmit_bytes:type_name -> api.v1.MetricPercentiles - 18, // 13: api.v1.ContainerProfileResult.fs_read_bytes:type_name -> api.v1.MetricPercentiles - 18, // 14: api.v1.ContainerProfileResult.fs_write_bytes:type_name -> api.v1.MetricPercentiles - 10, // 15: api.v1.ContainerProfileResult.recommendation:type_name -> api.v1.ProfilingResourceRecommendation - 7, // 16: api.v1.ContainerProfileResult.signals:type_name -> api.v1.ProfilingSignalValues - 8, // 17: api.v1.ContainerProfileResult.adjustments:type_name -> api.v1.ProfilingAdjustmentEvidence - 6, // 18: api.v1.ContainerProfileResult.behavior:type_name -> api.v1.ProfilingBehavior - 9, // 19: api.v1.ProfilingAdjustmentEvidence.percentile_overrides_applied:type_name -> api.v1.ProfilingAdjustment - 9, // 20: api.v1.ProfilingAdjustmentEvidence.cpu_adjustments_applied:type_name -> api.v1.ProfilingAdjustment - 9, // 21: api.v1.ProfilingAdjustmentEvidence.memory_adjustments_applied:type_name -> api.v1.ProfilingAdjustment - 14, // 22: api.v1.ContainerProfileSnapshot.cpu_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 23: api.v1.ContainerProfileSnapshot.memory_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 24: api.v1.ContainerProfileSnapshot.gpu_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 25: api.v1.ContainerProfileSnapshot.gpu_vram_usage:type_name -> api.v1.MetricPercentilesCompact - 14, // 26: api.v1.ContainerProfileSnapshot.network_receive_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 27: api.v1.ContainerProfileSnapshot.network_transmit_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 28: api.v1.ContainerProfileSnapshot.fs_read_bytes:type_name -> api.v1.MetricPercentilesCompact - 14, // 29: api.v1.ContainerProfileSnapshot.fs_write_bytes:type_name -> api.v1.MetricPercentilesCompact - 10, // 30: api.v1.ContainerProfileSnapshot.recommendation:type_name -> api.v1.ProfilingResourceRecommendation - 13, // 31: api.v1.WorkloadProfileSnapshot.key:type_name -> api.v1.ProfileKey - 15, // 32: api.v1.WorkloadProfileSnapshot.containers:type_name -> api.v1.ContainerProfileSnapshot - 6, // 33: api.v1.WorkloadProfileSnapshot.behavior:type_name -> api.v1.ProfilingBehavior - 12, // 34: api.v1.WorkloadProfileSnapshot.data_quality:type_name -> api.v1.ProfileDataQuality - 17, // 35: api.v1.WorkloadProfileSnapshot.computed_at:type_name -> google.protobuf.Timestamp - 2, // 36: api.v1.ProfilingService.GetWorkloadProfiles:input_type -> api.v1.GetWorkloadProfilesRequest - 3, // 37: api.v1.ProfilingService.GetWorkloadProfiles:output_type -> api.v1.GetWorkloadProfilesResponse - 37, // [37:38] is the sub-list for method output_type - 36, // [36:37] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 21, // 1: api.v1.GetWorkloadProfilesRequest.start_time:type_name -> google.protobuf.Timestamp + 21, // 2: api.v1.GetWorkloadProfilesRequest.end_time:type_name -> google.protobuf.Timestamp + 0, // 3: api.v1.GetWorkloadProfilesRequest.window:type_name -> api.v1.ProfileWindow + 7, // 4: api.v1.GetWorkloadProfilesResponse.workload_profiles:type_name -> api.v1.WorkloadProfileResult + 21, // 5: api.v1.ProfileWindowAvailability.latest_computed_at:type_name -> google.protobuf.Timestamp + 5, // 6: api.v1.GetWorkloadProfileAvailabilityResponse.window_1d:type_name -> api.v1.ProfileWindowAvailability + 5, // 7: api.v1.GetWorkloadProfileAvailabilityResponse.window_7d:type_name -> api.v1.ProfileWindowAvailability + 8, // 8: api.v1.WorkloadProfileResult.containers:type_name -> api.v1.ContainerProfileResult + 14, // 9: api.v1.WorkloadProfileResult.classification:type_name -> api.v1.ProfilingClassification + 15, // 10: api.v1.WorkloadProfileResult.data_quality:type_name -> api.v1.ProfileDataQuality + 21, // 11: api.v1.WorkloadProfileResult.window_start:type_name -> google.protobuf.Timestamp + 21, // 12: api.v1.WorkloadProfileResult.window_end:type_name -> google.protobuf.Timestamp + 22, // 13: api.v1.ContainerProfileResult.cpu_usage:type_name -> api.v1.MetricPercentiles + 22, // 14: api.v1.ContainerProfileResult.memory_usage:type_name -> api.v1.MetricPercentiles + 22, // 15: api.v1.ContainerProfileResult.gpu_usage:type_name -> api.v1.MetricPercentiles + 22, // 16: api.v1.ContainerProfileResult.gpu_vram_usage:type_name -> api.v1.MetricPercentiles + 22, // 17: api.v1.ContainerProfileResult.network_receive_bytes:type_name -> api.v1.MetricPercentiles + 22, // 18: api.v1.ContainerProfileResult.network_transmit_bytes:type_name -> api.v1.MetricPercentiles + 22, // 19: api.v1.ContainerProfileResult.fs_read_bytes:type_name -> api.v1.MetricPercentiles + 22, // 20: api.v1.ContainerProfileResult.fs_write_bytes:type_name -> api.v1.MetricPercentiles + 13, // 21: api.v1.ContainerProfileResult.recommendation:type_name -> api.v1.ProfilingResourceRecommendation + 10, // 22: api.v1.ContainerProfileResult.signals:type_name -> api.v1.ProfilingSignalValues + 11, // 23: api.v1.ContainerProfileResult.adjustments:type_name -> api.v1.ProfilingAdjustmentEvidence + 9, // 24: api.v1.ContainerProfileResult.behavior:type_name -> api.v1.ProfilingBehavior + 12, // 25: api.v1.ProfilingAdjustmentEvidence.percentile_overrides_applied:type_name -> api.v1.ProfilingAdjustment + 12, // 26: api.v1.ProfilingAdjustmentEvidence.cpu_adjustments_applied:type_name -> api.v1.ProfilingAdjustment + 12, // 27: api.v1.ProfilingAdjustmentEvidence.memory_adjustments_applied:type_name -> api.v1.ProfilingAdjustment + 17, // 28: api.v1.ContainerProfileSnapshot.cpu_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 29: api.v1.ContainerProfileSnapshot.memory_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 30: api.v1.ContainerProfileSnapshot.gpu_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 31: api.v1.ContainerProfileSnapshot.gpu_vram_usage:type_name -> api.v1.MetricPercentilesCompact + 17, // 32: api.v1.ContainerProfileSnapshot.network_receive_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 33: api.v1.ContainerProfileSnapshot.network_transmit_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 34: api.v1.ContainerProfileSnapshot.fs_read_bytes:type_name -> api.v1.MetricPercentilesCompact + 17, // 35: api.v1.ContainerProfileSnapshot.fs_write_bytes:type_name -> api.v1.MetricPercentilesCompact + 13, // 36: api.v1.ContainerProfileSnapshot.recommendation:type_name -> api.v1.ProfilingResourceRecommendation + 23, // 37: api.v1.WorkloadPeerConnectivity.cost:type_name -> google.type.Money + 16, // 38: api.v1.WorkloadProfileSnapshot.key:type_name -> api.v1.ProfileKey + 18, // 39: api.v1.WorkloadProfileSnapshot.containers:type_name -> api.v1.ContainerProfileSnapshot + 9, // 40: api.v1.WorkloadProfileSnapshot.behavior:type_name -> api.v1.ProfilingBehavior + 15, // 41: api.v1.WorkloadProfileSnapshot.data_quality:type_name -> api.v1.ProfileDataQuality + 21, // 42: api.v1.WorkloadProfileSnapshot.computed_at:type_name -> google.protobuf.Timestamp + 19, // 43: api.v1.WorkloadProfileSnapshot.peers:type_name -> api.v1.WorkloadPeerConnectivity + 2, // 44: api.v1.ProfilingService.GetWorkloadProfiles:input_type -> api.v1.GetWorkloadProfilesRequest + 4, // 45: api.v1.ProfilingService.GetWorkloadProfileAvailability:input_type -> api.v1.GetWorkloadProfileAvailabilityRequest + 3, // 46: api.v1.ProfilingService.GetWorkloadProfiles:output_type -> api.v1.GetWorkloadProfilesResponse + 6, // 47: api.v1.ProfilingService.GetWorkloadProfileAvailability:output_type -> api.v1.GetWorkloadProfileAvailabilityResponse + 46, // [46:48] is the sub-list for method output_type + 44, // [44:46] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_api_v1_profiling_proto_init() } @@ -2121,7 +2817,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadProfileResult); i { + switch v := v.(*GetWorkloadProfileAvailabilityRequest); i { case 0: return &v.state case 1: @@ -2133,7 +2829,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerProfileResult); i { + switch v := v.(*ProfileWindowAvailability); i { case 0: return &v.state case 1: @@ -2145,7 +2841,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingBehavior); i { + switch v := v.(*GetWorkloadProfileAvailabilityResponse); i { case 0: return &v.state case 1: @@ -2157,7 +2853,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingSignalValues); i { + switch v := v.(*WorkloadProfileResult); i { case 0: return &v.state case 1: @@ -2169,7 +2865,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingAdjustmentEvidence); i { + switch v := v.(*ContainerProfileResult); i { case 0: return &v.state case 1: @@ -2181,7 +2877,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingAdjustment); i { + switch v := v.(*ProfilingBehavior); i { case 0: return &v.state case 1: @@ -2193,7 +2889,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingResourceRecommendation); i { + switch v := v.(*ProfilingSignalValues); i { case 0: return &v.state case 1: @@ -2205,7 +2901,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfilingClassification); i { + switch v := v.(*ProfilingAdjustmentEvidence); i { case 0: return &v.state case 1: @@ -2217,7 +2913,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileDataQuality); i { + switch v := v.(*ProfilingAdjustment); i { case 0: return &v.state case 1: @@ -2229,7 +2925,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileKey); i { + switch v := v.(*ProfilingResourceRecommendation); i { case 0: return &v.state case 1: @@ -2241,7 +2937,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetricPercentilesCompact); i { + switch v := v.(*ProfilingClassification); i { case 0: return &v.state case 1: @@ -2253,7 +2949,7 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerProfileSnapshot); i { + switch v := v.(*ProfileDataQuality); i { case 0: return &v.state case 1: @@ -2265,6 +2961,54 @@ func file_api_v1_profiling_proto_init() { } } file_api_v1_profiling_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProfileKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricPercentilesCompact); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerProfileSnapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPeerConnectivity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_profiling_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkloadProfileSnapshot); i { case 0: return &v.state @@ -2284,7 +3028,7 @@ func file_api_v1_profiling_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_profiling_proto_rawDesc, NumEnums: 1, - NumMessages: 16, + NumMessages: 20, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/gen/api/v1/profiling_grpc.pb.go b/internal/gen/api/v1/profiling_grpc.pb.go index b7af3ee..d61d90b 100644 --- a/internal/gen/api/v1/profiling_grpc.pb.go +++ b/internal/gen/api/v1/profiling_grpc.pb.go @@ -19,7 +19,8 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - ProfilingService_GetWorkloadProfiles_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfiles" + ProfilingService_GetWorkloadProfiles_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfiles" + ProfilingService_GetWorkloadProfileAvailability_FullMethodName = "/api.v1.ProfilingService/GetWorkloadProfileAvailability" ) // ProfilingServiceClient is the client API for ProfilingService service. @@ -27,6 +28,11 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ProfilingServiceClient interface { GetWorkloadProfiles(ctx context.Context, in *GetWorkloadProfilesRequest, opts ...grpc.CallOption) (*GetWorkloadProfilesResponse, error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(ctx context.Context, in *GetWorkloadProfileAvailabilityRequest, opts ...grpc.CallOption) (*GetWorkloadProfileAvailabilityResponse, error) } type profilingServiceClient struct { @@ -46,11 +52,25 @@ func (c *profilingServiceClient) GetWorkloadProfiles(ctx context.Context, in *Ge return out, nil } +func (c *profilingServiceClient) GetWorkloadProfileAvailability(ctx context.Context, in *GetWorkloadProfileAvailabilityRequest, opts ...grpc.CallOption) (*GetWorkloadProfileAvailabilityResponse, error) { + out := new(GetWorkloadProfileAvailabilityResponse) + err := c.cc.Invoke(ctx, ProfilingService_GetWorkloadProfileAvailability_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ProfilingServiceServer is the server API for ProfilingService service. // All implementations must embed UnimplementedProfilingServiceServer // for forward compatibility type ProfilingServiceServer interface { GetWorkloadProfiles(context.Context, *GetWorkloadProfilesRequest) (*GetWorkloadProfilesResponse, error) + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + GetWorkloadProfileAvailability(context.Context, *GetWorkloadProfileAvailabilityRequest) (*GetWorkloadProfileAvailabilityResponse, error) mustEmbedUnimplementedProfilingServiceServer() } @@ -61,6 +81,9 @@ type UnimplementedProfilingServiceServer struct { func (UnimplementedProfilingServiceServer) GetWorkloadProfiles(context.Context, *GetWorkloadProfilesRequest) (*GetWorkloadProfilesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadProfiles not implemented") } +func (UnimplementedProfilingServiceServer) GetWorkloadProfileAvailability(context.Context, *GetWorkloadProfileAvailabilityRequest) (*GetWorkloadProfileAvailabilityResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadProfileAvailability not implemented") +} func (UnimplementedProfilingServiceServer) mustEmbedUnimplementedProfilingServiceServer() {} // UnsafeProfilingServiceServer may be embedded to opt out of forward compatibility for this service. @@ -92,6 +115,24 @@ func _ProfilingService_GetWorkloadProfiles_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _ProfilingService_GetWorkloadProfileAvailability_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkloadProfileAvailabilityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProfilingServiceServer).GetWorkloadProfileAvailability(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProfilingService_GetWorkloadProfileAvailability_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProfilingServiceServer).GetWorkloadProfileAvailability(ctx, req.(*GetWorkloadProfileAvailabilityRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ProfilingService_ServiceDesc is the grpc.ServiceDesc for ProfilingService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -103,6 +144,10 @@ var ProfilingService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetWorkloadProfiles", Handler: _ProfilingService_GetWorkloadProfiles_Handler, }, + { + MethodName: "GetWorkloadProfileAvailability", + Handler: _ProfilingService_GetWorkloadProfileAvailability_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "api/v1/profiling.proto", diff --git a/internal/gen/api/v1/recommendation.pb.go b/internal/gen/api/v1/recommendation.pb.go index 7b0f0c2..1935dd0 100644 --- a/internal/gen/api/v1/recommendation.pb.go +++ b/internal/gen/api/v1/recommendation.pb.go @@ -10,7 +10,7 @@ import ( money "google.golang.org/genproto/googleapis/type/money" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - durationpb "google.golang.org/protobuf/types/known/durationpb" + _ "google.golang.org/protobuf/types/known/durationpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -121,6 +121,109 @@ func (ActionToTake) EnumDescriptor() ([]byte, []int) { return file_api_v1_recommendation_proto_rawDescGZIP(), []int{1} } +// MutationAction is the per-element analog of ActionToTake for list/map-shaped +// fields (env vars, nodeSelector, tolerations, command/arg flags). The action +// lives on each element so the operator can merge deltas into the live spec +// instead of replacing the whole list. IGNORE is implicit: omit the element. +type MutationAction int32 + +const ( + MutationAction_MUTATION_ACTION_UNSPECIFIED MutationAction = 0 + MutationAction_MUTATION_ACTION_UPSERT MutationAction = 1 // add the element, or replace the one matching the merge key + MutationAction_MUTATION_ACTION_REMOVE MutationAction = 2 // delete the element matching the merge key +) + +// Enum value maps for MutationAction. +var ( + MutationAction_name = map[int32]string{ + 0: "MUTATION_ACTION_UNSPECIFIED", + 1: "MUTATION_ACTION_UPSERT", + 2: "MUTATION_ACTION_REMOVE", + } + MutationAction_value = map[string]int32{ + "MUTATION_ACTION_UNSPECIFIED": 0, + "MUTATION_ACTION_UPSERT": 1, + "MUTATION_ACTION_REMOVE": 2, + } +) + +func (x MutationAction) Enum() *MutationAction { + p := new(MutationAction) + *p = x + return p +} + +func (x MutationAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MutationAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[2].Descriptor() +} + +func (MutationAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[2] +} + +func (x MutationAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MutationAction.Descriptor instead. +func (MutationAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{2} +} + +// ArgTarget selects which container field a CommandArgMutation edits. +type ArgTarget int32 + +const ( + ArgTarget_ARG_TARGET_UNSPECIFIED ArgTarget = 0 + ArgTarget_ARG_TARGET_ARGS ArgTarget = 1 // container.args + ArgTarget_ARG_TARGET_COMMAND ArgTarget = 2 // container.command +) + +// Enum value maps for ArgTarget. +var ( + ArgTarget_name = map[int32]string{ + 0: "ARG_TARGET_UNSPECIFIED", + 1: "ARG_TARGET_ARGS", + 2: "ARG_TARGET_COMMAND", + } + ArgTarget_value = map[string]int32{ + "ARG_TARGET_UNSPECIFIED": 0, + "ARG_TARGET_ARGS": 1, + "ARG_TARGET_COMMAND": 2, + } +) + +func (x ArgTarget) Enum() *ArgTarget { + p := new(ArgTarget) + *p = x + return p +} + +func (x ArgTarget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ArgTarget) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[3].Descriptor() +} + +func (ArgTarget) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[3] +} + +func (x ArgTarget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ArgTarget.Descriptor instead. +func (ArgTarget) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{3} +} + type CostPeriod int32 const ( @@ -154,11 +257,11 @@ func (x CostPeriod) String() string { } func (CostPeriod) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[2].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[4].Descriptor() } func (CostPeriod) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[2] + return &file_api_v1_recommendation_proto_enumTypes[4] } func (x CostPeriod) Number() protoreflect.EnumNumber { @@ -167,7 +270,205 @@ func (x CostPeriod) Number() protoreflect.EnumNumber { // Deprecated: Use CostPeriod.Descriptor instead. func (CostPeriod) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{2} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{4} +} + +type ReasoningInsightSeverity int32 + +const ( + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_UNSPECIFIED ReasoningInsightSeverity = 0 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_INFO ReasoningInsightSeverity = 1 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_LOW ReasoningInsightSeverity = 2 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_MEDIUM ReasoningInsightSeverity = 3 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_HIGH ReasoningInsightSeverity = 4 + ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_CRITICAL ReasoningInsightSeverity = 5 +) + +// Enum value maps for ReasoningInsightSeverity. +var ( + ReasoningInsightSeverity_name = map[int32]string{ + 0: "REASONING_INSIGHT_SEVERITY_UNSPECIFIED", + 1: "REASONING_INSIGHT_SEVERITY_INFO", + 2: "REASONING_INSIGHT_SEVERITY_LOW", + 3: "REASONING_INSIGHT_SEVERITY_MEDIUM", + 4: "REASONING_INSIGHT_SEVERITY_HIGH", + 5: "REASONING_INSIGHT_SEVERITY_CRITICAL", + } + ReasoningInsightSeverity_value = map[string]int32{ + "REASONING_INSIGHT_SEVERITY_UNSPECIFIED": 0, + "REASONING_INSIGHT_SEVERITY_INFO": 1, + "REASONING_INSIGHT_SEVERITY_LOW": 2, + "REASONING_INSIGHT_SEVERITY_MEDIUM": 3, + "REASONING_INSIGHT_SEVERITY_HIGH": 4, + "REASONING_INSIGHT_SEVERITY_CRITICAL": 5, + } +) + +func (x ReasoningInsightSeverity) Enum() *ReasoningInsightSeverity { + p := new(ReasoningInsightSeverity) + *p = x + return p +} + +func (x ReasoningInsightSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningInsightSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[5].Descriptor() +} + +func (ReasoningInsightSeverity) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[5] +} + +func (x ReasoningInsightSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningInsightSeverity.Descriptor instead. +func (ReasoningInsightSeverity) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{5} +} + +type ReasoningInsightType int32 + +const ( + ReasoningInsightType_REASONING_INSIGHT_TYPE_UNSPECIFIED ReasoningInsightType = 0 + ReasoningInsightType_REASONING_INSIGHT_TYPE_PATTERN ReasoningInsightType = 1 + ReasoningInsightType_REASONING_INSIGHT_TYPE_ANOMALY ReasoningInsightType = 2 + ReasoningInsightType_REASONING_INSIGHT_TYPE_TREND ReasoningInsightType = 3 + ReasoningInsightType_REASONING_INSIGHT_TYPE_OPTIMIZATION ReasoningInsightType = 4 + ReasoningInsightType_REASONING_INSIGHT_TYPE_RISK ReasoningInsightType = 5 + ReasoningInsightType_REASONING_INSIGHT_TYPE_PROFILE ReasoningInsightType = 6 +) + +// Enum value maps for ReasoningInsightType. +var ( + ReasoningInsightType_name = map[int32]string{ + 0: "REASONING_INSIGHT_TYPE_UNSPECIFIED", + 1: "REASONING_INSIGHT_TYPE_PATTERN", + 2: "REASONING_INSIGHT_TYPE_ANOMALY", + 3: "REASONING_INSIGHT_TYPE_TREND", + 4: "REASONING_INSIGHT_TYPE_OPTIMIZATION", + 5: "REASONING_INSIGHT_TYPE_RISK", + 6: "REASONING_INSIGHT_TYPE_PROFILE", + } + ReasoningInsightType_value = map[string]int32{ + "REASONING_INSIGHT_TYPE_UNSPECIFIED": 0, + "REASONING_INSIGHT_TYPE_PATTERN": 1, + "REASONING_INSIGHT_TYPE_ANOMALY": 2, + "REASONING_INSIGHT_TYPE_TREND": 3, + "REASONING_INSIGHT_TYPE_OPTIMIZATION": 4, + "REASONING_INSIGHT_TYPE_RISK": 5, + "REASONING_INSIGHT_TYPE_PROFILE": 6, + } +) + +func (x ReasoningInsightType) Enum() *ReasoningInsightType { + p := new(ReasoningInsightType) + *p = x + return p +} + +func (x ReasoningInsightType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningInsightType) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[6].Descriptor() +} + +func (ReasoningInsightType) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[6] +} + +func (x ReasoningInsightType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningInsightType.Descriptor instead. +func (ReasoningInsightType) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{6} +} + +type ReasoningDecisionKind int32 + +const ( + ReasoningDecisionKind_REASONING_DECISION_KIND_UNSPECIFIED ReasoningDecisionKind = 0 + ReasoningDecisionKind_REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE ReasoningDecisionKind = 1 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_CONFLICT ReasoningDecisionKind = 2 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_FLOOR ReasoningDecisionKind = 3 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_CEILING ReasoningDecisionKind = 4 + ReasoningDecisionKind_REASONING_DECISION_KIND_PLATFORM_FLOOR ReasoningDecisionKind = 5 + ReasoningDecisionKind_REASONING_DECISION_KIND_SAFETY_FLOOR ReasoningDecisionKind = 6 + ReasoningDecisionKind_REASONING_DECISION_KIND_SUPPRESSION ReasoningDecisionKind = 7 + ReasoningDecisionKind_REASONING_DECISION_KIND_FEATURE_DOWNGRADE ReasoningDecisionKind = 8 + ReasoningDecisionKind_REASONING_DECISION_KIND_MODIFICATION ReasoningDecisionKind = 9 + ReasoningDecisionKind_REASONING_DECISION_KIND_NORMALIZATION ReasoningDecisionKind = 10 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR ReasoningDecisionKind = 11 + ReasoningDecisionKind_REASONING_DECISION_KIND_POLICY_LIMIT_CEILING ReasoningDecisionKind = 12 +) + +// Enum value maps for ReasoningDecisionKind. +var ( + ReasoningDecisionKind_name = map[int32]string{ + 0: "REASONING_DECISION_KIND_UNSPECIFIED", + 1: "REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE", + 2: "REASONING_DECISION_KIND_POLICY_CONFLICT", + 3: "REASONING_DECISION_KIND_POLICY_FLOOR", + 4: "REASONING_DECISION_KIND_POLICY_CEILING", + 5: "REASONING_DECISION_KIND_PLATFORM_FLOOR", + 6: "REASONING_DECISION_KIND_SAFETY_FLOOR", + 7: "REASONING_DECISION_KIND_SUPPRESSION", + 8: "REASONING_DECISION_KIND_FEATURE_DOWNGRADE", + 9: "REASONING_DECISION_KIND_MODIFICATION", + 10: "REASONING_DECISION_KIND_NORMALIZATION", + 11: "REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR", + 12: "REASONING_DECISION_KIND_POLICY_LIMIT_CEILING", + } + ReasoningDecisionKind_value = map[string]int32{ + "REASONING_DECISION_KIND_UNSPECIFIED": 0, + "REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE": 1, + "REASONING_DECISION_KIND_POLICY_CONFLICT": 2, + "REASONING_DECISION_KIND_POLICY_FLOOR": 3, + "REASONING_DECISION_KIND_POLICY_CEILING": 4, + "REASONING_DECISION_KIND_PLATFORM_FLOOR": 5, + "REASONING_DECISION_KIND_SAFETY_FLOOR": 6, + "REASONING_DECISION_KIND_SUPPRESSION": 7, + "REASONING_DECISION_KIND_FEATURE_DOWNGRADE": 8, + "REASONING_DECISION_KIND_MODIFICATION": 9, + "REASONING_DECISION_KIND_NORMALIZATION": 10, + "REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR": 11, + "REASONING_DECISION_KIND_POLICY_LIMIT_CEILING": 12, + } +) + +func (x ReasoningDecisionKind) Enum() *ReasoningDecisionKind { + p := new(ReasoningDecisionKind) + *p = x + return p +} + +func (x ReasoningDecisionKind) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReasoningDecisionKind) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[7].Descriptor() +} + +func (ReasoningDecisionKind) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[7] +} + +func (x ReasoningDecisionKind) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReasoningDecisionKind.Descriptor instead. +func (ReasoningDecisionKind) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{7} } type LiveMigDeletionPropagation int32 @@ -206,11 +507,11 @@ func (x LiveMigDeletionPropagation) String() string { } func (LiveMigDeletionPropagation) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[3].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[8].Descriptor() } func (LiveMigDeletionPropagation) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[3] + return &file_api_v1_recommendation_proto_enumTypes[8] } func (x LiveMigDeletionPropagation) Number() protoreflect.EnumNumber { @@ -219,7 +520,7 @@ func (x LiveMigDeletionPropagation) Number() protoreflect.EnumNumber { // Deprecated: Use LiveMigDeletionPropagation.Descriptor instead. func (LiveMigDeletionPropagation) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{3} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{8} } type RecommendationStatus int32 @@ -290,11 +591,11 @@ func (x RecommendationStatus) String() string { } func (RecommendationStatus) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[4].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[9].Descriptor() } func (RecommendationStatus) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[4] + return &file_api_v1_recommendation_proto_enumTypes[9] } func (x RecommendationStatus) Number() protoreflect.EnumNumber { @@ -303,7 +604,7 @@ func (x RecommendationStatus) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationStatus.Descriptor instead. func (RecommendationStatus) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{4} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{9} } // NodeGroupCheckpointState classifies a node group's checkpoint-restore status. @@ -358,11 +659,11 @@ func (x NodeGroupCheckpointState) String() string { } func (NodeGroupCheckpointState) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[5].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() } func (NodeGroupCheckpointState) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[5] + return &file_api_v1_recommendation_proto_enumTypes[10] } func (x NodeGroupCheckpointState) Number() protoreflect.EnumNumber { @@ -371,7 +672,311 @@ func (x NodeGroupCheckpointState) Number() protoreflect.EnumNumber { // Deprecated: Use NodeGroupCheckpointState.Descriptor instead. func (NodeGroupCheckpointState) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{5} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{10} +} + +// CheckpointReason explains *why* a node group is stuck in CONFIGURED — surfaced +// as a tooltip modifier line, never as a distinct chip. Multiple reasons can be +// true at once; backend picks the most actionable one. +type CheckpointReason int32 + +const ( + CheckpointReason_CHECKPOINT_REASON_UNSPECIFIED CheckpointReason = 0 + // dakr-operator on this cluster predates per-node SSA fan-out. Existing + // nodes won't be labeled until the operator upgrades. + CheckpointReason_CHECKPOINT_REASON_OPERATOR_OUTDATED CheckpointReason = 1 + // Label applied, but no node has reported criu_configured=true yet. Most + // likely the customer hasn't deployed (or hasn't finished deploying) the + // CRIU DaemonSet. + CheckpointReason_CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED CheckpointReason = 2 + // Some nodes joined recently (<5 min) and haven't been probed yet. State + // will resolve on the next operator tick. + CheckpointReason_CHECKPOINT_REASON_NEW_NODES_PROBING CheckpointReason = 3 +) + +// Enum value maps for CheckpointReason. +var ( + CheckpointReason_name = map[int32]string{ + 0: "CHECKPOINT_REASON_UNSPECIFIED", + 1: "CHECKPOINT_REASON_OPERATOR_OUTDATED", + 2: "CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED", + 3: "CHECKPOINT_REASON_NEW_NODES_PROBING", + } + CheckpointReason_value = map[string]int32{ + "CHECKPOINT_REASON_UNSPECIFIED": 0, + "CHECKPOINT_REASON_OPERATOR_OUTDATED": 1, + "CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED": 2, + "CHECKPOINT_REASON_NEW_NODES_PROBING": 3, + } +) + +func (x CheckpointReason) Enum() *CheckpointReason { + p := new(CheckpointReason) + *p = x + return p +} + +func (x CheckpointReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CheckpointReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[11].Descriptor() +} + +func (CheckpointReason) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[11] +} + +func (x CheckpointReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CheckpointReason.Descriptor instead. +func (CheckpointReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{11} +} + +// SuggestionGroup is the policy component a suggestion belongs to. The UI groups cards +// by this axis. +type SuggestionGroup int32 + +const ( + SuggestionGroup_SUGGESTION_GROUP_UNSPECIFIED SuggestionGroup = 0 + SuggestionGroup_SUGGESTION_GROUP_DISRUPTION SuggestionGroup = 1 + SuggestionGroup_SUGGESTION_GROUP_REQUIREMENTS SuggestionGroup = 2 + SuggestionGroup_SUGGESTION_GROUP_CAPACITY_TYPE SuggestionGroup = 3 + SuggestionGroup_SUGGESTION_GROUP_ZONES SuggestionGroup = 4 + SuggestionGroup_SUGGESTION_GROUP_LIMITS SuggestionGroup = 5 + SuggestionGroup_SUGGESTION_GROUP_NODECLASS SuggestionGroup = 6 + SuggestionGroup_SUGGESTION_GROUP_COMPATIBILITY SuggestionGroup = 7 + // SUGGESTION_GROUP_COVERAGE is the one group whose suggestions do not mutate this + // NodePolicy at all: field_path, current_value_yaml and suggested_value_yaml are all + // empty, and the suggestion never resolves to an Apply(). It surfaces workloads + // attributed to this pool that have no legacy (mpav1) WorkloadRecommendationPolicy + // coverage, which is a gap in DevZero's separate workload-optimization product, not a + // NodePolicy misconfiguration. + SuggestionGroup_SUGGESTION_GROUP_COVERAGE SuggestionGroup = 8 +) + +// Enum value maps for SuggestionGroup. +var ( + SuggestionGroup_name = map[int32]string{ + 0: "SUGGESTION_GROUP_UNSPECIFIED", + 1: "SUGGESTION_GROUP_DISRUPTION", + 2: "SUGGESTION_GROUP_REQUIREMENTS", + 3: "SUGGESTION_GROUP_CAPACITY_TYPE", + 4: "SUGGESTION_GROUP_ZONES", + 5: "SUGGESTION_GROUP_LIMITS", + 6: "SUGGESTION_GROUP_NODECLASS", + 7: "SUGGESTION_GROUP_COMPATIBILITY", + 8: "SUGGESTION_GROUP_COVERAGE", + } + SuggestionGroup_value = map[string]int32{ + "SUGGESTION_GROUP_UNSPECIFIED": 0, + "SUGGESTION_GROUP_DISRUPTION": 1, + "SUGGESTION_GROUP_REQUIREMENTS": 2, + "SUGGESTION_GROUP_CAPACITY_TYPE": 3, + "SUGGESTION_GROUP_ZONES": 4, + "SUGGESTION_GROUP_LIMITS": 5, + "SUGGESTION_GROUP_NODECLASS": 6, + "SUGGESTION_GROUP_COMPATIBILITY": 7, + "SUGGESTION_GROUP_COVERAGE": 8, + } +) + +func (x SuggestionGroup) Enum() *SuggestionGroup { + p := new(SuggestionGroup) + *p = x + return p +} + +func (x SuggestionGroup) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionGroup) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[12].Descriptor() +} + +func (SuggestionGroup) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[12] +} + +func (x SuggestionGroup) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionGroup.Descriptor instead. +func (SuggestionGroup) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{12} +} + +// SuggestionFlavor is the benefit a suggestion delivers. The UI renders this as a chip +// alongside severity. +type SuggestionFlavor int32 + +const ( + SuggestionFlavor_SUGGESTION_FLAVOR_UNSPECIFIED SuggestionFlavor = 0 + SuggestionFlavor_SUGGESTION_FLAVOR_COST SuggestionFlavor = 1 + SuggestionFlavor_SUGGESTION_FLAVOR_RELIABILITY SuggestionFlavor = 2 + SuggestionFlavor_SUGGESTION_FLAVOR_PERFORMANCE SuggestionFlavor = 3 + SuggestionFlavor_SUGGESTION_FLAVOR_SECURITY SuggestionFlavor = 4 + SuggestionFlavor_SUGGESTION_FLAVOR_BEST_PRACTICE SuggestionFlavor = 5 + SuggestionFlavor_SUGGESTION_FLAVOR_COMPATIBILITY SuggestionFlavor = 6 +) + +// Enum value maps for SuggestionFlavor. +var ( + SuggestionFlavor_name = map[int32]string{ + 0: "SUGGESTION_FLAVOR_UNSPECIFIED", + 1: "SUGGESTION_FLAVOR_COST", + 2: "SUGGESTION_FLAVOR_RELIABILITY", + 3: "SUGGESTION_FLAVOR_PERFORMANCE", + 4: "SUGGESTION_FLAVOR_SECURITY", + 5: "SUGGESTION_FLAVOR_BEST_PRACTICE", + 6: "SUGGESTION_FLAVOR_COMPATIBILITY", + } + SuggestionFlavor_value = map[string]int32{ + "SUGGESTION_FLAVOR_UNSPECIFIED": 0, + "SUGGESTION_FLAVOR_COST": 1, + "SUGGESTION_FLAVOR_RELIABILITY": 2, + "SUGGESTION_FLAVOR_PERFORMANCE": 3, + "SUGGESTION_FLAVOR_SECURITY": 4, + "SUGGESTION_FLAVOR_BEST_PRACTICE": 5, + "SUGGESTION_FLAVOR_COMPATIBILITY": 6, + } +) + +func (x SuggestionFlavor) Enum() *SuggestionFlavor { + p := new(SuggestionFlavor) + *p = x + return p +} + +func (x SuggestionFlavor) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionFlavor) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[13].Descriptor() +} + +func (SuggestionFlavor) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[13] +} + +func (x SuggestionFlavor) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionFlavor.Descriptor instead. +func (SuggestionFlavor) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{13} +} + +type SuggestionSeverity int32 + +const ( + SuggestionSeverity_SUGGESTION_SEVERITY_UNSPECIFIED SuggestionSeverity = 0 + SuggestionSeverity_SUGGESTION_SEVERITY_INFO SuggestionSeverity = 1 + SuggestionSeverity_SUGGESTION_SEVERITY_RECOMMENDED SuggestionSeverity = 2 + SuggestionSeverity_SUGGESTION_SEVERITY_STRONG SuggestionSeverity = 3 +) + +// Enum value maps for SuggestionSeverity. +var ( + SuggestionSeverity_name = map[int32]string{ + 0: "SUGGESTION_SEVERITY_UNSPECIFIED", + 1: "SUGGESTION_SEVERITY_INFO", + 2: "SUGGESTION_SEVERITY_RECOMMENDED", + 3: "SUGGESTION_SEVERITY_STRONG", + } + SuggestionSeverity_value = map[string]int32{ + "SUGGESTION_SEVERITY_UNSPECIFIED": 0, + "SUGGESTION_SEVERITY_INFO": 1, + "SUGGESTION_SEVERITY_RECOMMENDED": 2, + "SUGGESTION_SEVERITY_STRONG": 3, + } +) + +func (x SuggestionSeverity) Enum() *SuggestionSeverity { + p := new(SuggestionSeverity) + *p = x + return p +} + +func (x SuggestionSeverity) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SuggestionSeverity) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[14].Descriptor() +} + +func (SuggestionSeverity) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[14] +} + +func (x SuggestionSeverity) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SuggestionSeverity.Descriptor instead. +func (SuggestionSeverity) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{14} +} + +// EvidenceScope records what population an evidence item was measured against. POOL means +// the nodes attributed to this policy's live NodePools; CLUSTER is the cold-start +// fallback for policies with no live nodes yet. +type EvidenceScope int32 + +const ( + EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED EvidenceScope = 0 + EvidenceScope_EVIDENCE_SCOPE_POOL EvidenceScope = 1 + EvidenceScope_EVIDENCE_SCOPE_CLUSTER EvidenceScope = 2 +) + +// Enum value maps for EvidenceScope. +var ( + EvidenceScope_name = map[int32]string{ + 0: "EVIDENCE_SCOPE_UNSPECIFIED", + 1: "EVIDENCE_SCOPE_POOL", + 2: "EVIDENCE_SCOPE_CLUSTER", + } + EvidenceScope_value = map[string]int32{ + "EVIDENCE_SCOPE_UNSPECIFIED": 0, + "EVIDENCE_SCOPE_POOL": 1, + "EVIDENCE_SCOPE_CLUSTER": 2, + } +) + +func (x EvidenceScope) Enum() *EvidenceScope { + p := new(EvidenceScope) + *p = x + return p +} + +func (x EvidenceScope) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EvidenceScope) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[15].Descriptor() +} + +func (EvidenceScope) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[15] +} + +func (x EvidenceScope) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EvidenceScope.Descriptor instead. +func (EvidenceScope) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{15} } type TargetFilterType int32 @@ -413,11 +1018,11 @@ func (x TargetFilterType) String() string { } func (TargetFilterType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[6].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[16].Descriptor() } func (TargetFilterType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[6] + return &file_api_v1_recommendation_proto_enumTypes[16] } func (x TargetFilterType) Number() protoreflect.EnumNumber { @@ -426,7 +1031,7 @@ func (x TargetFilterType) Number() protoreflect.EnumNumber { // Deprecated: Use TargetFilterType.Descriptor instead. func (TargetFilterType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{6} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{16} } type InstanceStorePolicy int32 @@ -456,11 +1061,11 @@ func (x InstanceStorePolicy) String() string { } func (InstanceStorePolicy) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[7].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[17].Descriptor() } func (InstanceStorePolicy) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[7] + return &file_api_v1_recommendation_proto_enumTypes[17] } func (x InstanceStorePolicy) Number() protoreflect.EnumNumber { @@ -469,7 +1074,7 @@ func (x InstanceStorePolicy) Number() protoreflect.EnumNumber { // Deprecated: Use InstanceStorePolicy.Descriptor instead. func (InstanceStorePolicy) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{7} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{17} } type ActionTrigger int32 @@ -508,11 +1113,11 @@ func (x ActionTrigger) String() string { } func (ActionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[8].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[18].Descriptor() } func (ActionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[8] + return &file_api_v1_recommendation_proto_enumTypes[18] } func (x ActionTrigger) Number() protoreflect.EnumNumber { @@ -521,7 +1126,7 @@ func (x ActionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use ActionTrigger.Descriptor instead. func (ActionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{8} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{18} } type WorkloadDetectionTrigger int32 @@ -560,11 +1165,11 @@ func (x WorkloadDetectionTrigger) String() string { } func (WorkloadDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[9].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[19].Descriptor() } func (WorkloadDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[9] + return &file_api_v1_recommendation_proto_enumTypes[19] } func (x WorkloadDetectionTrigger) Number() protoreflect.EnumNumber { @@ -573,7 +1178,7 @@ func (x WorkloadDetectionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use WorkloadDetectionTrigger.Descriptor instead. func (WorkloadDetectionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{9} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{19} } type NodeGroupDetectionTrigger int32 @@ -606,11 +1211,11 @@ func (x NodeGroupDetectionTrigger) String() string { } func (NodeGroupDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[20].Descriptor() } func (NodeGroupDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[10] + return &file_api_v1_recommendation_proto_enumTypes[20] } func (x NodeGroupDetectionTrigger) Number() protoreflect.EnumNumber { @@ -619,7 +1224,7 @@ func (x NodeGroupDetectionTrigger) Number() protoreflect.EnumNumber { // Deprecated: Use NodeGroupDetectionTrigger.Descriptor instead. func (NodeGroupDetectionTrigger) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{10} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{20} } type NodeGroupActionsAllowed int32 @@ -664,11 +1269,11 @@ func (x NodeGroupActionsAllowed) String() string { } func (NodeGroupActionsAllowed) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[11].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[21].Descriptor() } func (NodeGroupActionsAllowed) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[11] + return &file_api_v1_recommendation_proto_enumTypes[21] } func (x NodeGroupActionsAllowed) Number() protoreflect.EnumNumber { @@ -677,7 +1282,7 @@ func (x NodeGroupActionsAllowed) Number() protoreflect.EnumNumber { // Deprecated: Use NodeGroupActionsAllowed.Descriptor instead. func (NodeGroupActionsAllowed) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{11} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{21} } type RecommendationMode int32 @@ -716,11 +1321,11 @@ func (x RecommendationMode) String() string { } func (RecommendationMode) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[12].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[22].Descriptor() } func (RecommendationMode) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[12] + return &file_api_v1_recommendation_proto_enumTypes[22] } func (x RecommendationMode) Number() protoreflect.EnumNumber { @@ -729,43 +1334,55 @@ func (x RecommendationMode) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationMode.Descriptor instead. func (RecommendationMode) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{12} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{22} } type RecommendationType int32 const ( - RecommendationType_RECOMMENDATION_TYPE_UNSPECIFIED RecommendationType = 0 - RecommendationType_RECOMMENDATION_TYPE_WORKLOAD RecommendationType = 1 - RecommendationType_RECOMMENDATION_TYPE_NODE_GROUP RecommendationType = 2 - RecommendationType_RECOMMENDATION_TYPE_NODE_CRD RecommendationType = 3 - RecommendationType_RECOMMENDATION_TYPE_GENERIC_RESOURCE RecommendationType = 4 - RecommendationType_RECOMMENDATION_TYPE_PVC_STORAGE RecommendationType = 5 - RecommendationType_RECOMMENDATION_TYPE_WORKLOAD_RULE RecommendationType = 6 - RecommendationType_RECOMMENDATION_TYPE_KARPENTER_SETTINGS RecommendationType = 7 + RecommendationType_RECOMMENDATION_TYPE_UNSPECIFIED RecommendationType = 0 + RecommendationType_RECOMMENDATION_TYPE_WORKLOAD RecommendationType = 1 + RecommendationType_RECOMMENDATION_TYPE_NODE_GROUP RecommendationType = 2 + RecommendationType_RECOMMENDATION_TYPE_NODE_CRD RecommendationType = 3 + RecommendationType_RECOMMENDATION_TYPE_GENERIC_RESOURCE RecommendationType = 4 + RecommendationType_RECOMMENDATION_TYPE_PVC_STORAGE RecommendationType = 5 + RecommendationType_RECOMMENDATION_TYPE_WORKLOAD_RULE RecommendationType = 6 + RecommendationType_RECOMMENDATION_TYPE_KARPENTER_SETTINGS RecommendationType = 7 + RecommendationType_RECOMMENDATION_TYPE_SNAPSHOT_CRD RecommendationType = 8 + RecommendationType_RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD RecommendationType = 9 + RecommendationType_RECOMMENDATION_TYPE_HPA_CONNECTOR RecommendationType = 10 + RecommendationType_RECOMMENDATION_TYPE_SCHEDULER_POLICY RecommendationType = 11 ) // Enum value maps for RecommendationType. var ( RecommendationType_name = map[int32]string{ - 0: "RECOMMENDATION_TYPE_UNSPECIFIED", - 1: "RECOMMENDATION_TYPE_WORKLOAD", - 2: "RECOMMENDATION_TYPE_NODE_GROUP", - 3: "RECOMMENDATION_TYPE_NODE_CRD", - 4: "RECOMMENDATION_TYPE_GENERIC_RESOURCE", - 5: "RECOMMENDATION_TYPE_PVC_STORAGE", - 6: "RECOMMENDATION_TYPE_WORKLOAD_RULE", - 7: "RECOMMENDATION_TYPE_KARPENTER_SETTINGS", + 0: "RECOMMENDATION_TYPE_UNSPECIFIED", + 1: "RECOMMENDATION_TYPE_WORKLOAD", + 2: "RECOMMENDATION_TYPE_NODE_GROUP", + 3: "RECOMMENDATION_TYPE_NODE_CRD", + 4: "RECOMMENDATION_TYPE_GENERIC_RESOURCE", + 5: "RECOMMENDATION_TYPE_PVC_STORAGE", + 6: "RECOMMENDATION_TYPE_WORKLOAD_RULE", + 7: "RECOMMENDATION_TYPE_KARPENTER_SETTINGS", + 8: "RECOMMENDATION_TYPE_SNAPSHOT_CRD", + 9: "RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD", + 10: "RECOMMENDATION_TYPE_HPA_CONNECTOR", + 11: "RECOMMENDATION_TYPE_SCHEDULER_POLICY", } RecommendationType_value = map[string]int32{ - "RECOMMENDATION_TYPE_UNSPECIFIED": 0, - "RECOMMENDATION_TYPE_WORKLOAD": 1, - "RECOMMENDATION_TYPE_NODE_GROUP": 2, - "RECOMMENDATION_TYPE_NODE_CRD": 3, - "RECOMMENDATION_TYPE_GENERIC_RESOURCE": 4, - "RECOMMENDATION_TYPE_PVC_STORAGE": 5, - "RECOMMENDATION_TYPE_WORKLOAD_RULE": 6, - "RECOMMENDATION_TYPE_KARPENTER_SETTINGS": 7, + "RECOMMENDATION_TYPE_UNSPECIFIED": 0, + "RECOMMENDATION_TYPE_WORKLOAD": 1, + "RECOMMENDATION_TYPE_NODE_GROUP": 2, + "RECOMMENDATION_TYPE_NODE_CRD": 3, + "RECOMMENDATION_TYPE_GENERIC_RESOURCE": 4, + "RECOMMENDATION_TYPE_PVC_STORAGE": 5, + "RECOMMENDATION_TYPE_WORKLOAD_RULE": 6, + "RECOMMENDATION_TYPE_KARPENTER_SETTINGS": 7, + "RECOMMENDATION_TYPE_SNAPSHOT_CRD": 8, + "RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD": 9, + "RECOMMENDATION_TYPE_HPA_CONNECTOR": 10, + "RECOMMENDATION_TYPE_SCHEDULER_POLICY": 11, } ) @@ -780,11 +1397,11 @@ func (x RecommendationType) String() string { } func (RecommendationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[13].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[23].Descriptor() } func (RecommendationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[13] + return &file_api_v1_recommendation_proto_enumTypes[23] } func (x RecommendationType) Number() protoreflect.EnumNumber { @@ -793,7 +1410,7 @@ func (x RecommendationType) Number() protoreflect.EnumNumber { // Deprecated: Use RecommendationType.Descriptor instead. func (RecommendationType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{13} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{23} } type HPAMetricType int32 @@ -838,11 +1455,11 @@ func (x HPAMetricType) String() string { } func (HPAMetricType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[14].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[24].Descriptor() } func (HPAMetricType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[14] + return &file_api_v1_recommendation_proto_enumTypes[24] } func (x HPAMetricType) Number() protoreflect.EnumNumber { @@ -851,7 +1468,7 @@ func (x HPAMetricType) Number() protoreflect.EnumNumber { // Deprecated: Use HPAMetricType.Descriptor instead. func (HPAMetricType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{14} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{24} } type PvcOperationType int32 @@ -887,11 +1504,11 @@ func (x PvcOperationType) String() string { } func (PvcOperationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[15].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[25].Descriptor() } func (PvcOperationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[15] + return &file_api_v1_recommendation_proto_enumTypes[25] } func (x PvcOperationType) Number() protoreflect.EnumNumber { @@ -900,7 +1517,186 @@ func (x PvcOperationType) Number() protoreflect.EnumNumber { // Deprecated: Use PvcOperationType.Descriptor instead. func (PvcOperationType) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{15} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{25} +} + +// WorkloadRuleAction is what should happen to a policy's already-generated +// rules when the policy is disabled. Modeled as an enum (not a bool) because +// KEEP/REMOVE won't stay the only two options. +type WorkloadRuleAction int32 + +const ( + WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED WorkloadRuleAction = 0 + // Detach: rules survive and keep optimizing, but revert to + // auto_optimization ownership instead of being regenerated by this policy. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_KEEP WorkloadRuleAction = 1 + // Delete the rules and their in-cluster CRDs; workloads are no longer + // optimized by them. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_REMOVE WorkloadRuleAction = 2 + // Detach AND disable: same detach semantics as KEEP, but the rules become + // full no-ops (disabled=true) until manually re-enabled. Re-enabling this + // policy does NOT automatically re-enable them. + WorkloadRuleAction_WORKLOAD_RULE_ACTION_DISABLE WorkloadRuleAction = 3 +) + +// Enum value maps for WorkloadRuleAction. +var ( + WorkloadRuleAction_name = map[int32]string{ + 0: "WORKLOAD_RULE_ACTION_UNSPECIFIED", + 1: "WORKLOAD_RULE_ACTION_KEEP", + 2: "WORKLOAD_RULE_ACTION_REMOVE", + 3: "WORKLOAD_RULE_ACTION_DISABLE", + } + WorkloadRuleAction_value = map[string]int32{ + "WORKLOAD_RULE_ACTION_UNSPECIFIED": 0, + "WORKLOAD_RULE_ACTION_KEEP": 1, + "WORKLOAD_RULE_ACTION_REMOVE": 2, + "WORKLOAD_RULE_ACTION_DISABLE": 3, + } +) + +func (x WorkloadRuleAction) Enum() *WorkloadRuleAction { + p := new(WorkloadRuleAction) + *p = x + return p +} + +func (x WorkloadRuleAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WorkloadRuleAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[26].Descriptor() +} + +func (WorkloadRuleAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[26] +} + +func (x WorkloadRuleAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WorkloadRuleAction.Descriptor instead. +func (WorkloadRuleAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{26} +} + +type WorkloadOptimizationPolicyMatchStatus int32 + +const ( + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED WorkloadOptimizationPolicyMatchStatus = 0 + // No workload_rule exists yet for this workload — saving the policy as + // configured would create one. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE WorkloadOptimizationPolicyMatchStatus = 1 + // A rule already exists and is owned by this policy (edit mode only) — + // saving would leave it as-is (recalibration happens on its own cadence). + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY WorkloadOptimizationPolicyMatchStatus = 2 + // Matched the selector, but a manually-managed rule already exists — + // this policy will never touch it. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL WorkloadOptimizationPolicyMatchStatus = 3 + // Matched the selector, but a CRD-managed (kubectl-applied) rule already + // exists — this policy will never touch it. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD WorkloadOptimizationPolicyMatchStatus = 4 + // Matched the selector, but a different policy already owns the rule — + // this policy will not steal it. See owning_policy_id/owning_policy_name. + WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY WorkloadOptimizationPolicyMatchStatus = 5 +) + +// Enum value maps for WorkloadOptimizationPolicyMatchStatus. +var ( + WorkloadOptimizationPolicyMatchStatus_name = map[int32]string{ + 0: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED", + 1: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE", + 2: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY", + 3: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL", + 4: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD", + 5: "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY", + } + WorkloadOptimizationPolicyMatchStatus_value = map[string]int32{ + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED": 0, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE": 1, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY": 2, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL": 3, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD": 4, + "WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY": 5, + } +) + +func (x WorkloadOptimizationPolicyMatchStatus) Enum() *WorkloadOptimizationPolicyMatchStatus { + p := new(WorkloadOptimizationPolicyMatchStatus) + *p = x + return p +} + +func (x WorkloadOptimizationPolicyMatchStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WorkloadOptimizationPolicyMatchStatus) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[27].Descriptor() +} + +func (WorkloadOptimizationPolicyMatchStatus) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[27] +} + +func (x WorkloadOptimizationPolicyMatchStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use WorkloadOptimizationPolicyMatchStatus.Descriptor instead. +func (WorkloadOptimizationPolicyMatchStatus) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{27} +} + +type SchedulerUnhealthyReason int32 + +const ( + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED SchedulerUnhealthyReason = 0 + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED SchedulerUnhealthyReason = 1 + SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK SchedulerUnhealthyReason = 2 +) + +// Enum value maps for SchedulerUnhealthyReason. +var ( + SchedulerUnhealthyReason_name = map[int32]string{ + 0: "SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED", + 1: "SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED", + 2: "SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK", + } + SchedulerUnhealthyReason_value = map[string]int32{ + "SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED": 0, + "SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED": 1, + "SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK": 2, + } +) + +func (x SchedulerUnhealthyReason) Enum() *SchedulerUnhealthyReason { + p := new(SchedulerUnhealthyReason) + *p = x + return p +} + +func (x SchedulerUnhealthyReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerUnhealthyReason) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[28].Descriptor() +} + +func (SchedulerUnhealthyReason) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[28] +} + +func (x SchedulerUnhealthyReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerUnhealthyReason.Descriptor instead. +func (SchedulerUnhealthyReason) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{28} } // WorkloadRuleSource identifies who created/last-modified a WorkloadRule. @@ -959,11 +1755,11 @@ func (x WorkloadRuleSource) String() string { } func (WorkloadRuleSource) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[16].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[29].Descriptor() } func (WorkloadRuleSource) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[16] + return &file_api_v1_recommendation_proto_enumTypes[29] } func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { @@ -972,7 +1768,279 @@ func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { // Deprecated: Use WorkloadRuleSource.Descriptor instead. func (WorkloadRuleSource) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{16} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{29} +} + +// NodeCheckpointLabelState describes the last-known per-node apply outcome for +// the checkpoint-restore label. PENDING/FAILED reflect the most recent +// generic_resource_recommendations row; NONE means we have no apply attempt +// on record for the node — has_label may still be true (label inherited via +// the Karpenter NodePool template, or set manually). +type NodeCheckpointLabelState int32 + +const ( + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED NodeCheckpointLabelState = 0 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_NONE NodeCheckpointLabelState = 1 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_PENDING NodeCheckpointLabelState = 2 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_APPLIED NodeCheckpointLabelState = 3 + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_FAILED NodeCheckpointLabelState = 4 + // REJECTED lumps every other terminal status (superseded, blocked, ignored) + // — the UI surfaces them collectively as "did not apply". + NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_REJECTED NodeCheckpointLabelState = 5 +) + +// Enum value maps for NodeCheckpointLabelState. +var ( + NodeCheckpointLabelState_name = map[int32]string{ + 0: "NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED", + 1: "NODE_CHECKPOINT_LABEL_STATE_NONE", + 2: "NODE_CHECKPOINT_LABEL_STATE_PENDING", + 3: "NODE_CHECKPOINT_LABEL_STATE_APPLIED", + 4: "NODE_CHECKPOINT_LABEL_STATE_FAILED", + 5: "NODE_CHECKPOINT_LABEL_STATE_REJECTED", + } + NodeCheckpointLabelState_value = map[string]int32{ + "NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED": 0, + "NODE_CHECKPOINT_LABEL_STATE_NONE": 1, + "NODE_CHECKPOINT_LABEL_STATE_PENDING": 2, + "NODE_CHECKPOINT_LABEL_STATE_APPLIED": 3, + "NODE_CHECKPOINT_LABEL_STATE_FAILED": 4, + "NODE_CHECKPOINT_LABEL_STATE_REJECTED": 5, + } +) + +func (x NodeCheckpointLabelState) Enum() *NodeCheckpointLabelState { + p := new(NodeCheckpointLabelState) + *p = x + return p +} + +func (x NodeCheckpointLabelState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NodeCheckpointLabelState) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[30].Descriptor() +} + +func (NodeCheckpointLabelState) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[30] +} + +func (x NodeCheckpointLabelState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NodeCheckpointLabelState.Descriptor instead. +func (NodeCheckpointLabelState) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{30} +} + +type ForensicPostSnapshotAction int32 + +const ( + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED ForensicPostSnapshotAction = 0 + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_NONE ForensicPostSnapshotAction = 1 + ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD ForensicPostSnapshotAction = 2 +) + +// Enum value maps for ForensicPostSnapshotAction. +var ( + ForensicPostSnapshotAction_name = map[int32]string{ + 0: "FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED", + 1: "FORENSIC_POST_SNAPSHOT_ACTION_NONE", + 2: "FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD", + } + ForensicPostSnapshotAction_value = map[string]int32{ + "FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED": 0, + "FORENSIC_POST_SNAPSHOT_ACTION_NONE": 1, + "FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD": 2, + } +) + +func (x ForensicPostSnapshotAction) Enum() *ForensicPostSnapshotAction { + p := new(ForensicPostSnapshotAction) + *p = x + return p +} + +func (x ForensicPostSnapshotAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ForensicPostSnapshotAction) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[31].Descriptor() +} + +func (ForensicPostSnapshotAction) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[31] +} + +func (x ForensicPostSnapshotAction) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ForensicPostSnapshotAction.Descriptor instead. +func (ForensicPostSnapshotAction) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{31} +} + +// DELETED: no live enrollments existed (or force) — policy soft-deleted now. +// REVERTING: reverts initiated; delete finalizes when acks arrive. +type DeleteSchedulerPolicyResponse_Outcome int32 + +const ( + DeleteSchedulerPolicyResponse_OUTCOME_UNSPECIFIED DeleteSchedulerPolicyResponse_Outcome = 0 + DeleteSchedulerPolicyResponse_OUTCOME_DELETED DeleteSchedulerPolicyResponse_Outcome = 1 + DeleteSchedulerPolicyResponse_OUTCOME_REVERTING DeleteSchedulerPolicyResponse_Outcome = 2 +) + +// Enum value maps for DeleteSchedulerPolicyResponse_Outcome. +var ( + DeleteSchedulerPolicyResponse_Outcome_name = map[int32]string{ + 0: "OUTCOME_UNSPECIFIED", + 1: "OUTCOME_DELETED", + 2: "OUTCOME_REVERTING", + } + DeleteSchedulerPolicyResponse_Outcome_value = map[string]int32{ + "OUTCOME_UNSPECIFIED": 0, + "OUTCOME_DELETED": 1, + "OUTCOME_REVERTING": 2, + } +) + +func (x DeleteSchedulerPolicyResponse_Outcome) Enum() *DeleteSchedulerPolicyResponse_Outcome { + p := new(DeleteSchedulerPolicyResponse_Outcome) + *p = x + return p +} + +func (x DeleteSchedulerPolicyResponse_Outcome) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeleteSchedulerPolicyResponse_Outcome) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[32].Descriptor() +} + +func (DeleteSchedulerPolicyResponse_Outcome) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[32] +} + +func (x DeleteSchedulerPolicyResponse_Outcome) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DeleteSchedulerPolicyResponse_Outcome.Descriptor instead. +func (DeleteSchedulerPolicyResponse_Outcome) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{418, 0} +} + +type SchedulerPolicyTargetMatch_Status int32 + +const ( + SchedulerPolicyTargetMatch_STATUS_UNSPECIFIED SchedulerPolicyTargetMatch_Status = 0 + SchedulerPolicyTargetMatch_NEW_ENROLLMENT SchedulerPolicyTargetMatch_Status = 1 // would enroll + SchedulerPolicyTargetMatch_ALREADY_ENROLLED_THIS_POLICY SchedulerPolicyTargetMatch_Status = 2 // no change + SchedulerPolicyTargetMatch_ENROLLED_BY_OTHER_POLICY SchedulerPolicyTargetMatch_Status = 3 // precedence: stays with its owner +) + +// Enum value maps for SchedulerPolicyTargetMatch_Status. +var ( + SchedulerPolicyTargetMatch_Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "NEW_ENROLLMENT", + 2: "ALREADY_ENROLLED_THIS_POLICY", + 3: "ENROLLED_BY_OTHER_POLICY", + } + SchedulerPolicyTargetMatch_Status_value = map[string]int32{ + "STATUS_UNSPECIFIED": 0, + "NEW_ENROLLMENT": 1, + "ALREADY_ENROLLED_THIS_POLICY": 2, + "ENROLLED_BY_OTHER_POLICY": 3, + } +) + +func (x SchedulerPolicyTargetMatch_Status) Enum() *SchedulerPolicyTargetMatch_Status { + p := new(SchedulerPolicyTargetMatch_Status) + *p = x + return p +} + +func (x SchedulerPolicyTargetMatch_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerPolicyTargetMatch_Status) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[33].Descriptor() +} + +func (SchedulerPolicyTargetMatch_Status) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[33] +} + +func (x SchedulerPolicyTargetMatch_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerPolicyTargetMatch_Status.Descriptor instead. +func (SchedulerPolicyTargetMatch_Status) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{420, 0} +} + +type SchedulerPolicyEnrollment_State int32 + +const ( + SchedulerPolicyEnrollment_STATE_UNSPECIFIED SchedulerPolicyEnrollment_State = 0 + SchedulerPolicyEnrollment_STATE_ACTIVE SchedulerPolicyEnrollment_State = 1 + SchedulerPolicyEnrollment_STATE_PENDING_REVERT SchedulerPolicyEnrollment_State = 2 + SchedulerPolicyEnrollment_STATE_REVERTED SchedulerPolicyEnrollment_State = 3 + SchedulerPolicyEnrollment_STATE_ABANDONED SchedulerPolicyEnrollment_State = 4 +) + +// Enum value maps for SchedulerPolicyEnrollment_State. +var ( + SchedulerPolicyEnrollment_State_name = map[int32]string{ + 0: "STATE_UNSPECIFIED", + 1: "STATE_ACTIVE", + 2: "STATE_PENDING_REVERT", + 3: "STATE_REVERTED", + 4: "STATE_ABANDONED", + } + SchedulerPolicyEnrollment_State_value = map[string]int32{ + "STATE_UNSPECIFIED": 0, + "STATE_ACTIVE": 1, + "STATE_PENDING_REVERT": 2, + "STATE_REVERTED": 3, + "STATE_ABANDONED": 4, + } +) + +func (x SchedulerPolicyEnrollment_State) Enum() *SchedulerPolicyEnrollment_State { + p := new(SchedulerPolicyEnrollment_State) + *p = x + return p +} + +func (x SchedulerPolicyEnrollment_State) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SchedulerPolicyEnrollment_State) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[34].Descriptor() +} + +func (SchedulerPolicyEnrollment_State) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[34] +} + +func (x SchedulerPolicyEnrollment_State) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SchedulerPolicyEnrollment_State.Descriptor instead. +func (SchedulerPolicyEnrollment_State) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{423, 0} } type GetRecommendationsRequest struct { @@ -1971,14 +3039,8 @@ type GetPreviewWorkloadRecommendationRequest struct { PolicyId string `protobuf:"bytes,7,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` // Moment in time for which the recommendations are requested // If not set, the current time is used - Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - VpaLookback *durationpb.Duration `protobuf:"bytes,9,opt,name=vpa_lookback,json=vpaLookback,proto3" json:"vpa_lookback,omitempty"` - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - HpaLookback *durationpb.Duration `protobuf:"bytes,10,opt,name=hpa_lookback,json=hpaLookback,proto3" json:"hpa_lookback,omitempty"` - IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } func (x *GetPreviewWorkloadRecommendationRequest) Reset() { @@ -2069,20 +3131,6 @@ func (x *GetPreviewWorkloadRecommendationRequest) GetTimestamp() *timestamppb.Ti return nil } -func (x *GetPreviewWorkloadRecommendationRequest) GetVpaLookback() *durationpb.Duration { - if x != nil { - return x.VpaLookback - } - return nil -} - -func (x *GetPreviewWorkloadRecommendationRequest) GetHpaLookback() *durationpb.Duration { - if x != nil { - return x.HpaLookback - } - return nil -} - func (x *GetPreviewWorkloadRecommendationRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -2148,14 +3196,8 @@ type GetPreviewWorkloadRecommendationsRequest struct { Workloads []*WorkloadIdentifier `protobuf:"bytes,4,rep,name=workloads,proto3" json:"workloads,omitempty"` // Moment in time for which the recommendations are requested // If not set, the current time is used - Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - VpaLookback *durationpb.Duration `protobuf:"bytes,6,opt,name=vpa_lookback,json=vpaLookback,proto3" json:"vpa_lookback,omitempty"` - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - HpaLookback *durationpb.Duration `protobuf:"bytes,7,opt,name=hpa_lookback,json=hpaLookback,proto3" json:"hpa_lookback,omitempty"` - IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } func (x *GetPreviewWorkloadRecommendationsRequest) Reset() { @@ -2225,20 +3267,6 @@ func (x *GetPreviewWorkloadRecommendationsRequest) GetTimestamp() *timestamppb.T return nil } -func (x *GetPreviewWorkloadRecommendationsRequest) GetVpaLookback() *durationpb.Duration { - if x != nil { - return x.VpaLookback - } - return nil -} - -func (x *GetPreviewWorkloadRecommendationsRequest) GetHpaLookback() *durationpb.Duration { - if x != nil { - return x.HpaLookback - } - return nil -} - func (x *GetPreviewWorkloadRecommendationsRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -5077,17 +6105,20 @@ type WorkloadPolicyTarget struct { Priority int32 `protobuf:"varint,7,opt,name=priority,proto3" json:"priority,omitempty"` Enabled bool `protobuf:"varint,8,opt,name=enabled,proto3" json:"enabled,omitempty"` // Targeting criteria (AND logic between non-null fields) - NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels - KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds - NamespacePattern *RegexPattern `protobuf:"bytes,17,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern - NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // target workloads running on specific nodes - ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,11,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + WorkloadSelector *LabelSelector `protobuf:"bytes,12,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` // Target workloads by labels + KindFilter []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` // Target specific workload kinds + NamespacePattern *RegexPattern `protobuf:"bytes,17,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,18,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,19,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,21,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } func (x *WorkloadPolicyTarget) Reset() { @@ -5228,6 +6259,21 @@ func (x *WorkloadPolicyTarget) GetNamespacePattern() *RegexPattern { return nil } +func (x *WorkloadPolicyTarget) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *WorkloadPolicyTarget) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *WorkloadPolicyTarget) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5276,8 +6322,11 @@ type CreateWorkloadPolicyTargetRequest struct { NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,19,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,20,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds ClusterIds []string `protobuf:"bytes,21,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` } @@ -5405,6 +6454,7 @@ func (x *CreateWorkloadPolicyTargetRequest) GetWorkloadNames() []string { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *CreateWorkloadPolicyTargetRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5419,6 +6469,20 @@ func (x *CreateWorkloadPolicyTargetRequest) GetNamespacePattern() *RegexPattern return nil } +func (x *CreateWorkloadPolicyTargetRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *CreateWorkloadPolicyTargetRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *CreateWorkloadPolicyTargetRequest) GetClusterIds() []string { if x != nil { return x.ClusterIds @@ -5713,9 +6777,12 @@ type UpdateWorkloadPolicyTargetRequest struct { NamePattern *RegexPattern `protobuf:"bytes,14,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern - PolicyId *string `protobuf:"bytes,21,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // should only be set when target needs to be attached to diff policy + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,17,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,18,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,19,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,20,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds + PolicyId *string `protobuf:"bytes,21,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // should only be set when target needs to be attached to diff policy ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` } @@ -5843,6 +6910,7 @@ func (x *UpdateWorkloadPolicyTargetRequest) GetWorkloadNames() []string { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *UpdateWorkloadPolicyTargetRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -5857,6 +6925,20 @@ func (x *UpdateWorkloadPolicyTargetRequest) GetNamespacePattern() *RegexPattern return nil } +func (x *UpdateWorkloadPolicyTargetRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *UpdateWorkloadPolicyTargetRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *UpdateWorkloadPolicyTargetRequest) GetPolicyId() string { if x != nil && x.PolicyId != nil { return *x.PolicyId @@ -6262,8 +7344,11 @@ type PreviewWorkloadPolicyTargetMatchesRequest struct { NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern AnnotationSelector *LabelSelector `protobuf:"bytes,7,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,8,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,9,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,10,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + NodeGroupNames []string `protobuf:"bytes,9,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Deprecated: unused by any active target; removed from the UI. + NamespacePattern *RegexPattern `protobuf:"bytes,10,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,11,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,12,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds } func (x *PreviewWorkloadPolicyTargetMatchesRequest) Reset() { @@ -6354,6 +7439,7 @@ func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetWorkloadNames() []string return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetNodeGroupNames() []string { if x != nil { return x.NodeGroupNames @@ -6368,6 +7454,20 @@ func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetNamespacePattern() *Regex return nil } +func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *PreviewWorkloadPolicyTargetMatchesRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + type PreviewWorkloadPolicyTargetMatchesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6430,9 +7530,15 @@ type GetPreviewWorkloadPolicyTargetRecommendationsRequest struct { AnnotationSelector *LabelSelector `protobuf:"bytes,8,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` // Target workloads by annotations WorkloadNames []string `protobuf:"bytes,9,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` NodeGroupNames []string `protobuf:"bytes,10,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - NamespacePattern *RegexPattern `protobuf:"bytes,11,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + NamespacePattern *RegexPattern `protobuf:"bytes,11,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadNamesNotIn []string `protobuf:"bytes,12,rep,name=workload_names_not_in,json=workloadNamesNotIn,proto3" json:"workload_names_not_in,omitempty"` // Exclude specific workload names + KindFilterNotIn []K8SObjectKind `protobuf:"varint,13,rep,packed,name=kind_filter_not_in,json=kindFilterNotIn,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter_not_in,omitempty"` // Exclude specific workload kinds IncludeDeleted bool `protobuf:"varint,21,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` ClusterIds []string `protobuf:"bytes,31,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + // Priority of the previewed target; used to determine who wins when a + // competing target exists for the same workload. When absent, collision + // detection is skipped and collisions_by_workload_uid is empty. + Priority *int32 `protobuf:"varint,32,opt,name=priority,proto3,oneof" json:"priority,omitempty"` } func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) Reset() { @@ -6537,6 +7643,20 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetNamespacePatte return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetWorkloadNamesNotIn() []string { + if x != nil { + return x.WorkloadNamesNotIn + } + return nil +} + +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetKindFilterNotIn() []K8SObjectKind { + if x != nil { + return x.KindFilterNotIn + } + return nil +} + func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetIncludeDeleted() bool { if x != nil { return x.IncludeDeleted @@ -6551,6 +7671,84 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetClusterIds() [ return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsRequest) GetPriority() int32 { + if x != nil && x.Priority != nil { + return *x.Priority + } + return 0 +} + +type WorkloadCollisionInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + TargetId string `protobuf:"bytes,3,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TargetName string `protobuf:"bytes,4,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` +} + +func (x *WorkloadCollisionInfo) Reset() { + *x = WorkloadCollisionInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadCollisionInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadCollisionInfo) ProtoMessage() {} + +func (x *WorkloadCollisionInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[77] + 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 WorkloadCollisionInfo.ProtoReflect.Descriptor instead. +func (*WorkloadCollisionInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{77} +} + +func (x *WorkloadCollisionInfo) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *WorkloadCollisionInfo) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *WorkloadCollisionInfo) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *WorkloadCollisionInfo) GetTargetName() string { + if x != nil { + return x.TargetName + } + return "" +} + type GetPreviewWorkloadPolicyTargetRecommendationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6560,12 +7758,18 @@ type GetPreviewWorkloadPolicyTargetRecommendationsResponse struct { WorkloadItems []*WorkloadItem `protobuf:"bytes,2,rep,name=workload_items,json=workloadItems,proto3" json:"workload_items,omitempty"` // Map from workload UID to aggregated percentile summaries across all containers WorkloadPercentiles map[string]*WorkloadPercentileSummary `protobuf:"bytes,3,rep,name=workload_percentiles,json=workloadPercentiles,proto3" json:"workload_percentiles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Workloads where a competing policy's target beats the previewed target. + // Absent entries mean the current policy wins or no competing target exists. + CollisionsByWorkloadUid map[string]*WorkloadCollisionInfo `protobuf:"bytes,4,rep,name=collisions_by_workload_uid,json=collisionsByWorkloadUid,proto3" json:"collisions_by_workload_uid,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // UIDs of workloads skipped because they are managed by optimization rules (MPA v2). + // Policy-based optimization cannot be applied to these workloads. + RuleManagedWorkloadUids []string `protobuf:"bytes,5,rep,name=rule_managed_workload_uids,json=ruleManagedWorkloadUids,proto3" json:"rule_managed_workload_uids,omitempty"` } func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) Reset() { *x = GetPreviewWorkloadPolicyTargetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[77] + mi := &file_api_v1_recommendation_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6578,7 +7782,7 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) String() string func (*GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoMessage() {} func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[77] + mi := &file_api_v1_recommendation_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6591,7 +7795,7 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) ProtoReflect() p // Deprecated: Use GetPreviewWorkloadPolicyTargetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*GetPreviewWorkloadPolicyTargetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{77} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{78} } func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetRecommendations() []*WorkloadRecommendation { @@ -6615,6 +7819,20 @@ func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetWorkloadPerce return nil } +func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetCollisionsByWorkloadUid() map[string]*WorkloadCollisionInfo { + if x != nil { + return x.CollisionsByWorkloadUid + } + return nil +} + +func (x *GetPreviewWorkloadPolicyTargetRecommendationsResponse) GetRuleManagedWorkloadUids() []string { + if x != nil { + return x.RuleManagedWorkloadUids + } + return nil +} + // WorkloadPercentileSummary aggregates percentile metrics across all containers of a workload. type WorkloadPercentileSummary struct { state protoimpl.MessageState @@ -6631,7 +7849,7 @@ type WorkloadPercentileSummary struct { func (x *WorkloadPercentileSummary) Reset() { *x = WorkloadPercentileSummary{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[78] + mi := &file_api_v1_recommendation_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6644,7 +7862,7 @@ func (x *WorkloadPercentileSummary) String() string { func (*WorkloadPercentileSummary) ProtoMessage() {} func (x *WorkloadPercentileSummary) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[78] + mi := &file_api_v1_recommendation_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6657,7 +7875,7 @@ func (x *WorkloadPercentileSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadPercentileSummary.ProtoReflect.Descriptor instead. func (*WorkloadPercentileSummary) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{78} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{79} } func (x *WorkloadPercentileSummary) GetCpuUsage() *MetricPercentiles { @@ -6716,7 +7934,7 @@ type NodeGroupPolicyTarget struct { func (x *NodeGroupPolicyTarget) Reset() { *x = NodeGroupPolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[79] + mi := &file_api_v1_recommendation_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6729,7 +7947,7 @@ func (x *NodeGroupPolicyTarget) String() string { func (*NodeGroupPolicyTarget) ProtoMessage() {} func (x *NodeGroupPolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[79] + mi := &file_api_v1_recommendation_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6742,7 +7960,7 @@ func (x *NodeGroupPolicyTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupPolicyTarget.ProtoReflect.Descriptor instead. func (*NodeGroupPolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{79} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{80} } func (x *NodeGroupPolicyTarget) GetTargetId() string { @@ -6840,7 +8058,7 @@ type CreateNodeGroupPolicyTargetRequest struct { func (x *CreateNodeGroupPolicyTargetRequest) Reset() { *x = CreateNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[80] + mi := &file_api_v1_recommendation_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6853,7 +8071,7 @@ func (x *CreateNodeGroupPolicyTargetRequest) String() string { func (*CreateNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *CreateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[80] + mi := &file_api_v1_recommendation_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6866,7 +8084,7 @@ func (x *CreateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use CreateNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*CreateNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{80} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{81} } func (x *CreateNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -6936,7 +8154,7 @@ type CreateNodeGroupPolicyTargetResponse struct { func (x *CreateNodeGroupPolicyTargetResponse) Reset() { *x = CreateNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[81] + mi := &file_api_v1_recommendation_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6949,7 +8167,7 @@ func (x *CreateNodeGroupPolicyTargetResponse) String() string { func (*CreateNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *CreateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[81] + mi := &file_api_v1_recommendation_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6962,7 +8180,7 @@ func (x *CreateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use CreateNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*CreateNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{81} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{82} } func (x *CreateNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -6984,7 +8202,7 @@ type GetNodeGroupPolicyTargetRequest struct { func (x *GetNodeGroupPolicyTargetRequest) Reset() { *x = GetNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[82] + mi := &file_api_v1_recommendation_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6997,7 +8215,7 @@ func (x *GetNodeGroupPolicyTargetRequest) String() string { func (*GetNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *GetNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[82] + mi := &file_api_v1_recommendation_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7010,7 +8228,7 @@ func (x *GetNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*GetNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{82} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{83} } func (x *GetNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -7038,7 +8256,7 @@ type GetNodeGroupPolicyTargetResponse struct { func (x *GetNodeGroupPolicyTargetResponse) Reset() { *x = GetNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[83] + mi := &file_api_v1_recommendation_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7051,7 +8269,7 @@ func (x *GetNodeGroupPolicyTargetResponse) String() string { func (*GetNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *GetNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[83] + mi := &file_api_v1_recommendation_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7064,7 +8282,7 @@ func (x *GetNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*GetNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{83} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{84} } func (x *GetNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -7088,7 +8306,7 @@ type ListNodeGroupPolicyTargetsRequest struct { func (x *ListNodeGroupPolicyTargetsRequest) Reset() { *x = ListNodeGroupPolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[84] + mi := &file_api_v1_recommendation_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7101,7 +8319,7 @@ func (x *ListNodeGroupPolicyTargetsRequest) String() string { func (*ListNodeGroupPolicyTargetsRequest) ProtoMessage() {} func (x *ListNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[84] + mi := &file_api_v1_recommendation_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7114,7 +8332,7 @@ func (x *ListNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ListNodeGroupPolicyTargetsRequest.ProtoReflect.Descriptor instead. func (*ListNodeGroupPolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{84} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{85} } func (x *ListNodeGroupPolicyTargetsRequest) GetTeamId() string { @@ -7156,7 +8374,7 @@ type ListNodeGroupPolicyTargetsResponse struct { func (x *ListNodeGroupPolicyTargetsResponse) Reset() { *x = ListNodeGroupPolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[85] + mi := &file_api_v1_recommendation_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7169,7 +8387,7 @@ func (x *ListNodeGroupPolicyTargetsResponse) String() string { func (*ListNodeGroupPolicyTargetsResponse) ProtoMessage() {} func (x *ListNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[85] + mi := &file_api_v1_recommendation_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7182,7 +8400,7 @@ func (x *ListNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListNodeGroupPolicyTargetsResponse.ProtoReflect.Descriptor instead. func (*ListNodeGroupPolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{85} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{86} } func (x *ListNodeGroupPolicyTargetsResponse) GetTargets() []*NodeGroupPolicyTarget { @@ -7210,7 +8428,7 @@ type UpdateNodeGroupPolicyTargetRequest struct { func (x *UpdateNodeGroupPolicyTargetRequest) Reset() { *x = UpdateNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[86] + mi := &file_api_v1_recommendation_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7223,7 +8441,7 @@ func (x *UpdateNodeGroupPolicyTargetRequest) String() string { func (*UpdateNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *UpdateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[86] + mi := &file_api_v1_recommendation_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7236,7 +8454,7 @@ func (x *UpdateNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*UpdateNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{86} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{87} } func (x *UpdateNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -7306,7 +8524,7 @@ type UpdateNodeGroupPolicyTargetResponse struct { func (x *UpdateNodeGroupPolicyTargetResponse) Reset() { *x = UpdateNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[87] + mi := &file_api_v1_recommendation_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7319,7 +8537,7 @@ func (x *UpdateNodeGroupPolicyTargetResponse) String() string { func (*UpdateNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *UpdateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[87] + mi := &file_api_v1_recommendation_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7332,7 +8550,7 @@ func (x *UpdateNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*UpdateNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{87} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{88} } func (x *UpdateNodeGroupPolicyTargetResponse) GetTarget() *NodeGroupPolicyTarget { @@ -7354,7 +8572,7 @@ type DeleteNodeGroupPolicyTargetRequest struct { func (x *DeleteNodeGroupPolicyTargetRequest) Reset() { *x = DeleteNodeGroupPolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[88] + mi := &file_api_v1_recommendation_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7367,7 +8585,7 @@ func (x *DeleteNodeGroupPolicyTargetRequest) String() string { func (*DeleteNodeGroupPolicyTargetRequest) ProtoMessage() {} func (x *DeleteNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[88] + mi := &file_api_v1_recommendation_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7380,7 +8598,7 @@ func (x *DeleteNodeGroupPolicyTargetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use DeleteNodeGroupPolicyTargetRequest.ProtoReflect.Descriptor instead. func (*DeleteNodeGroupPolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{88} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{89} } func (x *DeleteNodeGroupPolicyTargetRequest) GetTeamId() string { @@ -7410,7 +8628,7 @@ type ToggleNodeGroupPolicyTargetsRequest struct { func (x *ToggleNodeGroupPolicyTargetsRequest) Reset() { *x = ToggleNodeGroupPolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[89] + mi := &file_api_v1_recommendation_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7423,7 +8641,7 @@ func (x *ToggleNodeGroupPolicyTargetsRequest) String() string { func (*ToggleNodeGroupPolicyTargetsRequest) ProtoMessage() {} func (x *ToggleNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[89] + mi := &file_api_v1_recommendation_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7436,7 +8654,7 @@ func (x *ToggleNodeGroupPolicyTargetsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ToggleNodeGroupPolicyTargetsRequest.ProtoReflect.Descriptor instead. func (*ToggleNodeGroupPolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{89} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{90} } func (x *ToggleNodeGroupPolicyTargetsRequest) GetTeamId() string { @@ -7471,7 +8689,7 @@ type ToggleNodeGroupPolicyTargetsResponse struct { func (x *ToggleNodeGroupPolicyTargetsResponse) Reset() { *x = ToggleNodeGroupPolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[90] + mi := &file_api_v1_recommendation_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7484,7 +8702,7 @@ func (x *ToggleNodeGroupPolicyTargetsResponse) String() string { func (*ToggleNodeGroupPolicyTargetsResponse) ProtoMessage() {} func (x *ToggleNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[90] + mi := &file_api_v1_recommendation_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7497,7 +8715,7 @@ func (x *ToggleNodeGroupPolicyTargetsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ToggleNodeGroupPolicyTargetsResponse.ProtoReflect.Descriptor instead. func (*ToggleNodeGroupPolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{90} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{91} } func (x *ToggleNodeGroupPolicyTargetsResponse) GetSuccess() bool { @@ -7516,7 +8734,7 @@ type DeleteNodeGroupPolicyTargetResponse struct { func (x *DeleteNodeGroupPolicyTargetResponse) Reset() { *x = DeleteNodeGroupPolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[91] + mi := &file_api_v1_recommendation_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7529,7 +8747,7 @@ func (x *DeleteNodeGroupPolicyTargetResponse) String() string { func (*DeleteNodeGroupPolicyTargetResponse) ProtoMessage() {} func (x *DeleteNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[91] + mi := &file_api_v1_recommendation_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7542,7 +8760,7 @@ func (x *DeleteNodeGroupPolicyTargetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use DeleteNodeGroupPolicyTargetResponse.ProtoReflect.Descriptor instead. func (*DeleteNodeGroupPolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{91} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{92} } type PreviewNodeGroupPolicyTargetMatchesRequest struct { @@ -7558,7 +8776,7 @@ type PreviewNodeGroupPolicyTargetMatchesRequest struct { func (x *PreviewNodeGroupPolicyTargetMatchesRequest) Reset() { *x = PreviewNodeGroupPolicyTargetMatchesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[92] + mi := &file_api_v1_recommendation_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7571,7 +8789,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesRequest) String() string { func (*PreviewNodeGroupPolicyTargetMatchesRequest) ProtoMessage() {} func (x *PreviewNodeGroupPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[92] + mi := &file_api_v1_recommendation_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7584,7 +8802,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesRequest) ProtoReflect() protoreflect // Deprecated: Use PreviewNodeGroupPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. func (*PreviewNodeGroupPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{92} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{93} } func (x *PreviewNodeGroupPolicyTargetMatchesRequest) GetTeamId() string { @@ -7619,7 +8837,7 @@ type PreviewNodeGroupPolicyTargetMatchesResponse struct { func (x *PreviewNodeGroupPolicyTargetMatchesResponse) Reset() { *x = PreviewNodeGroupPolicyTargetMatchesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[93] + mi := &file_api_v1_recommendation_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7632,7 +8850,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesResponse) String() string { func (*PreviewNodeGroupPolicyTargetMatchesResponse) ProtoMessage() {} func (x *PreviewNodeGroupPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[93] + mi := &file_api_v1_recommendation_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7645,7 +8863,7 @@ func (x *PreviewNodeGroupPolicyTargetMatchesResponse) ProtoReflect() protoreflec // Deprecated: Use PreviewNodeGroupPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. func (*PreviewNodeGroupPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{93} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{94} } func (x *PreviewNodeGroupPolicyTargetMatchesResponse) GetMatchedNodeGroups() []*NodeGroup { @@ -7669,7 +8887,7 @@ type GetPreviewNodeGroupPolicyTargetRecommendationsRequest struct { func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) Reset() { *x = GetPreviewNodeGroupPolicyTargetRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[94] + mi := &file_api_v1_recommendation_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7682,7 +8900,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) String() string func (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoMessage() {} func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[94] + mi := &file_api_v1_recommendation_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7695,7 +8913,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) ProtoReflect() p // Deprecated: Use GetPreviewNodeGroupPolicyTargetRecommendationsRequest.ProtoReflect.Descriptor instead. func (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{94} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{95} } func (x *GetPreviewNodeGroupPolicyTargetRecommendationsRequest) GetTeamId() string { @@ -7737,7 +8955,7 @@ type GetPreviewNodeGroupPolicyTargetRecommendationsResponse struct { func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) Reset() { *x = GetPreviewNodeGroupPolicyTargetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[95] + mi := &file_api_v1_recommendation_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7750,7 +8968,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) String() string func (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoMessage() {} func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[95] + mi := &file_api_v1_recommendation_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7763,7 +8981,7 @@ func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) ProtoReflect() // Deprecated: Use GetPreviewNodeGroupPolicyTargetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{95} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{96} } func (x *GetPreviewNodeGroupPolicyTargetRecommendationsResponse) GetRecommendations() []*NodeGroupRecommendation { @@ -7784,6 +9002,9 @@ type BalanceGetRecommendationsRequest struct { // *BalanceGetRecommendationsRequest_Apply // *BalanceGetRecommendationsRequest_WorkloadMeta // *BalanceGetRecommendationsRequest_InClusterRecommendation + // *BalanceGetRecommendationsRequest_SnapshotCrStatusReport + // *BalanceGetRecommendationsRequest_SchedulerEnrollmentReport + // *BalanceGetRecommendationsRequest_SchedulerRevertEventReport // *BalanceGetRecommendationsRequest_OperatorHealth // *BalanceGetRecommendationsRequest_AgentHealth Request isBalanceGetRecommendationsRequest_Request `protobuf_oneof:"request"` @@ -7793,7 +9014,7 @@ type BalanceGetRecommendationsRequest struct { func (x *BalanceGetRecommendationsRequest) Reset() { *x = BalanceGetRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[96] + mi := &file_api_v1_recommendation_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7806,7 +9027,7 @@ func (x *BalanceGetRecommendationsRequest) String() string { func (*BalanceGetRecommendationsRequest) ProtoMessage() {} func (x *BalanceGetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[96] + mi := &file_api_v1_recommendation_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7819,7 +9040,7 @@ func (x *BalanceGetRecommendationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceGetRecommendationsRequest.ProtoReflect.Descriptor instead. func (*BalanceGetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{96} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{97} } func (m *BalanceGetRecommendationsRequest) GetRequest() isBalanceGetRecommendationsRequest_Request { @@ -7857,6 +9078,27 @@ func (x *BalanceGetRecommendationsRequest) GetInClusterRecommendation() *Workloa return nil } +func (x *BalanceGetRecommendationsRequest) GetSnapshotCrStatusReport() *SnapshotCRStatusReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SnapshotCrStatusReport); ok { + return x.SnapshotCrStatusReport + } + return nil +} + +func (x *BalanceGetRecommendationsRequest) GetSchedulerEnrollmentReport() *SchedulerEnrollmentReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport); ok { + return x.SchedulerEnrollmentReport + } + return nil +} + +func (x *BalanceGetRecommendationsRequest) GetSchedulerRevertEventReport() *SchedulerRevertEventReport { + if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_SchedulerRevertEventReport); ok { + return x.SchedulerRevertEventReport + } + return nil +} + func (x *BalanceGetRecommendationsRequest) GetOperatorHealth() *OperatorHealth { if x, ok := x.GetRequest().(*BalanceGetRecommendationsRequest_OperatorHealth); ok { return x.OperatorHealth @@ -7901,6 +9143,32 @@ type BalanceGetRecommendationsRequest_InClusterRecommendation struct { InClusterRecommendation *WorkloadRecommendation `protobuf:"bytes,21,opt,name=in_cluster_recommendation,json=inClusterRecommendation,proto3,oneof"` } +type BalanceGetRecommendationsRequest_SnapshotCrStatusReport struct { + // Snapshot policies (spec §8): periodic full snapshot of the + // dakr-managed criu.org CR statuses from the cluster. The operator + // emits no Kubernetes Events — CR status is the entire runtime + // observability channel. dakr ingests with full-sync semantics + // (upsert reported, soft-delete unreported). + SnapshotCrStatusReport *SnapshotCRStatusReport `protobuf:"bytes,31,opt,name=snapshot_cr_status_report,json=snapshotCrStatusReport,proto3,oneof"` +} + +type BalanceGetRecommendationsRequest_SchedulerEnrollmentReport struct { + // Periodic full-sync report of scheduler enrollment state observed + // in-cluster: original-scheduler captures at first application. + // Full-sync semantics mirror SnapshotCRStatusReport. Revert acks do + // NOT ride this message — they use apply with + // RECOMMENDATION_TYPE_SCHEDULER_POLICY and the enrollment id. + SchedulerEnrollmentReport *SchedulerEnrollmentReport `protobuf:"bytes,32,opt,name=scheduler_enrollment_report,json=schedulerEnrollmentReport,proto3,oneof"` +} + +type BalanceGetRecommendationsRequest_SchedulerRevertEventReport struct { + // Fail-open scheduler revert events observed by the admission + // failsafe: pods steered away from an unhealthy tracked scheduler at + // CREATE time. Batched per stream tick, replica-local (each tunr + // replica reports only what its own webhook process observed). + SchedulerRevertEventReport *SchedulerRevertEventReport `protobuf:"bytes,33,opt,name=scheduler_revert_event_report,json=schedulerRevertEventReport,proto3,oneof"` +} + type BalanceGetRecommendationsRequest_OperatorHealth struct { // health check APIs OperatorHealth *OperatorHealth `protobuf:"bytes,71,opt,name=operator_health,json=operatorHealth,proto3,oneof"` @@ -7919,6 +9187,15 @@ func (*BalanceGetRecommendationsRequest_WorkloadMeta) isBalanceGetRecommendation func (*BalanceGetRecommendationsRequest_InClusterRecommendation) isBalanceGetRecommendationsRequest_Request() { } +func (*BalanceGetRecommendationsRequest_SnapshotCrStatusReport) isBalanceGetRecommendationsRequest_Request() { +} + +func (*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport) isBalanceGetRecommendationsRequest_Request() { +} + +func (*BalanceGetRecommendationsRequest_SchedulerRevertEventReport) isBalanceGetRecommendationsRequest_Request() { +} + func (*BalanceGetRecommendationsRequest_OperatorHealth) isBalanceGetRecommendationsRequest_Request() { } @@ -7945,6 +9222,10 @@ type BalanceGetRecommendationsResponse struct { // *BalanceGetRecommendationsResponse_BatchPvcStorageRecommendations // *BalanceGetRecommendationsResponse_BatchWorkloadRules // *BalanceGetRecommendationsResponse_KarpenterSettings + // *BalanceGetRecommendationsResponse_SnapshotRecommendation + // *BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation + // *BalanceGetRecommendationsResponse_BatchHpaConnectors + // *BalanceGetRecommendationsResponse_SchedulerPolicySync Response isBalanceGetRecommendationsResponse_Response `protobuf_oneof:"response"` RequestId string `protobuf:"bytes,99,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // optional } @@ -7952,7 +9233,7 @@ type BalanceGetRecommendationsResponse struct { func (x *BalanceGetRecommendationsResponse) Reset() { *x = BalanceGetRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[97] + mi := &file_api_v1_recommendation_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7965,7 +9246,7 @@ func (x *BalanceGetRecommendationsResponse) String() string { func (*BalanceGetRecommendationsResponse) ProtoMessage() {} func (x *BalanceGetRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[97] + mi := &file_api_v1_recommendation_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7978,7 +9259,7 @@ func (x *BalanceGetRecommendationsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use BalanceGetRecommendationsResponse.ProtoReflect.Descriptor instead. func (*BalanceGetRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{97} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{98} } func (m *BalanceGetRecommendationsResponse) GetResponse() isBalanceGetRecommendationsResponse_Response { @@ -8086,6 +9367,34 @@ func (x *BalanceGetRecommendationsResponse) GetKarpenterSettings() *KarpenterSet return nil } +func (x *BalanceGetRecommendationsResponse) GetSnapshotRecommendation() *SnapshotRecommendation { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_SnapshotRecommendation); ok { + return x.SnapshotRecommendation + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetForensicSnapshotRecommendation() *ForensicSnapshotRecommendation { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation); ok { + return x.ForensicSnapshotRecommendation + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetBatchHpaConnectors() *BatchHPAConnectors { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_BatchHpaConnectors); ok { + return x.BatchHpaConnectors + } + return nil +} + +func (x *BalanceGetRecommendationsResponse) GetSchedulerPolicySync() *SchedulerPolicySync { + if x, ok := x.GetResponse().(*BalanceGetRecommendationsResponse_SchedulerPolicySync); ok { + return x.SchedulerPolicySync + } + return nil +} + func (x *BalanceGetRecommendationsResponse) GetRequestId() string { if x != nil { return x.RequestId @@ -8160,6 +9469,28 @@ type BalanceGetRecommendationsResponse_KarpenterSettings struct { KarpenterSettings *KarpenterSettingsRecommendation `protobuf:"bytes,62,opt,name=karpenter_settings,json=karpenterSettings,proto3,oneof"` } +type BalanceGetRecommendationsResponse_SnapshotRecommendation struct { + // Snapshot policy CRD bundles (checkpoint-restore-operator, spec §7) + SnapshotRecommendation *SnapshotRecommendation `protobuf:"bytes,63,opt,name=snapshot_recommendation,json=snapshotRecommendation,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation struct { + ForensicSnapshotRecommendation *ForensicSnapshotRecommendation `protobuf:"bytes,64,opt,name=forensic_snapshot_recommendation,json=forensicSnapshotRecommendation,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_BatchHpaConnectors struct { + // HPA connector CRD push-down + BatchHpaConnectors *BatchHPAConnectors `protobuf:"bytes,65,opt,name=batch_hpa_connectors,json=batchHpaConnectors,proto3,oneof"` +} + +type BalanceGetRecommendationsResponse_SchedulerPolicySync struct { + // Full desired scheduler-policy set for this cluster plus pending + // revert instructions. Hash-gated full-sync push (see + // scheduler_policy_delivery.go); tunr reconciles it into the + // cluster-scoped SchedulerPolicy CRD and executes reverts. + SchedulerPolicySync *SchedulerPolicySync `protobuf:"bytes,66,opt,name=scheduler_policy_sync,json=schedulerPolicySync,proto3,oneof"` +} + func (*BalanceGetRecommendationsResponse_NodeGroupRecommendation) isBalanceGetRecommendationsResponse_Response() { } @@ -8202,6 +9533,18 @@ func (*BalanceGetRecommendationsResponse_BatchWorkloadRules) isBalanceGetRecomme func (*BalanceGetRecommendationsResponse_KarpenterSettings) isBalanceGetRecommendationsResponse_Response() { } +func (*BalanceGetRecommendationsResponse_SnapshotRecommendation) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_BatchHpaConnectors) isBalanceGetRecommendationsResponse_Response() { +} + +func (*BalanceGetRecommendationsResponse_SchedulerPolicySync) isBalanceGetRecommendationsResponse_Response() { +} + type BatchNodeGroupRecommendations struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8213,7 +9556,7 @@ type BatchNodeGroupRecommendations struct { func (x *BatchNodeGroupRecommendations) Reset() { *x = BatchNodeGroupRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[98] + mi := &file_api_v1_recommendation_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8226,7 +9569,7 @@ func (x *BatchNodeGroupRecommendations) String() string { func (*BatchNodeGroupRecommendations) ProtoMessage() {} func (x *BatchNodeGroupRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[98] + mi := &file_api_v1_recommendation_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8239,7 +9582,7 @@ func (x *BatchNodeGroupRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchNodeGroupRecommendations.ProtoReflect.Descriptor instead. func (*BatchNodeGroupRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{98} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{99} } func (x *BatchNodeGroupRecommendations) GetRecommendations() []*NodeGroupRecommendation { @@ -8260,7 +9603,7 @@ type BatchWorkloadRecommendations struct { func (x *BatchWorkloadRecommendations) Reset() { *x = BatchWorkloadRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[99] + mi := &file_api_v1_recommendation_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8273,7 +9616,7 @@ func (x *BatchWorkloadRecommendations) String() string { func (*BatchWorkloadRecommendations) ProtoMessage() {} func (x *BatchWorkloadRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[99] + mi := &file_api_v1_recommendation_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8286,7 +9629,7 @@ func (x *BatchWorkloadRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchWorkloadRecommendations.ProtoReflect.Descriptor instead. func (*BatchWorkloadRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{99} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{100} } func (x *BatchWorkloadRecommendations) GetRecommendations() []*WorkloadRecommendation { @@ -8333,20 +9676,57 @@ type WorkloadRule struct { // Whether the rule evaluator should create recommendations that use // in-place pod vertical scaling instead of triggering pod restarts. UseInPlaceVerticalScaling bool `protobuf:"varint,70,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Opt-in: allow an in-place resize to LOWER a container's memory limit. + // Only consulted when use_in_place_vertical_scaling is true, and it never + // relaxes the Kubernetes version gate — a decrease still additionally + // requires a cluster new enough to accept one. Default false because + // shrinking a live container's memory limit can OOM-kill it. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,71,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // UI display fields (not sent to cluster, only used for listing) Status string `protobuf:"bytes,80,opt,name=status,proto3" json:"status,omitempty"` // "active" or "inactive" SyncStatus string `protobuf:"bytes,81,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` // "pending", "synced", or "failed" CurrentSource string `protobuf:"bytes,82,opt,name=current_source,json=currentSource,proto3" json:"current_source,omitempty"` // "crd", "policy", "auto_optimization", "manual", "pulumi_manual", "pulumi_auto", "terraform_manual", "terraform_auto" CreatedAt *timestamppb.Timestamp `protobuf:"bytes,83,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,84,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // True when the underlying workload (cluster_id, namespace, kind, name) + // is no longer present in the cluster. Populated by ListWorkloadRules + // at read time via a presence lookup against the workload tables — NOT + // persisted on the rule itself. Orthogonal to `status` (which reflects + // whether the rule's policy is enabled) — an Active rule can be + // orphaned if its workload was deleted, and will be cleaned up by the + // orphan janitor after a grace period. + IsOrphaned bool `protobuf:"varint,85,opt,name=is_orphaned,json=isOrphaned,proto3" json:"is_orphaned,omitempty"` // Per-container resource configurations (VPA). When empty, workload-level rules apply to all containers. Containers []*ContainerResourceRuleConfig `protobuf:"bytes,90,rep,name=containers,proto3" json:"containers,omitempty"` + // JVM heap optimization overrides for this rule. + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,91,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + // Per-rule override of the JVM CPU startup floor (millicores). Standalone — + // deliberately NOT inside jvm_heap_rule and not gated by its enabled flag + // (the floor is always-on for detected JVMs). Unset = inherit policy / + // system default (75m). Explicit 0 = floor disabled for this rule. + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,92,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Rule-wide on/off switch, independent of `status`/`sync_status`. A + // disabled rule still exists (status stays "active") but every CP loop + // and the in-cluster operator treat it as a full no-op: no further + // regeneration, no evaluation, no emergency OOM/throttle response. + Disabled bool `protobuf:"varint,93,opt,name=disabled,proto3" json:"disabled,omitempty"` + // Per-rule override of the metrics lookback window (seconds). Unset = + // inherit the owning policy's window, else the 7-day default. + // + // Mirrored onto the CRD for visibility only — the operator evaluates off + // zxporter's rolling 5-minute window and never queries history. + LookbackPeriodSeconds *int32 `protobuf:"varint,94,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // KEDA ScaledObject template authored by dakr and carried to tunr. + // When set, tunr owns the ScaledObject lifecycle (create/update/delete) + // rather than generating its own HPA. Renumbered 94→95 on the main merge + // (main took 94 for lookback_period_seconds). + KedaScaledObject *KEDAScaledObjectTemplate `protobuf:"bytes,95,opt,name=keda_scaled_object,json=kedaScaledObject,proto3,oneof" json:"keda_scaled_object,omitempty"` } func (x *WorkloadRule) Reset() { *x = WorkloadRule{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[100] + mi := &file_api_v1_recommendation_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8359,7 +9739,7 @@ func (x *WorkloadRule) String() string { func (*WorkloadRule) ProtoMessage() {} func (x *WorkloadRule) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[100] + mi := &file_api_v1_recommendation_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8372,7 +9752,7 @@ func (x *WorkloadRule) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRule.ProtoReflect.Descriptor instead. func (*WorkloadRule) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{100} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{101} } func (x *WorkloadRule) GetRuleId() string { @@ -8557,6 +9937,13 @@ func (x *WorkloadRule) GetUseInPlaceVerticalScaling() bool { return false } +func (x *WorkloadRule) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + func (x *WorkloadRule) GetStatus() string { if x != nil { return x.Status @@ -8592,6 +9979,13 @@ func (x *WorkloadRule) GetUpdatedAt() *timestamppb.Timestamp { return nil } +func (x *WorkloadRule) GetIsOrphaned() bool { + if x != nil { + return x.IsOrphaned + } + return false +} + func (x *WorkloadRule) GetContainers() []*ContainerResourceRuleConfig { if x != nil { return x.Containers @@ -8599,6 +9993,41 @@ func (x *WorkloadRule) GetContainers() []*ContainerResourceRuleConfig { return nil } +func (x *WorkloadRule) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *WorkloadRule) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *WorkloadRule) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *WorkloadRule) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *WorkloadRule) GetKedaScaledObject() *KEDAScaledObjectTemplate { + if x != nil { + return x.KedaScaledObject + } + return nil +} + type ResourceRuleConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8625,12 +10054,51 @@ type ResourceRuleConfig struct { // the produced BaseRequest differs from the user's expectation. Not // persisted — recomputed on every generation/preview. Notes []string `protobuf:"bytes,14,rep,name=notes,proto3" json:"notes,omitempty"` + // Recommendation floor (rules/v2, request only): the recommended request + // is never lowered below floor_percent% (1-100) of initial_request, the + // cached immutable baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. initial_request is editable + // through the generic manual-rule surface like min_request (no special + // protection). Unset floor_percent = floor disabled. Resolved in the + // in-cluster tunr evaluator, not pre-resolved by dakr. + InitialRequest *int64 `protobuf:"varint,15,opt,name=initial_request,json=initialRequest,proto3,oneof" json:"initial_request,omitempty"` + FloorPercent *int64 `protobuf:"varint,16,opt,name=floor_percent,json=floorPercent,proto3,oneof" json:"floor_percent,omitempty"` + // Recommendation ceiling (rules/v2, request only): the recommended request + // is never raised above ceiling_percent% (1-1000) of initial_request. The + // mirror of floor_percent; a ceiling below 100 is intentionally allowed as + // a baseline-relative cap distinct from max_request. Unset = ceiling + // disabled. Resolved in the in-cluster tunr evaluator, not pre-resolved by + // dakr. + CeilingPercent *int64 `protobuf:"varint,17,opt,name=ceiling_percent,json=ceilingPercent,proto3,oneof" json:"ceiling_percent,omitempty"` + // Limit floor/ceiling (rules/v2, limit only): the recommended limit is + // never lowered below limit_floor_percent% (1-100) nor raised above + // limit_ceiling_percent% (1-1000) of initial_limit, the cached immutable + // initial-limit baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. Applied only when limits + // adjustment is enabled and limits removal is not; the recommended + // request always wins over the limit ceiling (the limit is never clamped + // below the request). Unset = bound disabled. Resolved in the in-cluster + // tunr evaluator, not pre-resolved by dakr. + InitialLimit *int64 `protobuf:"varint,18,opt,name=initial_limit,json=initialLimit,proto3,oneof" json:"initial_limit,omitempty"` + LimitFloorPercent *int64 `protobuf:"varint,19,opt,name=limit_floor_percent,json=limitFloorPercent,proto3,oneof" json:"limit_floor_percent,omitempty"` + LimitCeilingPercent *int64 `protobuf:"varint,20,opt,name=limit_ceiling_percent,json=limitCeilingPercent,proto3,oneof" json:"limit_ceiling_percent,omitempty"` + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + RequestUseRss *bool `protobuf:"varint,21,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + LimitUseRss *bool `protobuf:"varint,22,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` + // Memory-only: request-equivalent baseline on the *limit* basis (bytes). The + // generator emits this only when the limit basis differs from the request + // basis (RSS vs working set); 0 otherwise, meaning "derive the limit as + // request × limit_multiplier" (byte-identical default). NOT pre-multiplied. + // Consumed by the in-cluster tunr evaluator's normal-mode baseline path. + BaseLimit int64 `protobuf:"varint,23,opt,name=base_limit,json=baseLimit,proto3" json:"base_limit,omitempty"` } func (x *ResourceRuleConfig) Reset() { *x = ResourceRuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[101] + mi := &file_api_v1_recommendation_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8643,7 +10111,7 @@ func (x *ResourceRuleConfig) String() string { func (*ResourceRuleConfig) ProtoMessage() {} func (x *ResourceRuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[101] + mi := &file_api_v1_recommendation_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8656,7 +10124,7 @@ func (x *ResourceRuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceRuleConfig.ProtoReflect.Descriptor instead. func (*ResourceRuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{101} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{102} } func (x *ResourceRuleConfig) GetEnabled() bool { @@ -8757,6 +10225,69 @@ func (x *ResourceRuleConfig) GetNotes() []string { return nil } +func (x *ResourceRuleConfig) GetInitialRequest() int64 { + if x != nil && x.InitialRequest != nil { + return *x.InitialRequest + } + return 0 +} + +func (x *ResourceRuleConfig) GetFloorPercent() int64 { + if x != nil && x.FloorPercent != nil { + return *x.FloorPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetCeilingPercent() int64 { + if x != nil && x.CeilingPercent != nil { + return *x.CeilingPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetInitialLimit() int64 { + if x != nil && x.InitialLimit != nil { + return *x.InitialLimit + } + return 0 +} + +func (x *ResourceRuleConfig) GetLimitFloorPercent() int64 { + if x != nil && x.LimitFloorPercent != nil { + return *x.LimitFloorPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetLimitCeilingPercent() int64 { + if x != nil && x.LimitCeilingPercent != nil { + return *x.LimitCeilingPercent + } + return 0 +} + +func (x *ResourceRuleConfig) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *ResourceRuleConfig) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + +func (x *ResourceRuleConfig) GetBaseLimit() int64 { + if x != nil { + return x.BaseLimit + } + return 0 +} + type HPAMetricTrigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -8769,12 +10300,13 @@ type HPAMetricTrigger struct { Metadata map[string]string `protobuf:"bytes,5,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Free-form key-value for external scalers (e.g. serverAddress, query for Prometheus) ServerAddress *string `protobuf:"bytes,6,opt,name=server_address,json=serverAddress,proto3,oneof" json:"server_address,omitempty"` // Frontend-friendly: Prometheus server URL (packed into metadata by service layer) Query *string `protobuf:"bytes,7,opt,name=query,proto3,oneof" json:"query,omitempty"` // Frontend-friendly: PromQL query (packed into metadata by service layer) + ConnectorId *string `protobuf:"bytes,8,opt,name=connector_id,json=connectorId,proto3,oneof" json:"connector_id,omitempty"` // References HPAConnector by dakr-side UUID } func (x *HPAMetricTrigger) Reset() { *x = HPAMetricTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[102] + mi := &file_api_v1_recommendation_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8787,7 +10319,7 @@ func (x *HPAMetricTrigger) String() string { func (*HPAMetricTrigger) ProtoMessage() {} func (x *HPAMetricTrigger) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[102] + mi := &file_api_v1_recommendation_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8800,7 +10332,7 @@ func (x *HPAMetricTrigger) ProtoReflect() protoreflect.Message { // Deprecated: Use HPAMetricTrigger.ProtoReflect.Descriptor instead. func (*HPAMetricTrigger) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{102} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{103} } func (x *HPAMetricTrigger) GetType() string { @@ -8852,6 +10384,13 @@ func (x *HPAMetricTrigger) GetQuery() string { return "" } +func (x *HPAMetricTrigger) GetConnectorId() string { + if x != nil && x.ConnectorId != nil { + return *x.ConnectorId + } + return "" +} + // HPABehavior, HPAScalingRules, HPAScalingPolicy are defined in common.proto type HPAFallback struct { state protoimpl.MessageState @@ -8866,7 +10405,7 @@ type HPAFallback struct { func (x *HPAFallback) Reset() { *x = HPAFallback{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[103] + mi := &file_api_v1_recommendation_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8879,7 +10418,7 @@ func (x *HPAFallback) String() string { func (*HPAFallback) ProtoMessage() {} func (x *HPAFallback) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[103] + mi := &file_api_v1_recommendation_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8892,7 +10431,7 @@ func (x *HPAFallback) ProtoReflect() protoreflect.Message { // Deprecated: Use HPAFallback.ProtoReflect.Descriptor instead. func (*HPAFallback) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{103} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{104} } func (x *HPAFallback) GetReplicas() int32 { @@ -8936,12 +10475,21 @@ type ContainerResourceConfig struct { // Human-readable annotations from the engine for this container. // See ResourceRuleConfig.notes for semantics. Notes []string `protobuf:"bytes,9,rep,name=notes,proto3" json:"notes,omitempty"` + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + RequestUseRss *bool `protobuf:"varint,10,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + LimitUseRss *bool `protobuf:"varint,11,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` + // Memory-only: request-equivalent baseline on the *limit* basis (bytes), + // emitted only when the limit basis differs from the request basis; 0 + // otherwise. See ResourceRuleConfig.base_limit for full semantics. + BaseLimit int64 `protobuf:"varint,12,opt,name=base_limit,json=baseLimit,proto3" json:"base_limit,omitempty"` } func (x *ContainerResourceConfig) Reset() { *x = ContainerResourceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[104] + mi := &file_api_v1_recommendation_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8954,7 +10502,7 @@ func (x *ContainerResourceConfig) String() string { func (*ContainerResourceConfig) ProtoMessage() {} func (x *ContainerResourceConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[104] + mi := &file_api_v1_recommendation_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8967,7 +10515,7 @@ func (x *ContainerResourceConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerResourceConfig.ProtoReflect.Descriptor instead. func (*ContainerResourceConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{104} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{105} } func (x *ContainerResourceConfig) GetEnabled() bool { @@ -9033,6 +10581,27 @@ func (x *ContainerResourceConfig) GetNotes() []string { return nil } +func (x *ContainerResourceConfig) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *ContainerResourceConfig) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + +func (x *ContainerResourceConfig) GetBaseLimit() int64 { + if x != nil { + return x.BaseLimit + } + return 0 +} + // Per-container resource rule config with CPU/Memory/GPU. type ContainerResourceRuleConfig struct { state protoimpl.MessageState @@ -9048,7 +10617,7 @@ type ContainerResourceRuleConfig struct { func (x *ContainerResourceRuleConfig) Reset() { *x = ContainerResourceRuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[105] + mi := &file_api_v1_recommendation_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9061,7 +10630,7 @@ func (x *ContainerResourceRuleConfig) String() string { func (*ContainerResourceRuleConfig) ProtoMessage() {} func (x *ContainerResourceRuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[105] + mi := &file_api_v1_recommendation_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9074,7 +10643,7 @@ func (x *ContainerResourceRuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerResourceRuleConfig.ProtoReflect.Descriptor instead. func (*ContainerResourceRuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{105} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{106} } func (x *ContainerResourceRuleConfig) GetContainerName() string { @@ -9105,6 +10674,111 @@ func (x *ContainerResourceRuleConfig) GetGpuRule() *ContainerResourceConfig { return nil } +// JVMHeapRuleConfig mirrors the policy-level JVM heap knobs as per-rule overrides. +// Gated by enabled; the optional knobs are overrides — unset = use the default. +type JVMHeapRuleConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + TargetPercentile *float32 `protobuf:"fixed32,2,opt,name=target_percentile,json=targetPercentile,proto3,oneof" json:"target_percentile,omitempty"` + HeadroomMultiplier *float32 `protobuf:"fixed32,3,opt,name=headroom_multiplier,json=headroomMultiplier,proto3,oneof" json:"headroom_multiplier,omitempty"` + NonHeapOverheadPercent *float32 `protobuf:"fixed32,4,opt,name=non_heap_overhead_percent,json=nonHeapOverheadPercent,proto3,oneof" json:"non_heap_overhead_percent,omitempty"` + NonHeapOverheadBytes *int64 `protobuf:"varint,5,opt,name=non_heap_overhead_bytes,json=nonHeapOverheadBytes,proto3,oneof" json:"non_heap_overhead_bytes,omitempty"` + MinHeapBytes *int64 `protobuf:"varint,6,opt,name=min_heap_bytes,json=minHeapBytes,proto3,oneof" json:"min_heap_bytes,omitempty"` + MaxHeapBytes *int64 `protobuf:"varint,7,opt,name=max_heap_bytes,json=maxHeapBytes,proto3,oneof" json:"max_heap_bytes,omitempty"` + PreferContainerSupport bool `protobuf:"varint,8,opt,name=prefer_container_support,json=preferContainerSupport,proto3" json:"prefer_container_support,omitempty"` +} + +func (x *JVMHeapRuleConfig) Reset() { + *x = JVMHeapRuleConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JVMHeapRuleConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JVMHeapRuleConfig) ProtoMessage() {} + +func (x *JVMHeapRuleConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[107] + 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 JVMHeapRuleConfig.ProtoReflect.Descriptor instead. +func (*JVMHeapRuleConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{107} +} + +func (x *JVMHeapRuleConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *JVMHeapRuleConfig) GetTargetPercentile() float32 { + if x != nil && x.TargetPercentile != nil { + return *x.TargetPercentile + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetHeadroomMultiplier() float32 { + if x != nil && x.HeadroomMultiplier != nil { + return *x.HeadroomMultiplier + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetNonHeapOverheadPercent() float32 { + if x != nil && x.NonHeapOverheadPercent != nil { + return *x.NonHeapOverheadPercent + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetNonHeapOverheadBytes() int64 { + if x != nil && x.NonHeapOverheadBytes != nil { + return *x.NonHeapOverheadBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetMinHeapBytes() int64 { + if x != nil && x.MinHeapBytes != nil { + return *x.MinHeapBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetMaxHeapBytes() int64 { + if x != nil && x.MaxHeapBytes != nil { + return *x.MaxHeapBytes + } + return 0 +} + +func (x *JVMHeapRuleConfig) GetPreferContainerSupport() bool { + if x != nil { + return x.PreferContainerSupport + } + return false +} + type HPARuleConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9113,23 +10787,18 @@ type HPARuleConfig struct { Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` MinReplicas *int32 `protobuf:"varint,2,opt,name=min_replicas,json=minReplicas,proto3,oneof" json:"min_replicas,omitempty"` MaxReplicas *int32 `protobuf:"varint,3,opt,name=max_replicas,json=maxReplicas,proto3,oneof" json:"max_replicas,omitempty"` - TargetUtilization *float32 `protobuf:"fixed32,4,opt,name=target_utilization,json=targetUtilization,proto3,oneof" json:"target_utilization,omitempty"` - PrimaryMetric *HPAMetricType `protobuf:"varint,5,opt,name=primary_metric,json=primaryMetric,proto3,enum=api.v1.HPAMetricType,oneof" json:"primary_metric,omitempty"` MaxReplicaChangePercent *float32 `protobuf:"fixed32,6,opt,name=max_replica_change_percent,json=maxReplicaChangePercent,proto3,oneof" json:"max_replica_change_percent,omitempty"` Metrics []*HPAMetricTrigger `protobuf:"bytes,7,rep,name=metrics,proto3" json:"metrics,omitempty"` Behavior *HPABehavior `protobuf:"bytes,8,opt,name=behavior,proto3,oneof" json:"behavior,omitempty"` CompositeFormula *string `protobuf:"bytes,9,opt,name=composite_formula,json=compositeFormula,proto3,oneof" json:"composite_formula,omitempty"` Fallback *HPAFallback `protobuf:"bytes,10,opt,name=fallback,proto3,oneof" json:"fallback,omitempty"` ScaleDownCooldownSeconds *int32 `protobuf:"varint,11,opt,name=scale_down_cooldown_seconds,json=scaleDownCooldownSeconds,proto3,oneof" json:"scale_down_cooldown_seconds,omitempty"` - // Target memory utilization (0.0-1.0). Separate from target_utilization (CPU) - // to allow independent tuning per resource. - TargetMemoryUtilization *float32 `protobuf:"fixed32,12,opt,name=target_memory_utilization,json=targetMemoryUtilization,proto3,oneof" json:"target_memory_utilization,omitempty"` } func (x *HPARuleConfig) Reset() { *x = HPARuleConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[106] + mi := &file_api_v1_recommendation_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9142,7 +10811,7 @@ func (x *HPARuleConfig) String() string { func (*HPARuleConfig) ProtoMessage() {} func (x *HPARuleConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[106] + mi := &file_api_v1_recommendation_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9155,7 +10824,7 @@ func (x *HPARuleConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use HPARuleConfig.ProtoReflect.Descriptor instead. func (*HPARuleConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{106} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{108} } func (x *HPARuleConfig) GetEnabled() bool { @@ -9179,20 +10848,6 @@ func (x *HPARuleConfig) GetMaxReplicas() int32 { return 0 } -func (x *HPARuleConfig) GetTargetUtilization() float32 { - if x != nil && x.TargetUtilization != nil { - return *x.TargetUtilization - } - return 0 -} - -func (x *HPARuleConfig) GetPrimaryMetric() HPAMetricType { - if x != nil && x.PrimaryMetric != nil { - return *x.PrimaryMetric - } - return HPAMetricType_HPA_METRIC_TYPE_UNSPECIFIED -} - func (x *HPARuleConfig) GetMaxReplicaChangePercent() float32 { if x != nil && x.MaxReplicaChangePercent != nil { return *x.MaxReplicaChangePercent @@ -9235,13 +10890,6 @@ func (x *HPARuleConfig) GetScaleDownCooldownSeconds() int32 { return 0 } -func (x *HPARuleConfig) GetTargetMemoryUtilization() float32 { - if x != nil && x.TargetMemoryUtilization != nil { - return *x.TargetMemoryUtilization - } - return 0 -} - type EmergencyResponseConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9259,7 +10907,7 @@ type EmergencyResponseConfig struct { func (x *EmergencyResponseConfig) Reset() { *x = EmergencyResponseConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[107] + mi := &file_api_v1_recommendation_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9272,7 +10920,7 @@ func (x *EmergencyResponseConfig) String() string { func (*EmergencyResponseConfig) ProtoMessage() {} func (x *EmergencyResponseConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[107] + mi := &file_api_v1_recommendation_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9285,7 +10933,7 @@ func (x *EmergencyResponseConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use EmergencyResponseConfig.ProtoReflect.Descriptor instead. func (*EmergencyResponseConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{107} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{109} } func (x *EmergencyResponseConfig) GetOomEnabled() bool { @@ -9337,36 +10985,42 @@ func (x *EmergencyResponseConfig) GetCpuThrottlingMultiplier() float32 { return 0 } -// PercentileValues contains pre-computed percentile values for a single resource axis -type PercentileValues struct { +// KEDAScaledObjectTemplate is the user-authored KEDA ScaledObject configuration +// carried from dakr to the in-cluster tunr operator. tunr materialises it into +// a live ScaledObject and owns the lifecycle (create/update/delete). +type KEDAScaledObjectTemplate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - P50 int64 `protobuf:"varint,1,opt,name=p50,proto3" json:"p50,omitempty"` - P80 int64 `protobuf:"varint,2,opt,name=p80,proto3" json:"p80,omitempty"` - P90 int64 `protobuf:"varint,3,opt,name=p90,proto3" json:"p90,omitempty"` - P95 int64 `protobuf:"varint,4,opt,name=p95,proto3" json:"p95,omitempty"` - P99 int64 `protobuf:"varint,5,opt,name=p99,proto3" json:"p99,omitempty"` + Triggers []*KEDATrigger `protobuf:"bytes,1,rep,name=triggers,proto3" json:"triggers,omitempty"` + MinReplicaCount *int32 `protobuf:"varint,2,opt,name=min_replica_count,json=minReplicaCount,proto3,oneof" json:"min_replica_count,omitempty"` + MaxReplicaCount *int32 `protobuf:"varint,3,opt,name=max_replica_count,json=maxReplicaCount,proto3,oneof" json:"max_replica_count,omitempty"` + IdleReplicaCount *int32 `protobuf:"varint,4,opt,name=idle_replica_count,json=idleReplicaCount,proto3,oneof" json:"idle_replica_count,omitempty"` + PollingInterval *int32 `protobuf:"varint,5,opt,name=polling_interval,json=pollingInterval,proto3,oneof" json:"polling_interval,omitempty"` + CooldownPeriod *int32 `protobuf:"varint,6,opt,name=cooldown_period,json=cooldownPeriod,proto3,oneof" json:"cooldown_period,omitempty"` + InitialCooldownPeriod *int32 `protobuf:"varint,7,opt,name=initial_cooldown_period,json=initialCooldownPeriod,proto3,oneof" json:"initial_cooldown_period,omitempty"` + Fallback *KEDAFallback `protobuf:"bytes,8,opt,name=fallback,proto3,oneof" json:"fallback,omitempty"` + Advanced *KEDAAdvanced `protobuf:"bytes,9,opt,name=advanced,proto3,oneof" json:"advanced,omitempty"` } -func (x *PercentileValues) Reset() { - *x = PercentileValues{} +func (x *KEDAScaledObjectTemplate) Reset() { + *x = KEDAScaledObjectTemplate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[108] + mi := &file_api_v1_recommendation_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PercentileValues) String() string { +func (x *KEDAScaledObjectTemplate) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PercentileValues) ProtoMessage() {} +func (*KEDAScaledObjectTemplate) ProtoMessage() {} -func (x *PercentileValues) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[108] +func (x *KEDAScaledObjectTemplate) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9377,75 +11031,104 @@ func (x *PercentileValues) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PercentileValues.ProtoReflect.Descriptor instead. -func (*PercentileValues) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{108} +// Deprecated: Use KEDAScaledObjectTemplate.ProtoReflect.Descriptor instead. +func (*KEDAScaledObjectTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} } -func (x *PercentileValues) GetP50() int64 { +func (x *KEDAScaledObjectTemplate) GetTriggers() []*KEDATrigger { if x != nil { - return x.P50 + return x.Triggers + } + return nil +} + +func (x *KEDAScaledObjectTemplate) GetMinReplicaCount() int32 { + if x != nil && x.MinReplicaCount != nil { + return *x.MinReplicaCount } return 0 } -func (x *PercentileValues) GetP80() int64 { - if x != nil { - return x.P80 +func (x *KEDAScaledObjectTemplate) GetMaxReplicaCount() int32 { + if x != nil && x.MaxReplicaCount != nil { + return *x.MaxReplicaCount } return 0 } -func (x *PercentileValues) GetP90() int64 { - if x != nil { - return x.P90 +func (x *KEDAScaledObjectTemplate) GetIdleReplicaCount() int32 { + if x != nil && x.IdleReplicaCount != nil { + return *x.IdleReplicaCount } return 0 } -func (x *PercentileValues) GetP95() int64 { - if x != nil { - return x.P95 +func (x *KEDAScaledObjectTemplate) GetPollingInterval() int32 { + if x != nil && x.PollingInterval != nil { + return *x.PollingInterval } return 0 } -func (x *PercentileValues) GetP99() int64 { - if x != nil { - return x.P99 +func (x *KEDAScaledObjectTemplate) GetCooldownPeriod() int32 { + if x != nil && x.CooldownPeriod != nil { + return *x.CooldownPeriod } return 0 } -// ResourcePercentiles contains percentile sets for all resource axes -type ResourcePercentiles struct { +func (x *KEDAScaledObjectTemplate) GetInitialCooldownPeriod() int32 { + if x != nil && x.InitialCooldownPeriod != nil { + return *x.InitialCooldownPeriod + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetFallback() *KEDAFallback { + if x != nil { + return x.Fallback + } + return nil +} + +func (x *KEDAScaledObjectTemplate) GetAdvanced() *KEDAAdvanced { + if x != nil { + return x.Advanced + } + return nil +} + +type KEDATrigger struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cpu *PercentileValues `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory *PercentileValues `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` - Network *PercentileValues `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"` - Disk *PercentileValues `protobuf:"bytes,4,opt,name=disk,proto3" json:"disk,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MetricType string `protobuf:"bytes,4,opt,name=metric_type,json=metricType,proto3" json:"metric_type,omitempty"` + AuthenticationRef *KEDAAuthenticationRef `protobuf:"bytes,5,opt,name=authentication_ref,json=authenticationRef,proto3,oneof" json:"authentication_ref,omitempty"` + UseCachedMetrics bool `protobuf:"varint,6,opt,name=use_cached_metrics,json=useCachedMetrics,proto3" json:"use_cached_metrics,omitempty"` } -func (x *ResourcePercentiles) Reset() { - *x = ResourcePercentiles{} +func (x *KEDATrigger) Reset() { + *x = KEDATrigger{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[109] + mi := &file_api_v1_recommendation_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourcePercentiles) String() string { +func (x *KEDATrigger) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourcePercentiles) ProtoMessage() {} +func (*KEDATrigger) ProtoMessage() {} -func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[109] +func (x *KEDATrigger) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9456,70 +11139,79 @@ func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourcePercentiles.ProtoReflect.Descriptor instead. -func (*ResourcePercentiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{109} +// Deprecated: Use KEDATrigger.ProtoReflect.Descriptor instead. +func (*KEDATrigger) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} } -func (x *ResourcePercentiles) GetCpu() *PercentileValues { +func (x *KEDATrigger) GetType() string { if x != nil { - return x.Cpu + return x.Type } - return nil + return "" } -func (x *ResourcePercentiles) GetMemory() *PercentileValues { +func (x *KEDATrigger) GetName() string { if x != nil { - return x.Memory + return x.Name } - return nil + return "" } -func (x *ResourcePercentiles) GetNetwork() *PercentileValues { +func (x *KEDATrigger) GetMetadata() map[string]string { if x != nil { - return x.Network + return x.Metadata } return nil } -func (x *ResourcePercentiles) GetDisk() *PercentileValues { +func (x *KEDATrigger) GetMetricType() string { if x != nil { - return x.Disk + return x.MetricType + } + return "" +} + +func (x *KEDATrigger) GetAuthenticationRef() *KEDAAuthenticationRef { + if x != nil { + return x.AuthenticationRef } return nil } -// BurstinessRatios contains the p95/p50 ratio for each resource axis -type BurstinessRatios struct { +func (x *KEDATrigger) GetUseCachedMetrics() bool { + if x != nil { + return x.UseCachedMetrics + } + return false +} + +type KEDAAuthenticationRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cpu float64 `protobuf:"fixed64,1,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory float64 `protobuf:"fixed64,2,opt,name=memory,proto3" json:"memory,omitempty"` - Network float64 `protobuf:"fixed64,3,opt,name=network,proto3" json:"network,omitempty"` - Disk float64 `protobuf:"fixed64,4,opt,name=disk,proto3" json:"disk,omitempty"` - PmaxCpu float64 `protobuf:"fixed64,5,opt,name=pmax_cpu,json=pmaxCpu,proto3" json:"pmax_cpu,omitempty"` // pmax/p50 ratio for CPU (spike severity) - PmaxMem float64 `protobuf:"fixed64,6,opt,name=pmax_mem,json=pmaxMem,proto3" json:"pmax_mem,omitempty"` // pmax/p50 ratio for memory (spike severity) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` } -func (x *BurstinessRatios) Reset() { - *x = BurstinessRatios{} +func (x *KEDAAuthenticationRef) Reset() { + *x = KEDAAuthenticationRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[110] + mi := &file_api_v1_recommendation_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BurstinessRatios) String() string { +func (x *KEDAAuthenticationRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BurstinessRatios) ProtoMessage() {} +func (*KEDAAuthenticationRef) ProtoMessage() {} -func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[110] +func (x *KEDAAuthenticationRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9530,80 +11222,52 @@ func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BurstinessRatios.ProtoReflect.Descriptor instead. -func (*BurstinessRatios) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} -} - -func (x *BurstinessRatios) GetCpu() float64 { - if x != nil { - return x.Cpu - } - return 0 -} - -func (x *BurstinessRatios) GetMemory() float64 { - if x != nil { - return x.Memory - } - return 0 -} - -func (x *BurstinessRatios) GetNetwork() float64 { - if x != nil { - return x.Network - } - return 0 -} - -func (x *BurstinessRatios) GetDisk() float64 { - if x != nil { - return x.Disk - } - return 0 +// Deprecated: Use KEDAAuthenticationRef.ProtoReflect.Descriptor instead. +func (*KEDAAuthenticationRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} } -func (x *BurstinessRatios) GetPmaxCpu() float64 { +func (x *KEDAAuthenticationRef) GetName() string { if x != nil { - return x.PmaxCpu + return x.Name } - return 0 + return "" } -func (x *BurstinessRatios) GetPmaxMem() float64 { +func (x *KEDAAuthenticationRef) GetKind() string { if x != nil { - return x.PmaxMem + return x.Kind } - return 0 + return "" } -// WorkloadClassification contains workload classification based on resource dominance and burstiness -type WorkloadClassification struct { +type KEDAFallback struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DominantResource string `protobuf:"bytes,1,opt,name=dominant_resource,json=dominantResource,proto3" json:"dominant_resource,omitempty"` // cpu, memory, gpu, network, disk, unknown - Burstiness *BurstinessRatios `protobuf:"bytes,2,opt,name=burstiness,proto3" json:"burstiness,omitempty"` + FailureThreshold int32 `protobuf:"varint,1,opt,name=failure_threshold,json=failureThreshold,proto3" json:"failure_threshold,omitempty"` + Replicas int32 `protobuf:"varint,2,opt,name=replicas,proto3" json:"replicas,omitempty"` + Behavior string `protobuf:"bytes,3,opt,name=behavior,proto3" json:"behavior,omitempty"` } -func (x *WorkloadClassification) Reset() { - *x = WorkloadClassification{} +func (x *KEDAFallback) Reset() { + *x = KEDAFallback{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[111] + mi := &file_api_v1_recommendation_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadClassification) String() string { +func (x *KEDAFallback) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadClassification) ProtoMessage() {} +func (*KEDAFallback) ProtoMessage() {} -func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[111] +func (x *KEDAFallback) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9614,51 +11278,60 @@ func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadClassification.ProtoReflect.Descriptor instead. -func (*WorkloadClassification) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} +// Deprecated: Use KEDAFallback.ProtoReflect.Descriptor instead. +func (*KEDAFallback) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} } -func (x *WorkloadClassification) GetDominantResource() string { +func (x *KEDAFallback) GetFailureThreshold() int32 { if x != nil { - return x.DominantResource + return x.FailureThreshold } - return "" + return 0 } -func (x *WorkloadClassification) GetBurstiness() *BurstinessRatios { +func (x *KEDAFallback) GetReplicas() int32 { if x != nil { - return x.Burstiness + return x.Replicas } - return nil + return 0 } -type BatchWorkloadRules struct { +func (x *KEDAFallback) GetBehavior() string { + if x != nil { + return x.Behavior + } + return "" +} + +type KEDAAdvanced struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` - RuleIdsToDelete []string `protobuf:"bytes,2,rep,name=rule_ids_to_delete,json=ruleIdsToDelete,proto3" json:"rule_ids_to_delete,omitempty"` // rule IDs whose CRDs should be deleted from cluster + RestoreToOriginalReplicaCount bool `protobuf:"varint,1,opt,name=restore_to_original_replica_count,json=restoreToOriginalReplicaCount,proto3" json:"restore_to_original_replica_count,omitempty"` + // advanced_behavior_json carries the k8s HorizontalPodAutoscalerBehavior as an + // opaque JSON string so dakr never re-models k8s types; tunr unmarshals it. + AdvancedBehaviorJson string `protobuf:"bytes,2,opt,name=advanced_behavior_json,json=advancedBehaviorJson,proto3" json:"advanced_behavior_json,omitempty"` } -func (x *BatchWorkloadRules) Reset() { - *x = BatchWorkloadRules{} +func (x *KEDAAdvanced) Reset() { + *x = KEDAAdvanced{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[112] + mi := &file_api_v1_recommendation_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchWorkloadRules) String() string { +func (x *KEDAAdvanced) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchWorkloadRules) ProtoMessage() {} +func (*KEDAAdvanced) ProtoMessage() {} -func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[112] +func (x *KEDAAdvanced) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9669,50 +11342,55 @@ func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchWorkloadRules.ProtoReflect.Descriptor instead. -func (*BatchWorkloadRules) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} +// Deprecated: Use KEDAAdvanced.ProtoReflect.Descriptor instead. +func (*KEDAAdvanced) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{114} } -func (x *BatchWorkloadRules) GetRules() []*WorkloadRule { +func (x *KEDAAdvanced) GetRestoreToOriginalReplicaCount() bool { if x != nil { - return x.Rules + return x.RestoreToOriginalReplicaCount } - return nil + return false } -func (x *BatchWorkloadRules) GetRuleIdsToDelete() []string { +func (x *KEDAAdvanced) GetAdvancedBehaviorJson() string { if x != nil { - return x.RuleIdsToDelete + return x.AdvancedBehaviorJson } - return nil + return "" } -type WorkloadWithActiveRecommendations struct { +// PercentileValues contains pre-computed percentile values for a single resource axis +type PercentileValues struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` // picking this pattern since caller has to iterate over the list anyway + P50 int64 `protobuf:"varint,1,opt,name=p50,proto3" json:"p50,omitempty"` + P80 int64 `protobuf:"varint,2,opt,name=p80,proto3" json:"p80,omitempty"` + P90 int64 `protobuf:"varint,3,opt,name=p90,proto3" json:"p90,omitempty"` + P95 int64 `protobuf:"varint,4,opt,name=p95,proto3" json:"p95,omitempty"` + P99 int64 `protobuf:"varint,5,opt,name=p99,proto3" json:"p99,omitempty"` } -func (x *WorkloadWithActiveRecommendations) Reset() { - *x = WorkloadWithActiveRecommendations{} +func (x *PercentileValues) Reset() { + *x = PercentileValues{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[113] + mi := &file_api_v1_recommendation_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadWithActiveRecommendations) String() string { +func (x *PercentileValues) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadWithActiveRecommendations) ProtoMessage() {} +func (*PercentileValues) ProtoMessage() {} -func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[113] +func (x *PercentileValues) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9723,23 +11401,424 @@ func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use WorkloadWithActiveRecommendations.ProtoReflect.Descriptor instead. -func (*WorkloadWithActiveRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} +// Deprecated: Use PercentileValues.ProtoReflect.Descriptor instead. +func (*PercentileValues) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{115} } -func (x *WorkloadWithActiveRecommendations) GetWorkloads() []*WorkloadIdentifier { +func (x *PercentileValues) GetP50() int64 { if x != nil { - return x.Workloads + return x.P50 } - return nil + return 0 } -// GenericResourceRecommendation definitions -type GenericResourceRecommendation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *PercentileValues) GetP80() int64 { + if x != nil { + return x.P80 + } + return 0 +} + +func (x *PercentileValues) GetP90() int64 { + if x != nil { + return x.P90 + } + return 0 +} + +func (x *PercentileValues) GetP95() int64 { + if x != nil { + return x.P95 + } + return 0 +} + +func (x *PercentileValues) GetP99() int64 { + if x != nil { + return x.P99 + } + return 0 +} + +// ResourcePercentiles contains percentile sets for all resource axes +type ResourcePercentiles struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cpu *PercentileValues `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory *PercentileValues `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` + Network *PercentileValues `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"` + Disk *PercentileValues `protobuf:"bytes,4,opt,name=disk,proto3" json:"disk,omitempty"` +} + +func (x *ResourcePercentiles) Reset() { + *x = ResourcePercentiles{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[116] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourcePercentiles) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResourcePercentiles) ProtoMessage() {} + +func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[116] + 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 ResourcePercentiles.ProtoReflect.Descriptor instead. +func (*ResourcePercentiles) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{116} +} + +func (x *ResourcePercentiles) GetCpu() *PercentileValues { + if x != nil { + return x.Cpu + } + return nil +} + +func (x *ResourcePercentiles) GetMemory() *PercentileValues { + if x != nil { + return x.Memory + } + return nil +} + +func (x *ResourcePercentiles) GetNetwork() *PercentileValues { + if x != nil { + return x.Network + } + return nil +} + +func (x *ResourcePercentiles) GetDisk() *PercentileValues { + if x != nil { + return x.Disk + } + return nil +} + +// BurstinessRatios contains the p95/p50 ratio for each resource axis +type BurstinessRatios struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cpu float64 `protobuf:"fixed64,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory float64 `protobuf:"fixed64,2,opt,name=memory,proto3" json:"memory,omitempty"` + Network float64 `protobuf:"fixed64,3,opt,name=network,proto3" json:"network,omitempty"` + Disk float64 `protobuf:"fixed64,4,opt,name=disk,proto3" json:"disk,omitempty"` + PmaxCpu float64 `protobuf:"fixed64,5,opt,name=pmax_cpu,json=pmaxCpu,proto3" json:"pmax_cpu,omitempty"` // pmax/p50 ratio for CPU (spike severity) + PmaxMem float64 `protobuf:"fixed64,6,opt,name=pmax_mem,json=pmaxMem,proto3" json:"pmax_mem,omitempty"` // pmax/p50 ratio for memory (spike severity) +} + +func (x *BurstinessRatios) Reset() { + *x = BurstinessRatios{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BurstinessRatios) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BurstinessRatios) ProtoMessage() {} + +func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[117] + 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 BurstinessRatios.ProtoReflect.Descriptor instead. +func (*BurstinessRatios) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{117} +} + +func (x *BurstinessRatios) GetCpu() float64 { + if x != nil { + return x.Cpu + } + return 0 +} + +func (x *BurstinessRatios) GetMemory() float64 { + if x != nil { + return x.Memory + } + return 0 +} + +func (x *BurstinessRatios) GetNetwork() float64 { + if x != nil { + return x.Network + } + return 0 +} + +func (x *BurstinessRatios) GetDisk() float64 { + if x != nil { + return x.Disk + } + return 0 +} + +func (x *BurstinessRatios) GetPmaxCpu() float64 { + if x != nil { + return x.PmaxCpu + } + return 0 +} + +func (x *BurstinessRatios) GetPmaxMem() float64 { + if x != nil { + return x.PmaxMem + } + return 0 +} + +// WorkloadClassification contains workload classification based on resource dominance and burstiness +type WorkloadClassification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DominantResource string `protobuf:"bytes,1,opt,name=dominant_resource,json=dominantResource,proto3" json:"dominant_resource,omitempty"` // cpu, memory, gpu, network, disk, unknown + Burstiness *BurstinessRatios `protobuf:"bytes,2,opt,name=burstiness,proto3" json:"burstiness,omitempty"` +} + +func (x *WorkloadClassification) Reset() { + *x = WorkloadClassification{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[118] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadClassification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadClassification) ProtoMessage() {} + +func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_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 WorkloadClassification.ProtoReflect.Descriptor instead. +func (*WorkloadClassification) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{118} +} + +func (x *WorkloadClassification) GetDominantResource() string { + if x != nil { + return x.DominantResource + } + return "" +} + +func (x *WorkloadClassification) GetBurstiness() *BurstinessRatios { + if x != nil { + return x.Burstiness + } + return nil +} + +type BatchWorkloadRules struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + RuleIdsToDelete []string `protobuf:"bytes,2,rep,name=rule_ids_to_delete,json=ruleIdsToDelete,proto3" json:"rule_ids_to_delete,omitempty"` // rule IDs whose CRDs should be deleted from cluster +} + +func (x *BatchWorkloadRules) Reset() { + *x = BatchWorkloadRules{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[119] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchWorkloadRules) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchWorkloadRules) ProtoMessage() {} + +func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_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 BatchWorkloadRules.ProtoReflect.Descriptor instead. +func (*BatchWorkloadRules) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{119} +} + +func (x *BatchWorkloadRules) GetRules() []*WorkloadRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *BatchWorkloadRules) GetRuleIdsToDelete() []string { + if x != nil { + return x.RuleIdsToDelete + } + return nil +} + +type BatchHPAConnectors struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Connectors []*HPAConnector `protobuf:"bytes,1,rep,name=connectors,proto3" json:"connectors,omitempty"` + ConnectorIdsToDelete []string `protobuf:"bytes,2,rep,name=connector_ids_to_delete,json=connectorIdsToDelete,proto3" json:"connector_ids_to_delete,omitempty"` +} + +func (x *BatchHPAConnectors) Reset() { + *x = BatchHPAConnectors{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[120] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchHPAConnectors) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchHPAConnectors) ProtoMessage() {} + +func (x *BatchHPAConnectors) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_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 BatchHPAConnectors.ProtoReflect.Descriptor instead. +func (*BatchHPAConnectors) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{120} +} + +func (x *BatchHPAConnectors) GetConnectors() []*HPAConnector { + if x != nil { + return x.Connectors + } + return nil +} + +func (x *BatchHPAConnectors) GetConnectorIdsToDelete() []string { + if x != nil { + return x.ConnectorIdsToDelete + } + return nil +} + +type WorkloadWithActiveRecommendations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` // picking this pattern since caller has to iterate over the list anyway +} + +func (x *WorkloadWithActiveRecommendations) Reset() { + *x = WorkloadWithActiveRecommendations{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[121] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadWithActiveRecommendations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadWithActiveRecommendations) ProtoMessage() {} + +func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_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 WorkloadWithActiveRecommendations.ProtoReflect.Descriptor instead. +func (*WorkloadWithActiveRecommendations) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{121} +} + +func (x *WorkloadWithActiveRecommendations) GetWorkloads() []*WorkloadIdentifier { + if x != nil { + return x.Workloads + } + return nil +} + +// GenericResourceRecommendation definitions +type GenericResourceRecommendation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` @@ -9767,7 +11846,7 @@ type GenericResourceRecommendation struct { func (x *GenericResourceRecommendation) Reset() { *x = GenericResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[114] + mi := &file_api_v1_recommendation_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9780,7 +11859,7 @@ func (x *GenericResourceRecommendation) String() string { func (*GenericResourceRecommendation) ProtoMessage() {} func (x *GenericResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[114] + mi := &file_api_v1_recommendation_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9793,7 +11872,7 @@ func (x *GenericResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use GenericResourceRecommendation.ProtoReflect.Descriptor instead. func (*GenericResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{114} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{122} } func (x *GenericResourceRecommendation) GetRecommendationId() string { @@ -9905,7 +11984,7 @@ type BatchGenericResourceRecommendations struct { func (x *BatchGenericResourceRecommendations) Reset() { *x = BatchGenericResourceRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[115] + mi := &file_api_v1_recommendation_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9918,7 +11997,7 @@ func (x *BatchGenericResourceRecommendations) String() string { func (*BatchGenericResourceRecommendations) ProtoMessage() {} func (x *BatchGenericResourceRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[115] + mi := &file_api_v1_recommendation_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9931,7 +12010,7 @@ func (x *BatchGenericResourceRecommendations) ProtoReflect() protoreflect.Messag // Deprecated: Use BatchGenericResourceRecommendations.ProtoReflect.Descriptor instead. func (*BatchGenericResourceRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{115} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{123} } func (x *BatchGenericResourceRecommendations) GetRecommendations() []*GenericResourceRecommendation { @@ -9952,7 +12031,7 @@ type BatchPvcStorageRecommendations struct { func (x *BatchPvcStorageRecommendations) Reset() { *x = BatchPvcStorageRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[116] + mi := &file_api_v1_recommendation_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9965,7 +12044,7 @@ func (x *BatchPvcStorageRecommendations) String() string { func (*BatchPvcStorageRecommendations) ProtoMessage() {} func (x *BatchPvcStorageRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[116] + mi := &file_api_v1_recommendation_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9978,7 +12057,7 @@ func (x *BatchPvcStorageRecommendations) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchPvcStorageRecommendations.ProtoReflect.Descriptor instead. func (*BatchPvcStorageRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{116} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{124} } func (x *BatchPvcStorageRecommendations) GetRecommendations() []*PvcStorageRecommendation { @@ -10001,7 +12080,7 @@ type GeneratePodDisruptionBudgetRequest struct { func (x *GeneratePodDisruptionBudgetRequest) Reset() { *x = GeneratePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[117] + mi := &file_api_v1_recommendation_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10014,7 +12093,7 @@ func (x *GeneratePodDisruptionBudgetRequest) String() string { func (*GeneratePodDisruptionBudgetRequest) ProtoMessage() {} func (x *GeneratePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[117] + mi := &file_api_v1_recommendation_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10027,7 +12106,7 @@ func (x *GeneratePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GeneratePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*GeneratePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{117} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{125} } func (x *GeneratePodDisruptionBudgetRequest) GetClusterId() string { @@ -10062,7 +12141,7 @@ type GeneratePodDisruptionBudgetResponse struct { func (x *GeneratePodDisruptionBudgetResponse) Reset() { *x = GeneratePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[118] + mi := &file_api_v1_recommendation_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10075,7 +12154,7 @@ func (x *GeneratePodDisruptionBudgetResponse) String() string { func (*GeneratePodDisruptionBudgetResponse) ProtoMessage() {} func (x *GeneratePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[118] + mi := &file_api_v1_recommendation_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10088,7 +12167,7 @@ func (x *GeneratePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use GeneratePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*GeneratePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{118} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{126} } func (x *GeneratePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10111,7 +12190,7 @@ type GenerateAndCreatePodDisruptionBudgetRequest struct { func (x *GenerateAndCreatePodDisruptionBudgetRequest) Reset() { *x = GenerateAndCreatePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[119] + mi := &file_api_v1_recommendation_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10124,7 +12203,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetRequest) String() string { func (*GenerateAndCreatePodDisruptionBudgetRequest) ProtoMessage() {} func (x *GenerateAndCreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[119] + mi := &file_api_v1_recommendation_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10137,7 +12216,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetRequest) ProtoReflect() protoreflec // Deprecated: Use GenerateAndCreatePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*GenerateAndCreatePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{119} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{127} } func (x *GenerateAndCreatePodDisruptionBudgetRequest) GetClusterId() string { @@ -10172,7 +12251,7 @@ type GenerateAndCreatePodDisruptionBudgetResponse struct { func (x *GenerateAndCreatePodDisruptionBudgetResponse) Reset() { *x = GenerateAndCreatePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[120] + mi := &file_api_v1_recommendation_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10185,7 +12264,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetResponse) String() string { func (*GenerateAndCreatePodDisruptionBudgetResponse) ProtoMessage() {} func (x *GenerateAndCreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[120] + mi := &file_api_v1_recommendation_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10198,7 +12277,7 @@ func (x *GenerateAndCreatePodDisruptionBudgetResponse) ProtoReflect() protorefle // Deprecated: Use GenerateAndCreatePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*GenerateAndCreatePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{120} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{128} } func (x *GenerateAndCreatePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10220,7 +12299,7 @@ type CreatePodDisruptionBudgetRequest struct { func (x *CreatePodDisruptionBudgetRequest) Reset() { *x = CreatePodDisruptionBudgetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[121] + mi := &file_api_v1_recommendation_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10233,7 +12312,7 @@ func (x *CreatePodDisruptionBudgetRequest) String() string { func (*CreatePodDisruptionBudgetRequest) ProtoMessage() {} func (x *CreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[121] + mi := &file_api_v1_recommendation_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10246,7 +12325,7 @@ func (x *CreatePodDisruptionBudgetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreatePodDisruptionBudgetRequest.ProtoReflect.Descriptor instead. func (*CreatePodDisruptionBudgetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{121} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{129} } func (x *CreatePodDisruptionBudgetRequest) GetTeamId() string { @@ -10274,7 +12353,7 @@ type CreatePodDisruptionBudgetResponse struct { func (x *CreatePodDisruptionBudgetResponse) Reset() { *x = CreatePodDisruptionBudgetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[122] + mi := &file_api_v1_recommendation_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10287,7 +12366,7 @@ func (x *CreatePodDisruptionBudgetResponse) String() string { func (*CreatePodDisruptionBudgetResponse) ProtoMessage() {} func (x *CreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[122] + mi := &file_api_v1_recommendation_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10300,7 +12379,7 @@ func (x *CreatePodDisruptionBudgetResponse) ProtoReflect() protoreflect.Message // Deprecated: Use CreatePodDisruptionBudgetResponse.ProtoReflect.Descriptor instead. func (*CreatePodDisruptionBudgetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{122} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{130} } func (x *CreatePodDisruptionBudgetResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10322,7 +12401,7 @@ type GetPDBRecommendationForWorkloadRequest struct { func (x *GetPDBRecommendationForWorkloadRequest) Reset() { *x = GetPDBRecommendationForWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[123] + mi := &file_api_v1_recommendation_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10335,7 +12414,7 @@ func (x *GetPDBRecommendationForWorkloadRequest) String() string { func (*GetPDBRecommendationForWorkloadRequest) ProtoMessage() {} func (x *GetPDBRecommendationForWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[123] + mi := &file_api_v1_recommendation_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10348,7 +12427,7 @@ func (x *GetPDBRecommendationForWorkloadRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetPDBRecommendationForWorkloadRequest.ProtoReflect.Descriptor instead. func (*GetPDBRecommendationForWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{123} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{131} } func (x *GetPDBRecommendationForWorkloadRequest) GetClusterId() string { @@ -10377,7 +12456,7 @@ type GetPDBRecommendationForWorkloadResponse struct { func (x *GetPDBRecommendationForWorkloadResponse) Reset() { *x = GetPDBRecommendationForWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[124] + mi := &file_api_v1_recommendation_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10390,7 +12469,7 @@ func (x *GetPDBRecommendationForWorkloadResponse) String() string { func (*GetPDBRecommendationForWorkloadResponse) ProtoMessage() {} func (x *GetPDBRecommendationForWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[124] + mi := &file_api_v1_recommendation_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10403,7 +12482,7 @@ func (x *GetPDBRecommendationForWorkloadResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetPDBRecommendationForWorkloadResponse.ProtoReflect.Descriptor instead. func (*GetPDBRecommendationForWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{124} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{132} } func (x *GetPDBRecommendationForWorkloadResponse) GetRecommendation() *GenericResourceRecommendation { @@ -10413,34 +12492,44 @@ func (x *GetPDBRecommendationForWorkloadResponse) GetRecommendation() *GenericRe return nil } -type ReconcileWorkload struct { +// StructuralHealthFinding is a single structural-health finding for a workload, +// composed from either disruption-fragility or a net-new structural check (e.g. +// topology-concentration). See dakr/services/structuralhealth. +type StructuralHealthFinding struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind K8SObjectKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` - WorkloadName string `protobuf:"bytes,2,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadUid string `protobuf:"bytes,4,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // for consistency + traceability + // "DISRUPTION_FRAGILITY" | "TOPOLOGY_CONCENTRATION" + CheckType string `protobuf:"bytes,1,opt,name=check_type,json=checkType,proto3" json:"check_type,omitempty"` + // "HIGH" | "MEDIUM" + Severity string `protobuf:"bytes,2,opt,name=severity,proto3" json:"severity,omitempty"` + // e.g. "NO_PDB_MULTI_REPLICA" (fragility) or "ALL_REPLICAS_ONE_NODE" (topology) + ReasonCode string `protobuf:"bytes,3,opt,name=reason_code,json=reasonCode,proto3" json:"reason_code,omitempty"` + FirstSeenAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=first_seen_at,json=firstSeenAt,proto3" json:"first_seen_at,omitempty"` + // Check-specific structured payload (e.g. replica_count/pdb_name for + // fragility findings, node_count for topology findings), JSON-encoded since + // its shape varies per check type rather than being modeled as a oneof. + DetailJson string `protobuf:"bytes,5,opt,name=detail_json,json=detailJson,proto3" json:"detail_json,omitempty"` } -func (x *ReconcileWorkload) Reset() { - *x = ReconcileWorkload{} +func (x *StructuralHealthFinding) Reset() { + *x = StructuralHealthFinding{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[125] + mi := &file_api_v1_recommendation_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReconcileWorkload) String() string { +func (x *StructuralHealthFinding) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReconcileWorkload) ProtoMessage() {} +func (*StructuralHealthFinding) ProtoMessage() {} -func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[125] +func (x *StructuralHealthFinding) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10451,67 +12540,78 @@ func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReconcileWorkload.ProtoReflect.Descriptor instead. -func (*ReconcileWorkload) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{125} +// Deprecated: Use StructuralHealthFinding.ProtoReflect.Descriptor instead. +func (*StructuralHealthFinding) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{133} } -func (x *ReconcileWorkload) GetKind() K8SObjectKind { +func (x *StructuralHealthFinding) GetCheckType() string { if x != nil { - return x.Kind + return x.CheckType } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED + return "" } -func (x *ReconcileWorkload) GetWorkloadName() string { +func (x *StructuralHealthFinding) GetSeverity() string { if x != nil { - return x.WorkloadName + return x.Severity } return "" } -func (x *ReconcileWorkload) GetNamespace() string { +func (x *StructuralHealthFinding) GetReasonCode() string { if x != nil { - return x.Namespace + return x.ReasonCode } return "" } -func (x *ReconcileWorkload) GetWorkloadUid() string { +func (x *StructuralHealthFinding) GetFirstSeenAt() *timestamppb.Timestamp { if x != nil { - return x.WorkloadUid + return x.FirstSeenAt + } + return nil +} + +func (x *StructuralHealthFinding) GetDetailJson() string { + if x != nil { + return x.DetailJson } return "" } -type ReconcileResponse struct { +// WorkloadStructuralHealth is one workload's fully composed set of open +// structural-health findings across every check type. +type WorkloadStructuralHealth struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - WorkloadUid string `protobuf:"bytes,2,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` - Status ReconcileStatus `protobuf:"varint,3,opt,name=status,proto3,enum=api.v1.ReconcileStatus" json:"status,omitempty"` - UpdatedRecommendation *WorkloadRecommendation `protobuf:"bytes,11,opt,name=updated_recommendation,json=updatedRecommendation,proto3,oneof" json:"updated_recommendation,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // "Deployment" | "StatefulSet" + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` + Findings []*StructuralHealthFinding `protobuf:"bytes,6,rep,name=findings,proto3" json:"findings,omitempty"` } -func (x *ReconcileResponse) Reset() { - *x = ReconcileResponse{} +func (x *WorkloadStructuralHealth) Reset() { + *x = WorkloadStructuralHealth{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[126] + mi := &file_api_v1_recommendation_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReconcileResponse) String() string { +func (x *WorkloadStructuralHealth) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReconcileResponse) ProtoMessage() {} +func (*WorkloadStructuralHealth) ProtoMessage() {} -func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[126] +func (x *WorkloadStructuralHealth) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10522,28 +12622,286 @@ func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReconcileResponse.ProtoReflect.Descriptor instead. -func (*ReconcileResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{126} +// Deprecated: Use WorkloadStructuralHealth.ProtoReflect.Descriptor instead. +func (*WorkloadStructuralHealth) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{134} } -func (x *ReconcileResponse) GetRequestId() string { +func (x *WorkloadStructuralHealth) GetClusterId() string { if x != nil { - return x.RequestId + return x.ClusterId } return "" } -func (x *ReconcileResponse) GetWorkloadUid() string { +func (x *WorkloadStructuralHealth) GetNamespace() string { if x != nil { - return x.WorkloadUid + return x.Namespace } return "" } -func (x *ReconcileResponse) GetStatus() ReconcileStatus { +func (x *WorkloadStructuralHealth) GetKind() string { if x != nil { - return x.Status + return x.Kind + } + return "" +} + +func (x *WorkloadStructuralHealth) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkloadStructuralHealth) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *WorkloadStructuralHealth) GetFindings() []*StructuralHealthFinding { + if x != nil { + return x.Findings + } + return nil +} + +type ListWorkloadStructuralHealthRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` +} + +func (x *ListWorkloadStructuralHealthRequest) Reset() { + *x = ListWorkloadStructuralHealthRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[135] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadStructuralHealthRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadStructuralHealthRequest) ProtoMessage() {} + +func (x *ListWorkloadStructuralHealthRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[135] + 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 ListWorkloadStructuralHealthRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadStructuralHealthRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{135} +} + +func (x *ListWorkloadStructuralHealthRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListWorkloadStructuralHealthRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +type ListWorkloadStructuralHealthResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Workloads []*WorkloadStructuralHealth `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` +} + +func (x *ListWorkloadStructuralHealthResponse) Reset() { + *x = ListWorkloadStructuralHealthResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[136] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadStructuralHealthResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadStructuralHealthResponse) ProtoMessage() {} + +func (x *ListWorkloadStructuralHealthResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[136] + 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 ListWorkloadStructuralHealthResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadStructuralHealthResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{136} +} + +func (x *ListWorkloadStructuralHealthResponse) GetWorkloads() []*WorkloadStructuralHealth { + if x != nil { + return x.Workloads + } + return nil +} + +type ReconcileWorkload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind K8SObjectKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,2,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadUid string `protobuf:"bytes,4,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // for consistency + traceability +} + +func (x *ReconcileWorkload) Reset() { + *x = ReconcileWorkload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[137] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReconcileWorkload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReconcileWorkload) ProtoMessage() {} + +func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[137] + 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 ReconcileWorkload.ProtoReflect.Descriptor instead. +func (*ReconcileWorkload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{137} +} + +func (x *ReconcileWorkload) GetKind() K8SObjectKind { + if x != nil { + return x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +func (x *ReconcileWorkload) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *ReconcileWorkload) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ReconcileWorkload) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +type ReconcileResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + WorkloadUid string `protobuf:"bytes,2,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + Status ReconcileStatus `protobuf:"varint,3,opt,name=status,proto3,enum=api.v1.ReconcileStatus" json:"status,omitempty"` + UpdatedRecommendation *WorkloadRecommendation `protobuf:"bytes,11,opt,name=updated_recommendation,json=updatedRecommendation,proto3,oneof" json:"updated_recommendation,omitempty"` +} + +func (x *ReconcileResponse) Reset() { + *x = ReconcileResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[138] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReconcileResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReconcileResponse) ProtoMessage() {} + +func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[138] + 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 ReconcileResponse.ProtoReflect.Descriptor instead. +func (*ReconcileResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{138} +} + +func (x *ReconcileResponse) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *ReconcileResponse) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +func (x *ReconcileResponse) GetStatus() ReconcileStatus { + if x != nil { + return x.Status } return ReconcileStatus_RECONCILE_STATUS_NOOP } @@ -10578,7 +12936,7 @@ type OperatorHealth struct { func (x *OperatorHealth) Reset() { *x = OperatorHealth{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[127] + mi := &file_api_v1_recommendation_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10591,7 +12949,7 @@ func (x *OperatorHealth) String() string { func (*OperatorHealth) ProtoMessage() {} func (x *OperatorHealth) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[127] + mi := &file_api_v1_recommendation_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10604,7 +12962,7 @@ func (x *OperatorHealth) ProtoReflect() protoreflect.Message { // Deprecated: Use OperatorHealth.ProtoReflect.Descriptor instead. func (*OperatorHealth) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{127} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{139} } func (x *OperatorHealth) GetHealthy() bool { @@ -10709,7 +13067,7 @@ type AgentHealth struct { func (x *AgentHealth) Reset() { *x = AgentHealth{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[128] + mi := &file_api_v1_recommendation_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10722,7 +13080,7 @@ func (x *AgentHealth) String() string { func (*AgentHealth) ProtoMessage() {} func (x *AgentHealth) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[128] + mi := &file_api_v1_recommendation_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10735,7 +13093,7 @@ func (x *AgentHealth) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentHealth.ProtoReflect.Descriptor instead. func (*AgentHealth) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{128} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{140} } func (x *AgentHealth) GetNodeNameToAgent() map[string]*AgentHealthMeta { @@ -10760,7 +13118,7 @@ type AgentHealthMeta struct { func (x *AgentHealthMeta) Reset() { *x = AgentHealthMeta{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[129] + mi := &file_api_v1_recommendation_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10773,7 +13131,7 @@ func (x *AgentHealthMeta) String() string { func (*AgentHealthMeta) ProtoMessage() {} func (x *AgentHealthMeta) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[129] + mi := &file_api_v1_recommendation_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10786,7 +13144,7 @@ func (x *AgentHealthMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentHealthMeta.ProtoReflect.Descriptor instead. func (*AgentHealthMeta) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{129} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{141} } func (x *AgentHealthMeta) GetHealthy() bool { @@ -10834,7 +13192,7 @@ type HealthReport struct { func (x *HealthReport) Reset() { *x = HealthReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[130] + mi := &file_api_v1_recommendation_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10847,7 +13205,7 @@ func (x *HealthReport) String() string { func (*HealthReport) ProtoMessage() {} func (x *HealthReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[130] + mi := &file_api_v1_recommendation_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10860,7 +13218,7 @@ func (x *HealthReport) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthReport.ProtoReflect.Descriptor instead. func (*HealthReport) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{130} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{142} } type NodeStats struct { @@ -10881,7 +13239,7 @@ type NodeStats struct { func (x *NodeStats) Reset() { *x = NodeStats{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[131] + mi := &file_api_v1_recommendation_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10894,7 +13252,7 @@ func (x *NodeStats) String() string { func (*NodeStats) ProtoMessage() {} func (x *NodeStats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[131] + mi := &file_api_v1_recommendation_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10907,7 +13265,7 @@ func (x *NodeStats) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeStats.ProtoReflect.Descriptor instead. func (*NodeStats) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{131} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{143} } func (x *NodeStats) GetNodeGroupName() string { @@ -10989,7 +13347,7 @@ type NodeMetric struct { func (x *NodeMetric) Reset() { *x = NodeMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[132] + mi := &file_api_v1_recommendation_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11002,7 +13360,7 @@ func (x *NodeMetric) String() string { func (*NodeMetric) ProtoMessage() {} func (x *NodeMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[132] + mi := &file_api_v1_recommendation_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11015,7 +13373,7 @@ func (x *NodeMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeMetric.ProtoReflect.Descriptor instead. func (*NodeMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{132} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{144} } func (x *NodeMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11126,7 +13484,7 @@ type ContainerStats struct { func (x *ContainerStats) Reset() { *x = ContainerStats{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[133] + mi := &file_api_v1_recommendation_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11139,7 +13497,7 @@ func (x *ContainerStats) String() string { func (*ContainerStats) ProtoMessage() {} func (x *ContainerStats) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[133] + mi := &file_api_v1_recommendation_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11152,7 +13510,7 @@ func (x *ContainerStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerStats.ProtoReflect.Descriptor instead. func (*ContainerStats) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{133} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{145} } func (x *ContainerStats) GetWorkloadUid() string { @@ -11227,7 +13585,7 @@ type ContainerMetric struct { func (x *ContainerMetric) Reset() { *x = ContainerMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[134] + mi := &file_api_v1_recommendation_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11240,7 +13598,7 @@ func (x *ContainerMetric) String() string { func (*ContainerMetric) ProtoMessage() {} func (x *ContainerMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[134] + mi := &file_api_v1_recommendation_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11253,7 +13611,7 @@ func (x *ContainerMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerMetric.ProtoReflect.Descriptor instead. func (*ContainerMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{134} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{146} } func (x *ContainerMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11362,7 +13720,7 @@ type ContainerSummarizedMetric struct { func (x *ContainerSummarizedMetric) Reset() { *x = ContainerSummarizedMetric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[135] + mi := &file_api_v1_recommendation_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11375,7 +13733,7 @@ func (x *ContainerSummarizedMetric) String() string { func (*ContainerSummarizedMetric) ProtoMessage() {} func (x *ContainerSummarizedMetric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[135] + mi := &file_api_v1_recommendation_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11388,7 +13746,7 @@ func (x *ContainerSummarizedMetric) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerSummarizedMetric.ProtoReflect.Descriptor instead. func (*ContainerSummarizedMetric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{135} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{147} } func (x *ContainerSummarizedMetric) GetTimestamp() *timestamppb.Timestamp { @@ -11448,7 +13806,7 @@ type Metric struct { func (x *Metric) Reset() { *x = Metric{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[136] + mi := &file_api_v1_recommendation_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11461,7 +13819,7 @@ func (x *Metric) String() string { func (*Metric) ProtoMessage() {} func (x *Metric) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[136] + mi := &file_api_v1_recommendation_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11474,7 +13832,7 @@ func (x *Metric) ProtoReflect() protoreflect.Message { // Deprecated: Use Metric.ProtoReflect.Descriptor instead. func (*Metric) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{136} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{148} } func (x *Metric) GetMin() float32 { @@ -11572,12 +13930,23 @@ type ContainerRecommendation struct { CurrentLimit *ResourceRecommendation `protobuf:"bytes,4,opt,name=current_limit,json=currentLimit,proto3" json:"current_limit,omitempty"` RecommendedLimit *ResourceRecommendation `protobuf:"bytes,5,opt,name=recommended_limit,json=recommendedLimit,proto3" json:"recommended_limit,omitempty"` OptimizationScore float64 `protobuf:"fixed64,6,opt,name=optimization_score,json=optimizationScore,proto3" json:"optimization_score,omitempty"` + // Per-element env var mutations for this container (merge key: name). + // The operator merges these into the live container.Env; entries not + // referenced here are left untouched. + EnvMutations []*EnvVarMutation `protobuf:"bytes,11,rep,name=env_mutations,json=envMutations,proto3" json:"env_mutations,omitempty"` + // Per-flag command/arg mutations for this container. Used to carry + // command-line directives (e.g. JVM -Xmx) already lowered by the control + // plane into a concrete flag edit. + CommandArgMutations []*CommandArgMutation `protobuf:"bytes,12,rep,name=command_arg_mutations,json=commandArgMutations,proto3" json:"command_arg_mutations,omitempty"` + // Whether this container was observed OOM-killed, driving the memory + // recommendation. + OomTriggered bool `protobuf:"varint,13,opt,name=oom_triggered,json=oomTriggered,proto3" json:"oom_triggered,omitempty"` } func (x *ContainerRecommendation) Reset() { *x = ContainerRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[137] + mi := &file_api_v1_recommendation_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11590,7 +13959,7 @@ func (x *ContainerRecommendation) String() string { func (*ContainerRecommendation) ProtoMessage() {} func (x *ContainerRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[137] + mi := &file_api_v1_recommendation_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11603,7 +13972,7 @@ func (x *ContainerRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerRecommendation.ProtoReflect.Descriptor instead. func (*ContainerRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{137} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{149} } func (x *ContainerRecommendation) GetContainerName() string { @@ -11648,6 +14017,27 @@ func (x *ContainerRecommendation) GetOptimizationScore() float64 { return 0 } +func (x *ContainerRecommendation) GetEnvMutations() []*EnvVarMutation { + if x != nil { + return x.EnvMutations + } + return nil +} + +func (x *ContainerRecommendation) GetCommandArgMutations() []*CommandArgMutation { + if x != nil { + return x.CommandArgMutations + } + return nil +} + +func (x *ContainerRecommendation) GetOomTriggered() bool { + if x != nil { + return x.OomTriggered + } + return false +} + type KedaScaledObjectRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -11663,7 +14053,7 @@ type KedaScaledObjectRecommendation struct { func (x *KedaScaledObjectRecommendation) Reset() { *x = KedaScaledObjectRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[138] + mi := &file_api_v1_recommendation_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11676,7 +14066,7 @@ func (x *KedaScaledObjectRecommendation) String() string { func (*KedaScaledObjectRecommendation) ProtoMessage() {} func (x *KedaScaledObjectRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[138] + mi := &file_api_v1_recommendation_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11689,7 +14079,7 @@ func (x *KedaScaledObjectRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use KedaScaledObjectRecommendation.ProtoReflect.Descriptor instead. func (*KedaScaledObjectRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{138} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{150} } func (x *KedaScaledObjectRecommendation) GetUid() string { @@ -11745,7 +14135,7 @@ type ResourceRecommendation struct { func (x *ResourceRecommendation) Reset() { *x = ResourceRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[139] + mi := &file_api_v1_recommendation_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11758,7 +14148,7 @@ func (x *ResourceRecommendation) String() string { func (*ResourceRecommendation) ProtoMessage() {} func (x *ResourceRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[139] + mi := &file_api_v1_recommendation_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11771,7 +14161,7 @@ func (x *ResourceRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceRecommendation.ProtoReflect.Descriptor instead. func (*ResourceRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{139} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{151} } func (x *ResourceRecommendation) GetCpu() int64 { @@ -11830,6 +14220,266 @@ func (x *ResourceRecommendation) GetGpuVramAction() ActionToTake { return ActionToTake_ACTION_TO_TAKE_SET } +// EnvVarMutation is a per-element edit to a container's env list. Merge key is +// `name`. value_from (secret/configMap refs) is intentionally deferred. +type EnvVarMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // merge key + Value *string `protobuf:"bytes,3,opt,name=value,proto3,oneof" json:"value,omitempty"` // literal value for UPSERT +} + +func (x *EnvVarMutation) Reset() { + *x = EnvVarMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[152] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvVarMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvVarMutation) ProtoMessage() {} + +func (x *EnvVarMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[152] + 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 EnvVarMutation.ProtoReflect.Descriptor instead. +func (*EnvVarMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{152} +} + +func (x *EnvVarMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *EnvVarMutation) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EnvVarMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// CommandArgMutation is a per-flag edit to a container's command or args list. +// The control plane lowers higher-level intent (e.g. JVM heap sizing) into this +// concrete flag edit so the operator stays generic. +type CommandArgMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Target ArgTarget `protobuf:"varint,2,opt,name=target,proto3,enum=api.v1.ArgTarget" json:"target,omitempty"` // command vs args + Flag string `protobuf:"bytes,3,opt,name=flag,proto3" json:"flag,omitempty"` // e.g. "-Xmx" + Value *string `protobuf:"bytes,4,opt,name=value,proto3,oneof" json:"value,omitempty"` // e.g. "512m"; empty for valueless flags +} + +func (x *CommandArgMutation) Reset() { + *x = CommandArgMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[153] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CommandArgMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CommandArgMutation) ProtoMessage() {} + +func (x *CommandArgMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[153] + 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 CommandArgMutation.ProtoReflect.Descriptor instead. +func (*CommandArgMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{153} +} + +func (x *CommandArgMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *CommandArgMutation) GetTarget() ArgTarget { + if x != nil { + return x.Target + } + return ArgTarget_ARG_TARGET_UNSPECIFIED +} + +func (x *CommandArgMutation) GetFlag() string { + if x != nil { + return x.Flag + } + return "" +} + +func (x *CommandArgMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// NodeSelectorMutation is a per-key edit to the pod's nodeSelector map. +type NodeSelectorMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // merge key + Value *string `protobuf:"bytes,3,opt,name=value,proto3,oneof" json:"value,omitempty"` // value for UPSERT +} + +func (x *NodeSelectorMutation) Reset() { + *x = NodeSelectorMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[154] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeSelectorMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeSelectorMutation) ProtoMessage() {} + +func (x *NodeSelectorMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[154] + 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 NodeSelectorMutation.ProtoReflect.Descriptor instead. +func (*NodeSelectorMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{154} +} + +func (x *NodeSelectorMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *NodeSelectorMutation) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *NodeSelectorMutation) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +// TolerationMutation is a per-element edit to the pod's tolerations list. +// Element identity is the full tuple. +type TolerationMutation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Action MutationAction `protobuf:"varint,1,opt,name=action,proto3,enum=api.v1.MutationAction" json:"action,omitempty"` + Toleration *Toleration `protobuf:"bytes,2,opt,name=toleration,proto3" json:"toleration,omitempty"` +} + +func (x *TolerationMutation) Reset() { + *x = TolerationMutation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[155] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TolerationMutation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TolerationMutation) ProtoMessage() {} + +func (x *TolerationMutation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[155] + 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 TolerationMutation.ProtoReflect.Descriptor instead. +func (*TolerationMutation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{155} +} + +func (x *TolerationMutation) GetAction() MutationAction { + if x != nil { + return x.Action + } + return MutationAction_MUTATION_ACTION_UNSPECIFIED +} + +func (x *TolerationMutation) GetToleration() *Toleration { + if x != nil { + return x.Toleration + } + return nil +} + // The pod this Toleration is attached to tolerates any taint that matches // the triple using the matching operator . type Toleration struct { @@ -11866,7 +14516,7 @@ type Toleration struct { func (x *Toleration) Reset() { *x = Toleration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[140] + mi := &file_api_v1_recommendation_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11879,7 +14529,7 @@ func (x *Toleration) String() string { func (*Toleration) ProtoMessage() {} func (x *Toleration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[140] + mi := &file_api_v1_recommendation_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11892,7 +14542,7 @@ func (x *Toleration) ProtoReflect() protoreflect.Message { // Deprecated: Use Toleration.ProtoReflect.Descriptor instead. func (*Toleration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{140} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{156} } func (x *Toleration) GetKey() string { @@ -11961,7 +14611,7 @@ type ClusterRecommendationPolicy struct { func (x *ClusterRecommendationPolicy) Reset() { *x = ClusterRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[141] + mi := &file_api_v1_recommendation_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11974,7 +14624,7 @@ func (x *ClusterRecommendationPolicy) String() string { func (*ClusterRecommendationPolicy) ProtoMessage() {} func (x *ClusterRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[141] + mi := &file_api_v1_recommendation_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11987,7 +14637,7 @@ func (x *ClusterRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use ClusterRecommendationPolicy.ProtoReflect.Descriptor instead. func (*ClusterRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{141} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{157} } func (x *ClusterRecommendationPolicy) GetPolicyId() string { @@ -12103,7 +14753,7 @@ type NodeGroupRecommendationPolicy struct { func (x *NodeGroupRecommendationPolicy) Reset() { *x = NodeGroupRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[142] + mi := &file_api_v1_recommendation_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12116,7 +14766,7 @@ func (x *NodeGroupRecommendationPolicy) String() string { func (*NodeGroupRecommendationPolicy) ProtoMessage() {} func (x *NodeGroupRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[142] + mi := &file_api_v1_recommendation_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12129,7 +14779,7 @@ func (x *NodeGroupRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupRecommendationPolicy.ProtoReflect.Descriptor instead. func (*NodeGroupRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{142} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{158} } func (x *NodeGroupRecommendationPolicy) GetPolicyId() string { @@ -12284,12 +14934,19 @@ type VerticalScalingOptimizationTarget struct { // Whether to actively remove limits from workloads (CPU only for now). // Takes precedence over limits_adjustment_enabled when true. LimitsRemovalEnabled bool `protobuf:"varint,42,opt,name=limits_removal_enabled,json=limitsRemovalEnabled,proto3" json:"limits_removal_enabled,omitempty"` + // Memory-only: when true, size the memory REQUEST recommendation from RSS + // (resident set size) instead of the default working set. Ignored for CPU/GPU. + RequestUseRss *bool `protobuf:"varint,43,opt,name=request_use_rss,json=requestUseRss,proto3,oneof" json:"request_use_rss,omitempty"` + // Memory-only: when true, the limit is derived from an RSS-based recommendation + // instead of the default working-set recommendation (the Limit multiplier still + // applies to whichever basis is selected). Ignored for CPU/GPU. + LimitUseRss *bool `protobuf:"varint,44,opt,name=limit_use_rss,json=limitUseRss,proto3,oneof" json:"limit_use_rss,omitempty"` } func (x *VerticalScalingOptimizationTarget) Reset() { *x = VerticalScalingOptimizationTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[143] + mi := &file_api_v1_recommendation_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12302,7 +14959,7 @@ func (x *VerticalScalingOptimizationTarget) String() string { func (*VerticalScalingOptimizationTarget) ProtoMessage() {} func (x *VerticalScalingOptimizationTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[143] + mi := &file_api_v1_recommendation_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12315,7 +14972,7 @@ func (x *VerticalScalingOptimizationTarget) ProtoReflect() protoreflect.Message // Deprecated: Use VerticalScalingOptimizationTarget.ProtoReflect.Descriptor instead. func (*VerticalScalingOptimizationTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{143} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{159} } func (x *VerticalScalingOptimizationTarget) GetEnabled() bool { @@ -12402,6 +15059,20 @@ func (x *VerticalScalingOptimizationTarget) GetLimitsRemovalEnabled() bool { return false } +func (x *VerticalScalingOptimizationTarget) GetRequestUseRss() bool { + if x != nil && x.RequestUseRss != nil { + return *x.RequestUseRss + } + return false +} + +func (x *VerticalScalingOptimizationTarget) GetLimitUseRss() bool { + if x != nil && x.LimitUseRss != nil { + return *x.LimitUseRss + } + return false +} + type HorizontalScalingOptimizationTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -12443,7 +15114,7 @@ type HorizontalScalingOptimizationTarget struct { func (x *HorizontalScalingOptimizationTarget) Reset() { *x = HorizontalScalingOptimizationTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[144] + mi := &file_api_v1_recommendation_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12456,7 +15127,7 @@ func (x *HorizontalScalingOptimizationTarget) String() string { func (*HorizontalScalingOptimizationTarget) ProtoMessage() {} func (x *HorizontalScalingOptimizationTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[144] + mi := &file_api_v1_recommendation_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12469,7 +15140,7 @@ func (x *HorizontalScalingOptimizationTarget) ProtoReflect() protoreflect.Messag // Deprecated: Use HorizontalScalingOptimizationTarget.ProtoReflect.Descriptor instead. func (*HorizontalScalingOptimizationTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{144} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{160} } func (x *HorizontalScalingOptimizationTarget) GetEnabled() bool { @@ -12606,15 +15277,17 @@ type WorkloadRecommendationPolicy struct { // Global cooldown configuration // Minutes to wait between applying recommendations (prevents thrashing) CooldownMinutes *int32 `protobuf:"varint,96,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - // Deprecated: no longer used. The legacy policy flow no longer creates workload rules. - // Workload rules are created via auto-optimization or the new WorkloadOptimizationPolicy flow. - // Field retained for wire-compatibility; will be reserved in a future cleanup. - EnableInclusterMpa bool `protobuf:"varint,97,opt,name=enable_incluster_mpa,json=enableInclusterMpa,proto3" json:"enable_incluster_mpa,omitempty"` // Feature flag: Enable In-Place Pod Vertical Scaling for this policy. // Requires Kubernetes >= v1.33 on all attached clusters. // When enabled, recommendations resize running pods via the /resize subresource // without triggering rolling restarts. EnableInPlaceVerticalScaling bool `protobuf:"varint,103,opt,name=enable_in_place_vertical_scaling,json=enableInPlaceVerticalScaling,proto3" json:"enable_in_place_vertical_scaling,omitempty"` + // Opt-in escape hatch for the riskiest half of in-place scaling: allowing a + // resize to LOWER a container's memory limit on a running pod. Gated behind + // enable_in_place_vertical_scaling and, independently, behind the cluster's + // Kubernetes version — this flag only ever removes DevZero's own refusal, it + // never makes an unsupported cluster accept the decrease. Default false. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,121,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // Policy-driven automation: enable PDB creation for workloads under this policy PdbEnabled bool `protobuf:"varint,98,opt,name=pdb_enabled,json=pdbEnabled,proto3" json:"pdb_enabled,omitempty"` EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,99,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` @@ -12623,12 +15296,54 @@ type WorkloadRecommendationPolicy struct { EnablePmaxProtection bool `protobuf:"varint,100,opt,name=enable_pmax_protection,json=enablePmaxProtection,proto3" json:"enable_pmax_protection,omitempty"` PmaxRatioThreshold *float32 `protobuf:"fixed32,101,opt,name=pmax_ratio_threshold,json=pmaxRatioThreshold,proto3,oneof" json:"pmax_ratio_threshold,omitempty"` // default: 3.0 DeletedAt *timestamppb.Timestamp `protobuf:"bytes,102,opt,name=deleted_at,json=deletedAt,proto3,oneof" json:"deleted_at,omitempty"` + // JVM heap optimization. Gated by jvm_heap_optimization_enabled; the optional + // knobs are overrides — unset means "use the current system default". + JvmHeapOptimizationEnabled bool `protobuf:"varint,104,opt,name=jvm_heap_optimization_enabled,json=jvmHeapOptimizationEnabled,proto3" json:"jvm_heap_optimization_enabled,omitempty"` + JvmHeapTargetPercentile *float32 `protobuf:"fixed32,105,opt,name=jvm_heap_target_percentile,json=jvmHeapTargetPercentile,proto3,oneof" json:"jvm_heap_target_percentile,omitempty"` + JvmHeapHeadroomMultiplier *float32 `protobuf:"fixed32,106,opt,name=jvm_heap_headroom_multiplier,json=jvmHeapHeadroomMultiplier,proto3,oneof" json:"jvm_heap_headroom_multiplier,omitempty"` + JvmNonHeapOverheadPercent *float32 `protobuf:"fixed32,107,opt,name=jvm_non_heap_overhead_percent,json=jvmNonHeapOverheadPercent,proto3,oneof" json:"jvm_non_heap_overhead_percent,omitempty"` + JvmNonHeapOverheadBytes *int64 `protobuf:"varint,108,opt,name=jvm_non_heap_overhead_bytes,json=jvmNonHeapOverheadBytes,proto3,oneof" json:"jvm_non_heap_overhead_bytes,omitempty"` + JvmMinHeapBytes *int64 `protobuf:"varint,109,opt,name=jvm_min_heap_bytes,json=jvmMinHeapBytes,proto3,oneof" json:"jvm_min_heap_bytes,omitempty"` + JvmMaxHeapBytes *int64 `protobuf:"varint,110,opt,name=jvm_max_heap_bytes,json=jvmMaxHeapBytes,proto3,oneof" json:"jvm_max_heap_bytes,omitempty"` + JvmPreferContainerSupport bool `protobuf:"varint,111,opt,name=jvm_prefer_container_support,json=jvmPreferContainerSupport,proto3" json:"jvm_prefer_container_support,omitempty"` + // Minimum CPU request (millicores) for detected JVM containers, protecting + // JVM startup (classloading, JIT warmup, agent instrumentation) from CPU + // starvation under node contention. Standalone knob — part of the always-on + // "respect JVM state" path, NOT gated by jvm_heap_optimization_enabled. + // Unset = system default (75m). Explicit 0 = floor disabled (only the + // generic CPU minimum applies). + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,112,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Recommendation floor percentage (per resource, request only): the + // recommended request is never lowered below pct% (1-100) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). Unset = floor disabled. + CpuFloorPercent *int64 `protobuf:"varint,113,opt,name=cpu_floor_percent,json=cpuFloorPercent,proto3,oneof" json:"cpu_floor_percent,omitempty"` + MemoryFloorPercent *int64 `protobuf:"varint,114,opt,name=memory_floor_percent,json=memoryFloorPercent,proto3,oneof" json:"memory_floor_percent,omitempty"` + // Recommendation ceiling percentage (per resource, request only): the + // recommended request is never raised above pct% (1-1000) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). A ceiling below 100 is intentionally + // allowed as a baseline-relative cap distinct from max_request. Unset = + // ceiling disabled. + CpuCeilingPercent *int64 `protobuf:"varint,115,opt,name=cpu_ceiling_percent,json=cpuCeilingPercent,proto3,oneof" json:"cpu_ceiling_percent,omitempty"` + MemoryCeilingPercent *int64 `protobuf:"varint,116,opt,name=memory_ceiling_percent,json=memoryCeilingPercent,proto3,oneof" json:"memory_ceiling_percent,omitempty"` + // Limit floor/ceiling percentage (per resource, limit only): the + // recommended limit is never lowered below the floor pct (1-100) nor + // raised above the ceiling pct (1-1000) of the container's immutable + // initial-limit baseline (workload_resource_baselines). Applied only when + // that resource's limits adjustment is enabled and limits removal is not; + // the recommended request always wins over the limit ceiling (the limit + // is never clamped below the request). Unset = bound disabled. + CpuLimitFloorPercent *int64 `protobuf:"varint,117,opt,name=cpu_limit_floor_percent,json=cpuLimitFloorPercent,proto3,oneof" json:"cpu_limit_floor_percent,omitempty"` + MemoryLimitFloorPercent *int64 `protobuf:"varint,118,opt,name=memory_limit_floor_percent,json=memoryLimitFloorPercent,proto3,oneof" json:"memory_limit_floor_percent,omitempty"` + CpuLimitCeilingPercent *int64 `protobuf:"varint,119,opt,name=cpu_limit_ceiling_percent,json=cpuLimitCeilingPercent,proto3,oneof" json:"cpu_limit_ceiling_percent,omitempty"` + MemoryLimitCeilingPercent *int64 `protobuf:"varint,120,opt,name=memory_limit_ceiling_percent,json=memoryLimitCeilingPercent,proto3,oneof" json:"memory_limit_ceiling_percent,omitempty"` } func (x *WorkloadRecommendationPolicy) Reset() { *x = WorkloadRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[145] + mi := &file_api_v1_recommendation_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12641,7 +15356,7 @@ func (x *WorkloadRecommendationPolicy) String() string { func (*WorkloadRecommendationPolicy) ProtoMessage() {} func (x *WorkloadRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[145] + mi := &file_api_v1_recommendation_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12654,7 +15369,7 @@ func (x *WorkloadRecommendationPolicy) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRecommendationPolicy.ProtoReflect.Descriptor instead. func (*WorkloadRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{145} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{161} } func (x *WorkloadRecommendationPolicy) GetPolicyId() string { @@ -12855,16 +15570,16 @@ func (x *WorkloadRecommendationPolicy) GetCooldownMinutes() int32 { return 0 } -func (x *WorkloadRecommendationPolicy) GetEnableInclusterMpa() bool { +func (x *WorkloadRecommendationPolicy) GetEnableInPlaceVerticalScaling() bool { if x != nil { - return x.EnableInclusterMpa + return x.EnableInPlaceVerticalScaling } return false } -func (x *WorkloadRecommendationPolicy) GetEnableInPlaceVerticalScaling() bool { +func (x *WorkloadRecommendationPolicy) GetAllowInPlaceMemoryLimitDecrease() bool { if x != nil { - return x.EnableInPlaceVerticalScaling + return x.AllowInPlaceMemoryLimitDecrease } return false } @@ -12904,6 +15619,125 @@ func (x *WorkloadRecommendationPolicy) GetDeletedAt() *timestamppb.Timestamp { return nil } +func (x *WorkloadRecommendationPolicy) GetJvmHeapOptimizationEnabled() bool { + if x != nil { + return x.JvmHeapOptimizationEnabled + } + return false +} + +func (x *WorkloadRecommendationPolicy) GetJvmHeapTargetPercentile() float32 { + if x != nil && x.JvmHeapTargetPercentile != nil { + return *x.JvmHeapTargetPercentile + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmHeapHeadroomMultiplier() float32 { + if x != nil && x.JvmHeapHeadroomMultiplier != nil { + return *x.JvmHeapHeadroomMultiplier + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmNonHeapOverheadPercent() float32 { + if x != nil && x.JvmNonHeapOverheadPercent != nil { + return *x.JvmNonHeapOverheadPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmNonHeapOverheadBytes() int64 { + if x != nil && x.JvmNonHeapOverheadBytes != nil { + return *x.JvmNonHeapOverheadBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmMinHeapBytes() int64 { + if x != nil && x.JvmMinHeapBytes != nil { + return *x.JvmMinHeapBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmMaxHeapBytes() int64 { + if x != nil && x.JvmMaxHeapBytes != nil { + return *x.JvmMaxHeapBytes + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetJvmPreferContainerSupport() bool { + if x != nil { + return x.JvmPreferContainerSupport + } + return false +} + +func (x *WorkloadRecommendationPolicy) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuFloorPercent() int64 { + if x != nil && x.CpuFloorPercent != nil { + return *x.CpuFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryFloorPercent() int64 { + if x != nil && x.MemoryFloorPercent != nil { + return *x.MemoryFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuCeilingPercent() int64 { + if x != nil && x.CpuCeilingPercent != nil { + return *x.CpuCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryCeilingPercent() int64 { + if x != nil && x.MemoryCeilingPercent != nil { + return *x.MemoryCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuLimitFloorPercent() int64 { + if x != nil && x.CpuLimitFloorPercent != nil { + return *x.CpuLimitFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryLimitFloorPercent() int64 { + if x != nil && x.MemoryLimitFloorPercent != nil { + return *x.MemoryLimitFloorPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetCpuLimitCeilingPercent() int64 { + if x != nil && x.CpuLimitCeilingPercent != nil { + return *x.CpuLimitCeilingPercent + } + return 0 +} + +func (x *WorkloadRecommendationPolicy) GetMemoryLimitCeilingPercent() int64 { + if x != nil && x.MemoryLimitCeilingPercent != nil { + return *x.MemoryLimitCeilingPercent + } + return 0 +} + type GetPolicyRecommendedDefaultsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -12916,7 +15750,7 @@ type GetPolicyRecommendedDefaultsRequest struct { func (x *GetPolicyRecommendedDefaultsRequest) Reset() { *x = GetPolicyRecommendedDefaultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[146] + mi := &file_api_v1_recommendation_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12929,7 +15763,7 @@ func (x *GetPolicyRecommendedDefaultsRequest) String() string { func (*GetPolicyRecommendedDefaultsRequest) ProtoMessage() {} func (x *GetPolicyRecommendedDefaultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[146] + mi := &file_api_v1_recommendation_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12942,7 +15776,7 @@ func (x *GetPolicyRecommendedDefaultsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GetPolicyRecommendedDefaultsRequest.ProtoReflect.Descriptor instead. func (*GetPolicyRecommendedDefaultsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{146} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{162} } func (x *GetPolicyRecommendedDefaultsRequest) GetTeamId() string { @@ -12970,7 +15804,7 @@ type GetPolicyRecommendedDefaultsResponse struct { func (x *GetPolicyRecommendedDefaultsResponse) Reset() { *x = GetPolicyRecommendedDefaultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[147] + mi := &file_api_v1_recommendation_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12983,7 +15817,7 @@ func (x *GetPolicyRecommendedDefaultsResponse) String() string { func (*GetPolicyRecommendedDefaultsResponse) ProtoMessage() {} func (x *GetPolicyRecommendedDefaultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[147] + mi := &file_api_v1_recommendation_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12996,7 +15830,7 @@ func (x *GetPolicyRecommendedDefaultsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GetPolicyRecommendedDefaultsResponse.ProtoReflect.Descriptor instead. func (*GetPolicyRecommendedDefaultsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{147} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{163} } func (x *GetPolicyRecommendedDefaultsResponse) GetPolicy() *WorkloadRecommendationPolicy { @@ -13020,7 +15854,7 @@ type BalanceRegisterRequest struct { func (x *BalanceRegisterRequest) Reset() { *x = BalanceRegisterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[148] + mi := &file_api_v1_recommendation_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13033,7 +15867,7 @@ func (x *BalanceRegisterRequest) String() string { func (*BalanceRegisterRequest) ProtoMessage() {} func (x *BalanceRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[148] + mi := &file_api_v1_recommendation_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13046,7 +15880,7 @@ func (x *BalanceRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceRegisterRequest.ProtoReflect.Descriptor instead. func (*BalanceRegisterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{148} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{164} } func (x *BalanceRegisterRequest) GetTeamId() string { @@ -13094,7 +15928,7 @@ type BalanceFeatures struct { func (x *BalanceFeatures) Reset() { *x = BalanceFeatures{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[149] + mi := &file_api_v1_recommendation_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13107,7 +15941,7 @@ func (x *BalanceFeatures) String() string { func (*BalanceFeatures) ProtoMessage() {} func (x *BalanceFeatures) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[149] + mi := &file_api_v1_recommendation_proto_msgTypes[165] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13120,7 +15954,7 @@ func (x *BalanceFeatures) ProtoReflect() protoreflect.Message { // Deprecated: Use BalanceFeatures.ProtoReflect.Descriptor instead. func (*BalanceFeatures) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{149} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{165} } func (x *BalanceFeatures) GetLiveMigration() bool { @@ -13162,12 +15996,28 @@ type BalanceApplyRecommendationResponse struct { Error *string `protobuf:"bytes,4,opt,name=error,proto3,oneof" json:"error,omitempty"` // Optional live migration metadata, populated when recommendation used live migration. LiveMigrationResult *LiveMigrationResult `protobuf:"bytes,5,opt,name=live_migration_result,json=liveMigrationResult,proto3,oneof" json:"live_migration_result,omitempty"` + // image_changed signals the operator retired this recommendation because the + // target workload's container image changed since it was applied (a new + // release), so its image-tied tuned values (env/cmd/nodeSelector/toleration) + // were not pinned onto the new image. The control plane records this as + // Superseded — not a failure — so the optimizer re-derives a fresh + // recommendation for the new image. Only set for spec-mutating workload recs. + ImageChanged bool `protobuf:"varint,6,opt,name=image_changed,json=imageChanged,proto3" json:"image_changed,omitempty"` + // applied_at is the terminal-phase timestamp the operator stamped on the + // WorkloadRecommendation CRD (Status.AppliedAt). For MPA v2 (rule-based) + // recommendations, the control plane's DB row primary key is derived from + // recommendation_id + applied_at (see k8sconverters.DeriveWorkloadRecommendationID), + // so this is required to target the correct row for this apply cycle instead + // of the workload's static, un-derived recommendation_id. Unset for legacy + // (non-rule) recommendations and older operators — callers must fall back + // to recommendation_id in that case. + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` } func (x *BalanceApplyRecommendationResponse) Reset() { *x = BalanceApplyRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[150] + mi := &file_api_v1_recommendation_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13180,7 +16030,7 @@ func (x *BalanceApplyRecommendationResponse) String() string { func (*BalanceApplyRecommendationResponse) ProtoMessage() {} func (x *BalanceApplyRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[150] + mi := &file_api_v1_recommendation_proto_msgTypes[166] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13193,7 +16043,7 @@ func (x *BalanceApplyRecommendationResponse) ProtoReflect() protoreflect.Message // Deprecated: Use BalanceApplyRecommendationResponse.ProtoReflect.Descriptor instead. func (*BalanceApplyRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{150} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{166} } func (x *BalanceApplyRecommendationResponse) GetRecommendationId() string { @@ -13231,6 +16081,20 @@ func (x *BalanceApplyRecommendationResponse) GetLiveMigrationResult() *LiveMigra return nil } +func (x *BalanceApplyRecommendationResponse) GetImageChanged() bool { + if x != nil { + return x.ImageChanged + } + return false +} + +func (x *BalanceApplyRecommendationResponse) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + // LiveMigrationResult provides structured metadata about a live migration attempt. type LiveMigrationResult struct { state protoimpl.MessageState @@ -13252,12 +16116,19 @@ type LiveMigrationResult struct { TargetNode string `protobuf:"bytes,6,opt,name=target_node,json=targetNode,proto3" json:"target_node,omitempty"` // Checkpoint image size in bytes. CheckpointSizeBytes int64 `protobuf:"varint,7,opt,name=checkpoint_size_bytes,json=checkpointSizeBytes,proto3" json:"checkpoint_size_bytes,omitempty"` + // Whether checkpoint/restore or the recommendation itself was intentionally + // skipped (for example, because live migration is unsupported, the workload + // had no running Pods, or there was no effective resource change). + Skipped bool `protobuf:"varint,8,opt,name=skipped,proto3" json:"skipped,omitempty"` + // Stable, human-readable reason the operation was skipped. Empty when + // skipped is false. + SkipReason string `protobuf:"bytes,9,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"` } func (x *LiveMigrationResult) Reset() { *x = LiveMigrationResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[151] + mi := &file_api_v1_recommendation_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13270,7 +16141,7 @@ func (x *LiveMigrationResult) String() string { func (*LiveMigrationResult) ProtoMessage() {} func (x *LiveMigrationResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[151] + mi := &file_api_v1_recommendation_proto_msgTypes[167] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13283,7 +16154,7 @@ func (x *LiveMigrationResult) ProtoReflect() protoreflect.Message { // Deprecated: Use LiveMigrationResult.ProtoReflect.Descriptor instead. func (*LiveMigrationResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{151} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{167} } func (x *LiveMigrationResult) GetDegraded() bool { @@ -13335,6 +16206,20 @@ func (x *LiveMigrationResult) GetCheckpointSizeBytes() int64 { return 0 } +func (x *LiveMigrationResult) GetSkipped() bool { + if x != nil { + return x.Skipped + } + return false +} + +func (x *LiveMigrationResult) GetSkipReason() string { + if x != nil { + return x.SkipReason + } + return "" +} + type NodeGroupReference struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -13347,7 +16232,7 @@ type NodeGroupReference struct { func (x *NodeGroupReference) Reset() { *x = NodeGroupReference{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[152] + mi := &file_api_v1_recommendation_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13360,7 +16245,7 @@ func (x *NodeGroupReference) String() string { func (*NodeGroupReference) ProtoMessage() {} func (x *NodeGroupReference) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[152] + mi := &file_api_v1_recommendation_proto_msgTypes[168] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13373,7 +16258,7 @@ func (x *NodeGroupReference) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupReference.ProtoReflect.Descriptor instead. func (*NodeGroupReference) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{152} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{168} } func (x *NodeGroupReference) GetClusterId() string { @@ -13407,7 +16292,7 @@ type NodeGroupRecommendation struct { func (x *NodeGroupRecommendation) Reset() { *x = NodeGroupRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[153] + mi := &file_api_v1_recommendation_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13420,7 +16305,7 @@ func (x *NodeGroupRecommendation) String() string { func (*NodeGroupRecommendation) ProtoMessage() {} func (x *NodeGroupRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[153] + mi := &file_api_v1_recommendation_proto_msgTypes[169] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13433,7 +16318,7 @@ func (x *NodeGroupRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeGroupRecommendation.ProtoReflect.Descriptor instead. func (*NodeGroupRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{153} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{169} } func (x *NodeGroupRecommendation) GetRecommendationId() string { @@ -13506,7 +16391,7 @@ type CostImpact struct { func (x *CostImpact) Reset() { *x = CostImpact{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[154] + mi := &file_api_v1_recommendation_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13519,7 +16404,7 @@ func (x *CostImpact) String() string { func (*CostImpact) ProtoMessage() {} func (x *CostImpact) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[154] + mi := &file_api_v1_recommendation_proto_msgTypes[170] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13532,7 +16417,7 @@ func (x *CostImpact) ProtoReflect() protoreflect.Message { // Deprecated: Use CostImpact.ProtoReflect.Descriptor instead. func (*CostImpact) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{154} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{170} } func (x *CostImpact) GetCurrentCostPerMonth() *money.Money { @@ -13631,36 +16516,85 @@ type WorkloadRecommendation struct { // The label selector for the workload LabelSelector *LabelSelector `protobuf:"bytes,20,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` // whether this recommendation should be applied using live migration - UseLiveMigration bool `protobuf:"varint,21,opt,name=use_live_migration,json=useLiveMigration,proto3" json:"use_live_migration,omitempty"` - DelProp LiveMigDeletionPropagation `protobuf:"varint,22,opt,name=del_prop,json=delProp,proto3,enum=api.v1.LiveMigDeletionPropagation" json:"del_prop,omitempty"` - Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` - CurrentTolerations []*Toleration `protobuf:"bytes,41,rep,name=current_tolerations,json=currentTolerations,proto3" json:"current_tolerations,omitempty"` - RecommendedTolerations []*Toleration `protobuf:"bytes,42,rep,name=recommended_tolerations,json=recommendedTolerations,proto3" json:"recommended_tolerations,omitempty"` + UseLiveMigration bool `protobuf:"varint,21,opt,name=use_live_migration,json=useLiveMigration,proto3" json:"use_live_migration,omitempty"` + DelProp LiveMigDeletionPropagation `protobuf:"varint,22,opt,name=del_prop,json=delProp,proto3,enum=api.v1.LiveMigDeletionPropagation" json:"del_prop,omitempty"` + // Why this recommendation was generated, set once at creation. For + // recommendations with no rule_id (policy-based / one-time), this is + // never touched again after generation — see `success`/`error` for the + // operator's terminal outcome instead. rule_id (MPA v2) rows may still + // have the operator's post-hoc status message appended. + Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` + CurrentTolerations []*Toleration `protobuf:"bytes,41,rep,name=current_tolerations,json=currentTolerations,proto3" json:"current_tolerations,omitempty"` + // Deprecated: Marked as deprecated in api/v1/recommendation.proto. + RecommendedTolerations []*Toleration `protobuf:"bytes,42,rep,name=recommended_tolerations,json=recommendedTolerations,proto3" json:"recommended_tolerations,omitempty"` // superseded by toleration_mutations (per-element merge) Status *RecommendationStatus `protobuf:"varint,51,opt,name=status,proto3,enum=api.v1.RecommendationStatus,oneof" json:"status,omitempty"` Policy *WorkloadRecommendationPolicy `protobuf:"bytes,61,opt,name=policy,proto3,oneof" json:"policy,omitempty"` PolicyId *string `protobuf:"bytes,62,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` PolicyTarget *WorkloadPolicyTarget `protobuf:"bytes,71,opt,name=policy_target,json=policyTarget,proto3,oneof" json:"policy_target,omitempty"` PolicyTargetId *string `protobuf:"bytes,72,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` RuleId *string `protobuf:"bytes,73,opt,name=rule_id,json=ruleId,proto3,oneof" json:"rule_id,omitempty"` - ReplicaCountAction ActionToTake `protobuf:"varint,81,opt,name=replica_count_action,json=replicaCountAction,proto3,enum=api.v1.ActionToTake" json:"replica_count_action,omitempty"` // suggests if operator should set recommended_replica_count + // CurrentSource of the governing WorkloadRule (MPA v2), e.g. "auto_optimization", + // "policy", "manual". Only set when rule_id is populated. Mirrors WorkloadRule.current_source + // so the recommendations list can show/link the governing rule without a second RPC. + RuleSource *string `protobuf:"bytes,104,opt,name=rule_source,json=ruleSource,proto3,oneof" json:"rule_source,omitempty"` + // The original spec.recommendation_id from the WorkloadRecommendation CRD. For MPA v2 + // (rule-based) rows, recommendation_id (field 1, this message's row ID) is deliberately + // re-derived per apply cycle so each evaluation gets its own history row — but audit log + // entries and live-migration checkpoint/restore events are always stamped with this + // original, un-derived ID. Clients querying audit logs or C/R status/events for a + // recommendation MUST use this field, not recommendation_id, or the query returns nothing + // for MPA v2 rows. Equal to recommendation_id for legacy rows (which never derive it). + SourceRecommendationId *string `protobuf:"bytes,105,opt,name=source_recommendation_id,json=sourceRecommendationId,proto3,oneof" json:"source_recommendation_id,omitempty"` + ReplicaCountAction ActionToTake `protobuf:"varint,81,opt,name=replica_count_action,json=replicaCountAction,proto3,enum=api.v1.ActionToTake" json:"replica_count_action,omitempty"` // suggests if operator should set recommended_replica_count // Result of live migration when this recommendation was applied with use_live_migration (populated after apply). LiveMigrationResult *LiveMigrationResult `protobuf:"bytes,82,opt,name=live_migration_result,json=liveMigrationResult,proto3,oneof" json:"live_migration_result,omitempty"` // Error message when status is failed or apply failed. Error *string `protobuf:"bytes,83,opt,name=error,proto3,oneof" json:"error,omitempty"` + // Operator's terminal status message for any non-failure outcome (applied, + // or superseded via image-changed/skip). Mirrors `error` for the + // non-failure side. Only populated for recommendations with no rule_id + // (policy-based and one-time recs) — see reasoning field note below. + Success *string `protobuf:"bytes,106,opt,name=success,proto3,oneof" json:"success,omitempty"` // Backend-computed cost impact (current vs recommended). CostImpact *CostImpact `protobuf:"bytes,91,opt,name=cost_impact,json=costImpact,proto3,oneof" json:"cost_impact,omitempty"` // Whether this recommendation should be applied using in-place pod vertical scaling. // When true, the operator resizes running pods via the /resize subresource // without triggering rolling restarts (requires k8s >= v1.33). UseInPlaceVerticalScaling bool `protobuf:"varint,92,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Whether the operator may lower a container's memory limit while applying + // this recommendation in place. Copied from the owning rule/policy at + // generation time so the operator's apply-time preflight can decide without + // re-reading the rule. Independent of, and additional to, the cluster + // version check. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,109,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` // Impact score (0-1) indicating optimization opportunity. Higher = more waste. ImpactScore float64 `protobuf:"fixed64,93,opt,name=impact_score,json=impactScore,proto3" json:"impact_score,omitempty"` + // Pod-scoped per-element nodeSelector mutations (merge key: key). + NodeSelectorMutations []*NodeSelectorMutation `protobuf:"bytes,101,rep,name=node_selector_mutations,json=nodeSelectorMutations,proto3" json:"node_selector_mutations,omitempty"` + // Pod-scoped per-element toleration mutations. Supersedes the deprecated + // recommended_tolerations full-list field. + TolerationMutations []*TolerationMutation `protobuf:"bytes,102,rep,name=toleration_mutations,json=tolerationMutations,proto3" json:"toleration_mutations,omitempty"` + // Container image (keyed by container name) the recommendation was derived + // from — the "source" release. The operator compares this against a + // workload's live images to detect that a new release shipped and retire a + // recommendation whose tuned values (resources, JVM heap, …) were computed + // for the old image, so they are not pinned onto the new one (e.g. a stale + // -Xmx that could OOM the new build). + SourceImages map[string]string `protobuf:"bytes,103,rep,name=source_images,json=sourceImages,proto3" json:"source_images,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Force-restart directive when no resource fields changed but a restart + // was still requested (e.g. re-apply after an image change). + RestartActionToTake ActionToTake `protobuf:"varint,107,opt,name=restart_action_to_take,json=restartActionToTake,proto3,enum=api.v1.ActionToTake" json:"restart_action_to_take,omitempty"` + // Structured reasoning payload (insights, per-container deltas, HPA + // context, decision trace). Only populated for mpav1 (policy_id set) + // recommendations generated after this field shipped; absent for mpav2, + // one-time, and historical rows — consumers fall back to `reasoning`. + ReasoningDetails *ReasoningDetails `protobuf:"bytes,108,opt,name=reasoning_details,json=reasoningDetails,proto3,oneof" json:"reasoning_details,omitempty"` } func (x *WorkloadRecommendation) Reset() { *x = WorkloadRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[155] + mi := &file_api_v1_recommendation_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13673,7 +16607,7 @@ func (x *WorkloadRecommendation) String() string { func (*WorkloadRecommendation) ProtoMessage() {} func (x *WorkloadRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[155] + mi := &file_api_v1_recommendation_proto_msgTypes[171] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13686,7 +16620,7 @@ func (x *WorkloadRecommendation) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadRecommendation.ProtoReflect.Descriptor instead. func (*WorkloadRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{155} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{171} } func (x *WorkloadRecommendation) GetRecommendationId() string { @@ -13801,6 +16735,7 @@ func (x *WorkloadRecommendation) GetCurrentTolerations() []*Toleration { return nil } +// Deprecated: Marked as deprecated in api/v1/recommendation.proto. func (x *WorkloadRecommendation) GetRecommendedTolerations() []*Toleration { if x != nil { return x.RecommendedTolerations @@ -13850,6 +16785,20 @@ func (x *WorkloadRecommendation) GetRuleId() string { return "" } +func (x *WorkloadRecommendation) GetRuleSource() string { + if x != nil && x.RuleSource != nil { + return *x.RuleSource + } + return "" +} + +func (x *WorkloadRecommendation) GetSourceRecommendationId() string { + if x != nil && x.SourceRecommendationId != nil { + return *x.SourceRecommendationId + } + return "" +} + func (x *WorkloadRecommendation) GetReplicaCountAction() ActionToTake { if x != nil { return x.ReplicaCountAction @@ -13871,6 +16820,13 @@ func (x *WorkloadRecommendation) GetError() string { return "" } +func (x *WorkloadRecommendation) GetSuccess() string { + if x != nil && x.Success != nil { + return *x.Success + } + return "" +} + func (x *WorkloadRecommendation) GetCostImpact() *CostImpact { if x != nil { return x.CostImpact @@ -13885,6 +16841,13 @@ func (x *WorkloadRecommendation) GetUseInPlaceVerticalScaling() bool { return false } +func (x *WorkloadRecommendation) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + func (x *WorkloadRecommendation) GetImpactScore() float64 { if x != nil { return x.ImpactScore @@ -13892,33 +16855,75 @@ func (x *WorkloadRecommendation) GetImpactScore() float64 { return 0 } -type GetAttachedNodeGroupPoliciesRequest struct { +func (x *WorkloadRecommendation) GetNodeSelectorMutations() []*NodeSelectorMutation { + if x != nil { + return x.NodeSelectorMutations + } + return nil +} + +func (x *WorkloadRecommendation) GetTolerationMutations() []*TolerationMutation { + if x != nil { + return x.TolerationMutations + } + return nil +} + +func (x *WorkloadRecommendation) GetSourceImages() map[string]string { + if x != nil { + return x.SourceImages + } + return nil +} + +func (x *WorkloadRecommendation) GetRestartActionToTake() ActionToTake { + if x != nil { + return x.RestartActionToTake + } + return ActionToTake_ACTION_TO_TAKE_SET +} + +func (x *WorkloadRecommendation) GetReasoningDetails() *ReasoningDetails { + if x != nil { + return x.ReasoningDetails + } + return nil +} + +// ReasoningDetails is the structured form of a recommendation's `reasoning` +// prose. schema_version tracks the payload shape (currently 1). +type ReasoningDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - NodeGroupName string `protobuf:"bytes,3,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` + SchemaVersion int32 `protobuf:"varint,1,opt,name=schema_version,json=schemaVersion,proto3" json:"schema_version,omitempty"` + Insights []*ReasoningInsight `protobuf:"bytes,2,rep,name=insights,proto3" json:"insights,omitempty"` + ContainerChanges []*ReasoningContainerChange `protobuf:"bytes,3,rep,name=container_changes,json=containerChanges,proto3" json:"container_changes,omitempty"` + Replicas *ReasoningReplicas `protobuf:"bytes,4,opt,name=replicas,proto3,oneof" json:"replicas,omitempty"` + Decisions []*ReasoningDecision `protobuf:"bytes,5,rep,name=decisions,proto3" json:"decisions,omitempty"` + ConfidenceScore float64 `protobuf:"fixed64,6,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` + RiskScore float64 `protobuf:"fixed64,7,opt,name=risk_score,json=riskScore,proto3" json:"risk_score,omitempty"` + EffectiveDeadbandPercent float64 `protobuf:"fixed64,8,opt,name=effective_deadband_percent,json=effectiveDeadbandPercent,proto3" json:"effective_deadband_percent,omitempty"` } -func (x *GetAttachedNodeGroupPoliciesRequest) Reset() { - *x = GetAttachedNodeGroupPoliciesRequest{} +func (x *ReasoningDetails) Reset() { + *x = ReasoningDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[156] + mi := &file_api_v1_recommendation_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedNodeGroupPoliciesRequest) String() string { +func (x *ReasoningDetails) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedNodeGroupPoliciesRequest) ProtoMessage() {} +func (*ReasoningDetails) ProtoMessage() {} -func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[156] +func (x *ReasoningDetails) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[172] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13929,57 +16934,94 @@ func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. -func (*GetAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{156} +// Deprecated: Use ReasoningDetails.ProtoReflect.Descriptor instead. +func (*ReasoningDetails) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{172} } -func (x *GetAttachedNodeGroupPoliciesRequest) GetTeamId() string { +func (x *ReasoningDetails) GetSchemaVersion() int32 { if x != nil { - return x.TeamId + return x.SchemaVersion } - return "" + return 0 } -func (x *GetAttachedNodeGroupPoliciesRequest) GetClusterId() string { +func (x *ReasoningDetails) GetInsights() []*ReasoningInsight { if x != nil { - return x.ClusterId + return x.Insights } - return "" + return nil } -func (x *GetAttachedNodeGroupPoliciesRequest) GetNodeGroupName() string { +func (x *ReasoningDetails) GetContainerChanges() []*ReasoningContainerChange { if x != nil { - return x.NodeGroupName + return x.ContainerChanges } - return "" + return nil } -type GetAttachedNodeGroupPoliciesResponse struct { +func (x *ReasoningDetails) GetReplicas() *ReasoningReplicas { + if x != nil { + return x.Replicas + } + return nil +} + +func (x *ReasoningDetails) GetDecisions() []*ReasoningDecision { + if x != nil { + return x.Decisions + } + return nil +} + +func (x *ReasoningDetails) GetConfidenceScore() float64 { + if x != nil { + return x.ConfidenceScore + } + return 0 +} + +func (x *ReasoningDetails) GetRiskScore() float64 { + if x != nil { + return x.RiskScore + } + return 0 +} + +func (x *ReasoningDetails) GetEffectiveDeadbandPercent() float64 { + if x != nil { + return x.EffectiveDeadbandPercent + } + return 0 +} + +type ReasoningEvidence struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Confidence float64 `protobuf:"fixed64,3,opt,name=confidence,proto3" json:"confidence,omitempty"` } -func (x *GetAttachedNodeGroupPoliciesResponse) Reset() { - *x = GetAttachedNodeGroupPoliciesResponse{} +func (x *ReasoningEvidence) Reset() { + *x = ReasoningEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[157] + mi := &file_api_v1_recommendation_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedNodeGroupPoliciesResponse) String() string { +func (x *ReasoningEvidence) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedNodeGroupPoliciesResponse) ProtoMessage() {} +func (*ReasoningEvidence) ProtoMessage() {} -func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[157] +func (x *ReasoningEvidence) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[173] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13990,47 +17032,64 @@ func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. -func (*GetAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{157} +// Deprecated: Use ReasoningEvidence.ProtoReflect.Descriptor instead. +func (*ReasoningEvidence) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{173} } -func (x *GetAttachedNodeGroupPoliciesResponse) GetPolicies() []*NodeGroupRecommendationPolicy { +func (x *ReasoningEvidence) GetType() string { if x != nil { - return x.Policies + return x.Type } - return nil + return "" } -type GetAttachedWorkloadPoliciesRequest struct { +func (x *ReasoningEvidence) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ReasoningEvidence) GetConfidence() float64 { + if x != nil { + return x.Confidence + } + return 0 +} + +type ReasoningInsight struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` - Kind K8SObjectKind `protobuf:"varint,4,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // The kind of workload - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ReasoningInsightType `protobuf:"varint,2,opt,name=type,proto3,enum=api.v1.ReasoningInsightType" json:"type,omitempty"` + Severity ReasoningInsightSeverity `protobuf:"varint,3,opt,name=severity,proto3,enum=api.v1.ReasoningInsightSeverity" json:"severity,omitempty"` + Confidence float64 `protobuf:"fixed64,4,opt,name=confidence,proto3" json:"confidence,omitempty"` + Title string `protobuf:"bytes,5,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` + Impact string `protobuf:"bytes,7,opt,name=impact,proto3" json:"impact,omitempty"` + Evidence []*ReasoningEvidence `protobuf:"bytes,8,rep,name=evidence,proto3" json:"evidence,omitempty"` } -func (x *GetAttachedWorkloadPoliciesRequest) Reset() { - *x = GetAttachedWorkloadPoliciesRequest{} +func (x *ReasoningInsight) Reset() { + *x = ReasoningInsight{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[158] + mi := &file_api_v1_recommendation_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedWorkloadPoliciesRequest) String() string { +func (x *ReasoningInsight) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedWorkloadPoliciesRequest) ProtoMessage() {} +func (*ReasoningInsight) ProtoMessage() {} -func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[158] +func (x *ReasoningInsight) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[174] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14041,72 +17100,98 @@ func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. -func (*GetAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{158} +// Deprecated: Use ReasoningInsight.ProtoReflect.Descriptor instead. +func (*ReasoningInsight) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{174} } -func (x *GetAttachedWorkloadPoliciesRequest) GetTeamId() string { +func (x *ReasoningInsight) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetClusterId() string { +func (x *ReasoningInsight) GetType() ReasoningInsightType { if x != nil { - return x.ClusterId + return x.Type + } + return ReasoningInsightType_REASONING_INSIGHT_TYPE_UNSPECIFIED +} + +func (x *ReasoningInsight) GetSeverity() ReasoningInsightSeverity { + if x != nil { + return x.Severity + } + return ReasoningInsightSeverity_REASONING_INSIGHT_SEVERITY_UNSPECIFIED +} + +func (x *ReasoningInsight) GetConfidence() float64 { + if x != nil { + return x.Confidence + } + return 0 +} + +func (x *ReasoningInsight) GetTitle() string { + if x != nil { + return x.Title } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetWorkloadUid() string { +func (x *ReasoningInsight) GetDescription() string { if x != nil { - return x.WorkloadUid + return x.Description } return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetKind() K8SObjectKind { +func (x *ReasoningInsight) GetImpact() string { if x != nil { - return x.Kind + return x.Impact } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED + return "" } -func (x *GetAttachedWorkloadPoliciesRequest) GetIncludeDeleted() bool { +func (x *ReasoningInsight) GetEvidence() []*ReasoningEvidence { if x != nil { - return x.IncludeDeleted + return x.Evidence } - return false + return nil } -type GetAttachedWorkloadPoliciesResponse struct { +// Raw units: millicores for CPU, bytes for memory. Before = actuals at +// generation time, after = final recommendation. Percent changes are for +// the consumer to compute (avoids the legacy divide-by-zero Inf%). +type ReasoningResourceEdge struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RelevantPolicies *WorkloadRecommendationPolicyGroup `protobuf:"bytes,1,opt,name=relevant_policies,json=relevantPolicies,proto3" json:"relevant_policies,omitempty"` - PolicyIdToMatchedTargets map[string]*WorkloadPolicyTargetGroup `protobuf:"bytes,2,rep,name=policy_id_to_matched_targets,json=policyIdToMatchedTargets,proto3" json:"policy_id_to_matched_targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + RequestBefore int64 `protobuf:"varint,1,opt,name=request_before,json=requestBefore,proto3" json:"request_before,omitempty"` + RequestAfter int64 `protobuf:"varint,2,opt,name=request_after,json=requestAfter,proto3" json:"request_after,omitempty"` + LimitBefore int64 `protobuf:"varint,3,opt,name=limit_before,json=limitBefore,proto3" json:"limit_before,omitempty"` + LimitAfter int64 `protobuf:"varint,4,opt,name=limit_after,json=limitAfter,proto3" json:"limit_after,omitempty"` } -func (x *GetAttachedWorkloadPoliciesResponse) Reset() { - *x = GetAttachedWorkloadPoliciesResponse{} +func (x *ReasoningResourceEdge) Reset() { + *x = ReasoningResourceEdge{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[159] + mi := &file_api_v1_recommendation_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAttachedWorkloadPoliciesResponse) String() string { +func (x *ReasoningResourceEdge) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAttachedWorkloadPoliciesResponse) ProtoMessage() {} +func (*ReasoningResourceEdge) ProtoMessage() {} -func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[159] +func (x *ReasoningResourceEdge) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[175] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14117,50 +17202,68 @@ func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. -func (*GetAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{159} +// Deprecated: Use ReasoningResourceEdge.ProtoReflect.Descriptor instead. +func (*ReasoningResourceEdge) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{175} } -func (x *GetAttachedWorkloadPoliciesResponse) GetRelevantPolicies() *WorkloadRecommendationPolicyGroup { +func (x *ReasoningResourceEdge) GetRequestBefore() int64 { if x != nil { - return x.RelevantPolicies + return x.RequestBefore } - return nil + return 0 } -func (x *GetAttachedWorkloadPoliciesResponse) GetPolicyIdToMatchedTargets() map[string]*WorkloadPolicyTargetGroup { +func (x *ReasoningResourceEdge) GetRequestAfter() int64 { if x != nil { - return x.PolicyIdToMatchedTargets + return x.RequestAfter } - return nil + return 0 } -type WorkloadRecommendationPolicyGroup struct { +func (x *ReasoningResourceEdge) GetLimitBefore() int64 { + if x != nil { + return x.LimitBefore + } + return 0 +} + +func (x *ReasoningResourceEdge) GetLimitAfter() int64 { + if x != nil { + return x.LimitAfter + } + return 0 +} + +type ReasoningContainerChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Container string `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"` + Cpu *ReasoningResourceEdge `protobuf:"bytes,2,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory *ReasoningResourceEdge `protobuf:"bytes,3,opt,name=memory,proto3" json:"memory,omitempty"` + Gpu *ReasoningResourceEdge `protobuf:"bytes,4,opt,name=gpu,proto3" json:"gpu,omitempty"` + OomTriggered bool `protobuf:"varint,5,opt,name=oom_triggered,json=oomTriggered,proto3" json:"oom_triggered,omitempty"` } -func (x *WorkloadRecommendationPolicyGroup) Reset() { - *x = WorkloadRecommendationPolicyGroup{} +func (x *ReasoningContainerChange) Reset() { + *x = ReasoningContainerChange{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[160] + mi := &file_api_v1_recommendation_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRecommendationPolicyGroup) String() string { +func (x *ReasoningContainerChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRecommendationPolicyGroup) ProtoMessage() {} +func (*ReasoningContainerChange) ProtoMessage() {} -func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[160] +func (x *ReasoningContainerChange) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14171,43 +17274,74 @@ func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use WorkloadRecommendationPolicyGroup.ProtoReflect.Descriptor instead. -func (*WorkloadRecommendationPolicyGroup) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{160} +// Deprecated: Use ReasoningContainerChange.ProtoReflect.Descriptor instead. +func (*ReasoningContainerChange) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{176} } -func (x *WorkloadRecommendationPolicyGroup) GetPolicies() []*WorkloadRecommendationPolicy { +func (x *ReasoningContainerChange) GetContainer() string { if x != nil { - return x.Policies + return x.Container + } + return "" +} + +func (x *ReasoningContainerChange) GetCpu() *ReasoningResourceEdge { + if x != nil { + return x.Cpu } return nil } -type WorkloadPolicyTargetGroup struct { +func (x *ReasoningContainerChange) GetMemory() *ReasoningResourceEdge { + if x != nil { + return x.Memory + } + return nil +} + +func (x *ReasoningContainerChange) GetGpu() *ReasoningResourceEdge { + if x != nil { + return x.Gpu + } + return nil +} + +func (x *ReasoningContainerChange) GetOomTriggered() bool { + if x != nil { + return x.OomTriggered + } + return false +} + +type ReasoningUtilization struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*WorkloadPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + CpuCurrent float64 `protobuf:"fixed64,1,opt,name=cpu_current,json=cpuCurrent,proto3" json:"cpu_current,omitempty"` + CpuTarget float64 `protobuf:"fixed64,2,opt,name=cpu_target,json=cpuTarget,proto3" json:"cpu_target,omitempty"` + MemoryCurrent float64 `protobuf:"fixed64,3,opt,name=memory_current,json=memoryCurrent,proto3" json:"memory_current,omitempty"` + MemoryTarget float64 `protobuf:"fixed64,4,opt,name=memory_target,json=memoryTarget,proto3" json:"memory_target,omitempty"` } -func (x *WorkloadPolicyTargetGroup) Reset() { - *x = WorkloadPolicyTargetGroup{} +func (x *ReasoningUtilization) Reset() { + *x = ReasoningUtilization{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[161] + mi := &file_api_v1_recommendation_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadPolicyTargetGroup) String() string { +func (x *ReasoningUtilization) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadPolicyTargetGroup) ProtoMessage() {} +func (*ReasoningUtilization) ProtoMessage() {} -func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[161] +func (x *ReasoningUtilization) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14218,43 +17352,66 @@ func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadPolicyTargetGroup.ProtoReflect.Descriptor instead. -func (*WorkloadPolicyTargetGroup) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{161} +// Deprecated: Use ReasoningUtilization.ProtoReflect.Descriptor instead. +func (*ReasoningUtilization) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{177} } -func (x *WorkloadPolicyTargetGroup) GetTargets() []*WorkloadPolicyTarget { +func (x *ReasoningUtilization) GetCpuCurrent() float64 { if x != nil { - return x.Targets + return x.CpuCurrent } - return nil + return 0 } -type WorkloadIdentifiers struct { +func (x *ReasoningUtilization) GetCpuTarget() float64 { + if x != nil { + return x.CpuTarget + } + return 0 +} + +func (x *ReasoningUtilization) GetMemoryCurrent() float64 { + if x != nil { + return x.MemoryCurrent + } + return 0 +} + +func (x *ReasoningUtilization) GetMemoryTarget() float64 { + if x != nil { + return x.MemoryTarget + } + return 0 +} + +type ReasoningHistoricalPattern struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` + Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` + IsOscillating bool `protobuf:"varint,2,opt,name=is_oscillating,json=isOscillating,proto3" json:"is_oscillating,omitempty"` + ChangeFrequency float64 `protobuf:"fixed64,3,opt,name=change_frequency,json=changeFrequency,proto3" json:"change_frequency,omitempty"` } -func (x *WorkloadIdentifiers) Reset() { - *x = WorkloadIdentifiers{} +func (x *ReasoningHistoricalPattern) Reset() { + *x = ReasoningHistoricalPattern{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[162] + mi := &file_api_v1_recommendation_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadIdentifiers) String() string { +func (x *ReasoningHistoricalPattern) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadIdentifiers) ProtoMessage() {} +func (*ReasoningHistoricalPattern) ProtoMessage() {} -func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[162] +func (x *ReasoningHistoricalPattern) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14265,44 +17422,65 @@ func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadIdentifiers.ProtoReflect.Descriptor instead. -func (*WorkloadIdentifiers) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{162} +// Deprecated: Use ReasoningHistoricalPattern.ProtoReflect.Descriptor instead. +func (*ReasoningHistoricalPattern) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{178} } -func (x *WorkloadIdentifiers) GetWorkloads() []*WorkloadIdentifier { +func (x *ReasoningHistoricalPattern) GetPattern() string { if x != nil { - return x.Workloads + return x.Pattern } - return nil + return "" } -type WorkloadPolicies struct { +func (x *ReasoningHistoricalPattern) GetIsOscillating() bool { + if x != nil { + return x.IsOscillating + } + return false +} + +func (x *ReasoningHistoricalPattern) GetChangeFrequency() float64 { + if x != nil { + return x.ChangeFrequency + } + return 0 +} + +type ReasoningReplicas struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workload *WorkloadIdentifier `protobuf:"bytes,1,opt,name=workload,proto3" json:"workload,omitempty"` - Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` + Current int32 `protobuf:"varint,1,opt,name=current,proto3" json:"current,omitempty"` + Recommended int32 `protobuf:"varint,2,opt,name=recommended,proto3" json:"recommended,omitempty"` + Min int32 `protobuf:"varint,3,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,4,opt,name=max,proto3" json:"max,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + PrimaryMetric string `protobuf:"bytes,6,opt,name=primary_metric,json=primaryMetric,proto3" json:"primary_metric,omitempty"` + Utilization *ReasoningUtilization `protobuf:"bytes,7,opt,name=utilization,proto3" json:"utilization,omitempty"` + WorkloadType string `protobuf:"bytes,8,opt,name=workload_type,json=workloadType,proto3" json:"workload_type,omitempty"` + HistoricalPattern *ReasoningHistoricalPattern `protobuf:"bytes,9,opt,name=historical_pattern,json=historicalPattern,proto3" json:"historical_pattern,omitempty"` } -func (x *WorkloadPolicies) Reset() { - *x = WorkloadPolicies{} +func (x *ReasoningReplicas) Reset() { + *x = ReasoningReplicas{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[163] + mi := &file_api_v1_recommendation_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadPolicies) String() string { +func (x *ReasoningReplicas) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadPolicies) ProtoMessage() {} +func (*ReasoningReplicas) ProtoMessage() {} -func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[163] +func (x *ReasoningReplicas) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14313,125 +17491,106 @@ func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadPolicies.ProtoReflect.Descriptor instead. -func (*WorkloadPolicies) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{163} +// Deprecated: Use ReasoningReplicas.ProtoReflect.Descriptor instead. +func (*ReasoningReplicas) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{179} } -func (x *WorkloadPolicies) GetWorkload() *WorkloadIdentifier { +func (x *ReasoningReplicas) GetCurrent() int32 { if x != nil { - return x.Workload + return x.Current } - return nil + return 0 } -func (x *WorkloadPolicies) GetPolicies() []*WorkloadRecommendationPolicy { +func (x *ReasoningReplicas) GetRecommended() int32 { if x != nil { - return x.Policies + return x.Recommended } - return nil -} - -// ListAttachedWorkloadPoliciesRequest is used to fetch all attached workload policies and workloads for a team. -// All parameters except team_id are optional filters. -type ListAttachedWorkloadPoliciesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. - WorkloadUids []string `protobuf:"bytes,4,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` // Optional list of workload UIDs to filter by specific workloads. + return 0 } -func (x *ListAttachedWorkloadPoliciesRequest) Reset() { - *x = ListAttachedWorkloadPoliciesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[164] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ReasoningReplicas) GetMin() int32 { + if x != nil { + return x.Min } + return 0 } -func (x *ListAttachedWorkloadPoliciesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListAttachedWorkloadPoliciesRequest) ProtoMessage() {} - -func (x *ListAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[164] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ReasoningReplicas) GetMax() int32 { + if x != nil { + return x.Max } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use ListAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{164} +func (x *ReasoningReplicas) GetReason() string { + if x != nil { + return x.Reason + } + return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetTeamId() string { +func (x *ReasoningReplicas) GetPrimaryMetric() string { if x != nil { - return x.TeamId + return x.PrimaryMetric } return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetClusterIds() []string { +func (x *ReasoningReplicas) GetUtilization() *ReasoningUtilization { if x != nil { - return x.ClusterIds + return x.Utilization } return nil } -func (x *ListAttachedWorkloadPoliciesRequest) GetPolicyIds() []string { +func (x *ReasoningReplicas) GetWorkloadType() string { if x != nil { - return x.PolicyIds + return x.WorkloadType } - return nil + return "" } -func (x *ListAttachedWorkloadPoliciesRequest) GetWorkloadUids() []string { +func (x *ReasoningReplicas) GetHistoricalPattern() *ReasoningHistoricalPattern { if x != nil { - return x.WorkloadUids + return x.HistoricalPattern } return nil } -// ListAttachedWorkloadPoliciesResponse contains all attached policies and workloads with their relationships. -type ListAttachedWorkloadPoliciesResponse struct { +type ReasoningDecision struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyMap map[string]*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to WorkloadRecommendationPolicy - WorkloadMap map[string]*WorkloadItem `protobuf:"bytes,2,rep,name=workload_map,json=workloadMap,proto3" json:"workload_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of workload UID to WorkloadItem + Kind ReasoningDecisionKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.ReasoningDecisionKind" json:"kind,omitempty"` + Container string `protobuf:"bytes,2,opt,name=container,proto3" json:"container,omitempty"` // empty = workload-scoped + Resource string `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` // cpu | memory | gpu | "" + Field string `protobuf:"bytes,4,opt,name=field,proto3" json:"field,omitempty"` // request | limit | replicas | "" + Intended *int64 `protobuf:"varint,5,opt,name=intended,proto3,oneof" json:"intended,omitempty"` + Actual *int64 `protobuf:"varint,6,opt,name=actual,proto3,oneof" json:"actual,omitempty"` + Constraint string `protobuf:"bytes,7,opt,name=constraint,proto3" json:"constraint,omitempty"` // open-ended machine-readable cause token + Message string `protobuf:"bytes,8,opt,name=message,proto3" json:"message,omitempty"` } -func (x *ListAttachedWorkloadPoliciesResponse) Reset() { - *x = ListAttachedWorkloadPoliciesResponse{} +func (x *ReasoningDecision) Reset() { + *x = ReasoningDecision{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[165] + mi := &file_api_v1_recommendation_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListAttachedWorkloadPoliciesResponse) String() string { +func (x *ReasoningDecision) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAttachedWorkloadPoliciesResponse) ProtoMessage() {} +func (*ReasoningDecision) ProtoMessage() {} -func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[165] +func (x *ReasoningDecision) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[180] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14442,125 +17601,94 @@ func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{165} +// Deprecated: Use ReasoningDecision.ProtoReflect.Descriptor instead. +func (*ReasoningDecision) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{180} } -func (x *ListAttachedWorkloadPoliciesResponse) GetPolicyMap() map[string]*WorkloadRecommendationPolicy { +func (x *ReasoningDecision) GetKind() ReasoningDecisionKind { if x != nil { - return x.PolicyMap + return x.Kind } - return nil + return ReasoningDecisionKind_REASONING_DECISION_KIND_UNSPECIFIED } -func (x *ListAttachedWorkloadPoliciesResponse) GetWorkloadMap() map[string]*WorkloadItem { +func (x *ReasoningDecision) GetContainer() string { if x != nil { - return x.WorkloadMap + return x.Container } - return nil -} - -// ListAttachedNodeGroupPoliciesRequest is used to fetch all attached node group policies and node groups for a team. -// All parameters except team_id are optional filters. -type ListAttachedNodeGroupPoliciesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. - NodeGroupNames []string `protobuf:"bytes,4,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional list of node group names to filter by specific node groups. + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) Reset() { - *x = ListAttachedNodeGroupPoliciesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[166] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ReasoningDecision) GetResource() string { + if x != nil { + return x.Resource } + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListAttachedNodeGroupPoliciesRequest) ProtoMessage() {} - -func (x *ListAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[166] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ReasoningDecision) GetField() string { + if x != nil { + return x.Field } - return mi.MessageOf(x) -} - -// Deprecated: Use ListAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{166} + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *ReasoningDecision) GetIntended() int64 { + if x != nil && x.Intended != nil { + return *x.Intended } - return "" + return 0 } -func (x *ListAttachedNodeGroupPoliciesRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *ReasoningDecision) GetActual() int64 { + if x != nil && x.Actual != nil { + return *x.Actual } - return nil + return 0 } -func (x *ListAttachedNodeGroupPoliciesRequest) GetPolicyIds() []string { +func (x *ReasoningDecision) GetConstraint() string { if x != nil { - return x.PolicyIds + return x.Constraint } - return nil + return "" } -func (x *ListAttachedNodeGroupPoliciesRequest) GetNodeGroupNames() []string { +func (x *ReasoningDecision) GetMessage() string { if x != nil { - return x.NodeGroupNames + return x.Message } - return nil + return "" } -// ListAttachedNodeGroupPoliciesResponse contains all attached policies and node groups with their relationships. -type ListAttachedNodeGroupPoliciesResponse struct { +type GetAttachedNodeGroupPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyMap map[string]*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to NodeGroupRecommendationPolicy - NodeGroupMap map[string]*NodeGroupItem `protobuf:"bytes,2,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of node group name to NodeGroupItem + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodeGroupName string `protobuf:"bytes,3,opt,name=node_group_name,json=nodeGroupName,proto3" json:"node_group_name,omitempty"` } -func (x *ListAttachedNodeGroupPoliciesResponse) Reset() { - *x = ListAttachedNodeGroupPoliciesResponse{} +func (x *GetAttachedNodeGroupPoliciesRequest) Reset() { + *x = GetAttachedNodeGroupPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[167] + mi := &file_api_v1_recommendation_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListAttachedNodeGroupPoliciesResponse) String() string { +func (x *GetAttachedNodeGroupPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListAttachedNodeGroupPoliciesResponse) ProtoMessage() {} +func (*GetAttachedNodeGroupPoliciesRequest) ProtoMessage() {} -func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[167] +func (x *GetAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[181] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14571,53 +17699,57 @@ func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{167} +// Deprecated: Use GetAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. +func (*GetAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{181} } -func (x *ListAttachedNodeGroupPoliciesResponse) GetPolicyMap() map[string]*NodeGroupRecommendationPolicy { +func (x *GetAttachedNodeGroupPoliciesRequest) GetTeamId() string { if x != nil { - return x.PolicyMap + return x.TeamId } - return nil + return "" } -func (x *ListAttachedNodeGroupPoliciesResponse) GetNodeGroupMap() map[string]*NodeGroupItem { +func (x *GetAttachedNodeGroupPoliciesRequest) GetClusterId() string { if x != nil { - return x.NodeGroupMap + return x.ClusterId } - return nil + return "" } -// NodeGroupItem represents a node group and its policy attachments. -type NodeGroupItem struct { +func (x *GetAttachedNodeGroupPoliciesRequest) GetNodeGroupName() string { + if x != nil { + return x.NodeGroupName + } + return "" +} + +type GetAttachedNodeGroupPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster ID where the node group exists. - PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this node group. + Policies []*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *NodeGroupItem) Reset() { - *x = NodeGroupItem{} +func (x *GetAttachedNodeGroupPoliciesResponse) Reset() { + *x = GetAttachedNodeGroupPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[168] + mi := &file_api_v1_recommendation_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupItem) String() string { +func (x *GetAttachedNodeGroupPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupItem) ProtoMessage() {} +func (*GetAttachedNodeGroupPoliciesResponse) ProtoMessage() {} -func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[168] +func (x *GetAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[182] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14628,60 +17760,47 @@ func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupItem.ProtoReflect.Descriptor instead. -func (*NodeGroupItem) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{168} -} - -func (x *NodeGroupItem) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NodeGroupItem) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. +func (*GetAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{182} } -func (x *NodeGroupItem) GetPolicyIds() []string { +func (x *GetAttachedNodeGroupPoliciesResponse) GetPolicies() []*NodeGroupRecommendationPolicy { if x != nil { - return x.PolicyIds + return x.Policies } return nil } -type RecommendationAppliedRequest struct { +type GetAttachedWorkloadPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + Kind K8SObjectKind `protobuf:"varint,4,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` // The kind of workload + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` } -func (x *RecommendationAppliedRequest) Reset() { - *x = RecommendationAppliedRequest{} +func (x *GetAttachedWorkloadPoliciesRequest) Reset() { + *x = GetAttachedWorkloadPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[169] + mi := &file_api_v1_recommendation_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationAppliedRequest) String() string { +func (x *GetAttachedWorkloadPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationAppliedRequest) ProtoMessage() {} +func (*GetAttachedWorkloadPoliciesRequest) ProtoMessage() {} -func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[169] +func (x *GetAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[183] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14692,62 +17811,72 @@ func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationAppliedRequest.ProtoReflect.Descriptor instead. -func (*RecommendationAppliedRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{169} +// Deprecated: Use GetAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. +func (*GetAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{183} } -func (x *RecommendationAppliedRequest) GetTeamId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *RecommendationAppliedRequest) GetClusterId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *RecommendationAppliedRequest) GetRecommendationId() string { +func (x *GetAttachedWorkloadPoliciesRequest) GetWorkloadUid() string { if x != nil { - return x.RecommendationId + return x.WorkloadUid } return "" } -func (x *RecommendationAppliedRequest) GetKind() K8SObjectKind { - if x != nil && x.Kind != nil { - return *x.Kind +func (x *GetAttachedWorkloadPoliciesRequest) GetKind() K8SObjectKind { + if x != nil { + return x.Kind } return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED } -type RecommendationAppliedResponse struct { +func (x *GetAttachedWorkloadPoliciesRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted + } + return false +} + +type GetAttachedWorkloadPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + RelevantPolicies *WorkloadRecommendationPolicyGroup `protobuf:"bytes,1,opt,name=relevant_policies,json=relevantPolicies,proto3" json:"relevant_policies,omitempty"` + PolicyIdToMatchedTargets map[string]*WorkloadPolicyTargetGroup `protobuf:"bytes,2,rep,name=policy_id_to_matched_targets,json=policyIdToMatchedTargets,proto3" json:"policy_id_to_matched_targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *RecommendationAppliedResponse) Reset() { - *x = RecommendationAppliedResponse{} +func (x *GetAttachedWorkloadPoliciesResponse) Reset() { + *x = GetAttachedWorkloadPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[170] + mi := &file_api_v1_recommendation_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationAppliedResponse) String() string { +func (x *GetAttachedWorkloadPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationAppliedResponse) ProtoMessage() {} +func (*GetAttachedWorkloadPoliciesResponse) ProtoMessage() {} -func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[170] +func (x *GetAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[184] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14758,44 +17887,50 @@ func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationAppliedResponse.ProtoReflect.Descriptor instead. -func (*RecommendationAppliedResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{170} +// Deprecated: Use GetAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. +func (*GetAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{184} } -type ApplyRecommendationRequest struct { +func (x *GetAttachedWorkloadPoliciesResponse) GetRelevantPolicies() *WorkloadRecommendationPolicyGroup { + if x != nil { + return x.RelevantPolicies + } + return nil +} + +func (x *GetAttachedWorkloadPoliciesResponse) GetPolicyIdToMatchedTargets() map[string]*WorkloadPolicyTargetGroup { + if x != nil { + return x.PolicyIdToMatchedTargets + } + return nil +} + +type WorkloadRecommendationPolicyGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload - // If true, generate a WorkloadRule instead of applying the recommendation directly. - // This is used when the policy has EnableInClusterMpa enabled, allowing the in-cluster - // MPA controller to evaluate the rule and generate recommendations locally. - GenerateRule bool `protobuf:"varint,13,opt,name=generate_rule,json=generateRule,proto3" json:"generate_rule,omitempty"` - WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,14,opt,name=workload_recommendation,json=workloadRecommendation,proto3,oneof" json:"workload_recommendation,omitempty"` + Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *ApplyRecommendationRequest) Reset() { - *x = ApplyRecommendationRequest{} +func (x *WorkloadRecommendationPolicyGroup) Reset() { + *x = WorkloadRecommendationPolicyGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[171] + mi := &file_api_v1_recommendation_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyRecommendationRequest) String() string { +func (x *WorkloadRecommendationPolicyGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyRecommendationRequest) ProtoMessage() {} +func (*WorkloadRecommendationPolicyGroup) ProtoMessage() {} -func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[171] +func (x *WorkloadRecommendationPolicyGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[185] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14806,76 +17941,43 @@ func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyRecommendationRequest.ProtoReflect.Descriptor instead. -func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{171} -} - -func (x *ApplyRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetRecommendationId() string { - if x != nil { - return x.RecommendationId - } - return "" -} - -func (x *ApplyRecommendationRequest) GetKind() K8SObjectKind { - if x != nil && x.Kind != nil { - return *x.Kind - } - return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED -} - -func (x *ApplyRecommendationRequest) GetGenerateRule() bool { - if x != nil { - return x.GenerateRule - } - return false +// Deprecated: Use WorkloadRecommendationPolicyGroup.ProtoReflect.Descriptor instead. +func (*WorkloadRecommendationPolicyGroup) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{185} } -func (x *ApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { +func (x *WorkloadRecommendationPolicyGroup) GetPolicies() []*WorkloadRecommendationPolicy { if x != nil { - return x.WorkloadRecommendation + return x.Policies } return nil } -type ApplyRecommendationResponse struct { +type WorkloadPolicyTargetGroup struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Targets []*WorkloadPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *ApplyRecommendationResponse) Reset() { - *x = ApplyRecommendationResponse{} +func (x *WorkloadPolicyTargetGroup) Reset() { + *x = WorkloadPolicyTargetGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[172] + mi := &file_api_v1_recommendation_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ApplyRecommendationResponse) String() string { +func (x *WorkloadPolicyTargetGroup) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ApplyRecommendationResponse) ProtoMessage() {} +func (*WorkloadPolicyTargetGroup) ProtoMessage() {} -func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[172] +func (x *WorkloadPolicyTargetGroup) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[186] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14886,34 +17988,43 @@ func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ApplyRecommendationResponse.ProtoReflect.Descriptor instead. -func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{172} +// Deprecated: Use WorkloadPolicyTargetGroup.ProtoReflect.Descriptor instead. +func (*WorkloadPolicyTargetGroup) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{186} } -type RecommendationEventsRequest struct { +func (x *WorkloadPolicyTargetGroup) GetTargets() []*WorkloadPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type WorkloadIdentifiers struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Workloads []*WorkloadIdentifier `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` } -func (x *RecommendationEventsRequest) Reset() { - *x = RecommendationEventsRequest{} +func (x *WorkloadIdentifiers) Reset() { + *x = WorkloadIdentifiers{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[173] + mi := &file_api_v1_recommendation_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationEventsRequest) String() string { +func (x *WorkloadIdentifiers) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationEventsRequest) ProtoMessage() {} +func (*WorkloadIdentifiers) ProtoMessage() {} -func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[173] +func (x *WorkloadIdentifiers) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[187] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14924,36 +18035,44 @@ func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationEventsRequest.ProtoReflect.Descriptor instead. -func (*RecommendationEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{173} +// Deprecated: Use WorkloadIdentifiers.ProtoReflect.Descriptor instead. +func (*WorkloadIdentifiers) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{187} } -type RecommendationEventsResponse struct { +func (x *WorkloadIdentifiers) GetWorkloads() []*WorkloadIdentifier { + if x != nil { + return x.Workloads + } + return nil +} + +type WorkloadPolicies struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []string `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Workload *WorkloadIdentifier `protobuf:"bytes,1,opt,name=workload,proto3" json:"workload,omitempty"` + Policies []*WorkloadRecommendationPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *RecommendationEventsResponse) Reset() { - *x = RecommendationEventsResponse{} +func (x *WorkloadPolicies) Reset() { + *x = WorkloadPolicies{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[174] + mi := &file_api_v1_recommendation_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RecommendationEventsResponse) String() string { +func (x *WorkloadPolicies) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RecommendationEventsResponse) ProtoMessage() {} +func (*WorkloadPolicies) ProtoMessage() {} -func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[174] +func (x *WorkloadPolicies) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[188] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14964,51 +18083,55 @@ func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RecommendationEventsResponse.ProtoReflect.Descriptor instead. -func (*RecommendationEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{174} +// Deprecated: Use WorkloadPolicies.ProtoReflect.Descriptor instead. +func (*WorkloadPolicies) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{188} } -func (x *RecommendationEventsResponse) GetEvents() []string { +func (x *WorkloadPolicies) GetWorkload() *WorkloadIdentifier { if x != nil { - return x.Events + return x.Workload } return nil } -// RetrieveSavingsForWorkloadRequest is used to fetch autoscaling impact information for workloads in a cluster. -type RetrieveSavingsForWorkloadRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). - Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. - StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` - IncludeGetWorkloadResp bool `protobuf:"varint,12,opt,name=include_get_workload_resp,json=includeGetWorkloadResp,proto3" json:"include_get_workload_resp,omitempty"` +func (x *WorkloadPolicies) GetPolicies() []*WorkloadRecommendationPolicy { + if x != nil { + return x.Policies + } + return nil } -func (x *RetrieveSavingsForWorkloadRequest) Reset() { - *x = RetrieveSavingsForWorkloadRequest{} +// ListAttachedWorkloadPoliciesRequest is used to fetch all attached workload policies and workloads for a team. +// All parameters except team_id are optional filters. +type ListAttachedWorkloadPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. + WorkloadUids []string `protobuf:"bytes,4,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` // Optional list of workload UIDs to filter by specific workloads. +} + +func (x *ListAttachedWorkloadPoliciesRequest) Reset() { + *x = ListAttachedWorkloadPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[175] + mi := &file_api_v1_recommendation_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RetrieveSavingsForWorkloadRequest) String() string { +func (x *ListAttachedWorkloadPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RetrieveSavingsForWorkloadRequest) ProtoMessage() {} +func (*ListAttachedWorkloadPoliciesRequest) ProtoMessage() {} -func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[175] +func (x *ListAttachedWorkloadPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[189] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15019,93 +18142,125 @@ func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use RetrieveSavingsForWorkloadRequest.ProtoReflect.Descriptor instead. -func (*RetrieveSavingsForWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{175} +// Deprecated: Use ListAttachedWorkloadPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListAttachedWorkloadPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{189} } -func (x *RetrieveSavingsForWorkloadRequest) GetTeamId() string { +func (x *ListAttachedWorkloadPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *RetrieveSavingsForWorkloadRequest) GetClusterId() string { +func (x *ListAttachedWorkloadPoliciesRequest) GetClusterIds() []string { if x != nil { - return x.ClusterId + return x.ClusterIds } - return "" + return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { +func (x *ListAttachedWorkloadPoliciesRequest) GetPolicyIds() []string { if x != nil { - return x.Kind + return x.PolicyIds } - return "" + return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { +func (x *ListAttachedWorkloadPoliciesRequest) GetWorkloadUids() []string { if x != nil { - return x.Uid + return x.WorkloadUids } - return "" + return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { - if x != nil { - return x.StartTime +// ListAttachedWorkloadPoliciesResponse contains all attached policies and workloads with their relationships. +type ListAttachedWorkloadPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyMap map[string]*WorkloadRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to WorkloadRecommendationPolicy + WorkloadMap map[string]*WorkloadItem `protobuf:"bytes,2,rep,name=workload_map,json=workloadMap,proto3" json:"workload_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of workload UID to WorkloadItem +} + +func (x *ListAttachedWorkloadPoliciesResponse) Reset() { + *x = ListAttachedWorkloadPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[190] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { - if x != nil { - return x.EndTime +func (x *ListAttachedWorkloadPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAttachedWorkloadPoliciesResponse) ProtoMessage() {} + +func (x *ListAttachedWorkloadPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[190] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { +// Deprecated: Use ListAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{190} +} + +func (x *ListAttachedWorkloadPoliciesResponse) GetPolicyMap() map[string]*WorkloadRecommendationPolicy { if x != nil { - return x.IncludeDeleted + return x.PolicyMap } - return false + return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeGetWorkloadResp() bool { +func (x *ListAttachedWorkloadPoliciesResponse) GetWorkloadMap() map[string]*WorkloadItem { if x != nil { - return x.IncludeGetWorkloadResp + return x.WorkloadMap } - return false + return nil } -type RetrieveSavingsForWorkloadResponse struct { +// ListAttachedNodeGroupPoliciesRequest is used to fetch all attached node group policies and node groups for a team. +// All parameters except team_id are optional filters. +type ListAttachedNodeGroupPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Savings *SavingsTimeSeries `protobuf:"bytes,1,opt,name=savings,proto3" json:"savings,omitempty"` - GetWorkloadResp *GetWorkloadResponse `protobuf:"bytes,11,opt,name=get_workload_resp,json=getWorkloadResp,proto3,oneof" json:"get_workload_resp,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Optional list of cluster IDs to filter by specific clusters. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // Optional list of policy IDs to filter by specific policies. + NodeGroupNames []string `protobuf:"bytes,4,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` // Optional list of node group names to filter by specific node groups. } -func (x *RetrieveSavingsForWorkloadResponse) Reset() { - *x = RetrieveSavingsForWorkloadResponse{} +func (x *ListAttachedNodeGroupPoliciesRequest) Reset() { + *x = ListAttachedNodeGroupPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[176] + mi := &file_api_v1_recommendation_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RetrieveSavingsForWorkloadResponse) String() string { +func (x *ListAttachedNodeGroupPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesRequest) ProtoMessage() {} -func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[176] +func (x *ListAttachedNodeGroupPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[191] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15116,51 +18271,66 @@ func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use RetrieveSavingsForWorkloadResponse.ProtoReflect.Descriptor instead. -func (*RetrieveSavingsForWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{176} +// Deprecated: Use ListAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{191} } -func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { +func (x *ListAttachedNodeGroupPoliciesRequest) GetTeamId() string { if x != nil { - return x.Savings + return x.TeamId + } + return "" +} + +func (x *ListAttachedNodeGroupPoliciesRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } return nil } -func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { +func (x *ListAttachedNodeGroupPoliciesRequest) GetPolicyIds() []string { if x != nil { - return x.GetWorkloadResp + return x.PolicyIds } return nil } -type CreateNodePoliciesRequest struct { +func (x *ListAttachedNodeGroupPoliciesRequest) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +// ListAttachedNodeGroupPoliciesResponse contains all attached policies and node groups with their relationships. +type ListAttachedNodeGroupPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Policies []*NodePolicy `protobuf:"bytes,11,rep,name=policies,proto3" json:"policies,omitempty"` + PolicyMap map[string]*NodeGroupRecommendationPolicy `protobuf:"bytes,1,rep,name=policy_map,json=policyMap,proto3" json:"policy_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of policy ID to NodeGroupRecommendationPolicy + NodeGroupMap map[string]*NodeGroupItem `protobuf:"bytes,2,rep,name=node_group_map,json=nodeGroupMap,proto3" json:"node_group_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Map of node group name to NodeGroupItem } -func (x *CreateNodePoliciesRequest) Reset() { - *x = CreateNodePoliciesRequest{} +func (x *ListAttachedNodeGroupPoliciesResponse) Reset() { + *x = ListAttachedNodeGroupPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[177] + mi := &file_api_v1_recommendation_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePoliciesRequest) String() string { +func (x *ListAttachedNodeGroupPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePoliciesRequest) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesResponse) ProtoMessage() {} -func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[177] +func (x *ListAttachedNodeGroupPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[192] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15171,50 +18341,53 @@ func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePoliciesRequest.ProtoReflect.Descriptor instead. -func (*CreateNodePoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{177} +// Deprecated: Use ListAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{192} } -func (x *CreateNodePoliciesRequest) GetTeamId() string { +func (x *ListAttachedNodeGroupPoliciesResponse) GetPolicyMap() map[string]*NodeGroupRecommendationPolicy { if x != nil { - return x.TeamId + return x.PolicyMap } - return "" + return nil } -func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { +func (x *ListAttachedNodeGroupPoliciesResponse) GetNodeGroupMap() map[string]*NodeGroupItem { if x != nil { - return x.Policies + return x.NodeGroupMap } return nil } -type CreateNodePoliciesResponse struct { +// NodeGroupItem represents a node group and its policy attachments. +type NodeGroupItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Name of the node group. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Cluster ID where the node group exists. + PolicyIds []string `protobuf:"bytes,3,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // List of policy IDs attached to this node group. } -func (x *CreateNodePoliciesResponse) Reset() { - *x = CreateNodePoliciesResponse{} +func (x *NodeGroupItem) Reset() { + *x = NodeGroupItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[178] + mi := &file_api_v1_recommendation_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePoliciesResponse) String() string { +func (x *NodeGroupItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePoliciesResponse) ProtoMessage() {} +func (*NodeGroupItem) ProtoMessage() {} -func (x *CreateNodePoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[178] +func (x *NodeGroupItem) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[193] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15225,44 +18398,60 @@ func (x *CreateNodePoliciesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePoliciesResponse.ProtoReflect.Descriptor instead. -func (*CreateNodePoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{178} +// Deprecated: Use NodeGroupItem.ProtoReflect.Descriptor instead. +func (*NodeGroupItem) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} } -func (x *CreateNodePoliciesResponse) GetPolicies() []*NodePolicy { +func (x *NodeGroupItem) GetName() string { if x != nil { - return x.Policies + return x.Name + } + return "" +} + +func (x *NodeGroupItem) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *NodeGroupItem) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds } return nil } -type SuggestedNodePolicyRequest struct { +type RecommendationAppliedRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload } -func (x *SuggestedNodePolicyRequest) Reset() { - *x = SuggestedNodePolicyRequest{} +func (x *RecommendationAppliedRequest) Reset() { + *x = RecommendationAppliedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[179] + mi := &file_api_v1_recommendation_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyRequest) String() string { +func (x *RecommendationAppliedRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyRequest) ProtoMessage() {} +func (*RecommendationAppliedRequest) ProtoMessage() {} -func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[179] +func (x *RecommendationAppliedRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[194] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15273,50 +18462,62 @@ func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*SuggestedNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{179} +// Deprecated: Use RecommendationAppliedRequest.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{194} } -func (x *SuggestedNodePolicyRequest) GetTeamId() string { +func (x *RecommendationAppliedRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *SuggestedNodePolicyRequest) GetClusterId() string { +func (x *RecommendationAppliedRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -type SuggestedNodePolicyResponse struct { +func (x *RecommendationAppliedRequest) GetRecommendationId() string { + if x != nil { + return x.RecommendationId + } + return "" +} + +func (x *RecommendationAppliedRequest) GetKind() K8SObjectKind { + if x != nil && x.Kind != nil { + return *x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +type RecommendationAppliedResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *SuggestedNodePolicyResponse) Reset() { - *x = SuggestedNodePolicyResponse{} +func (x *RecommendationAppliedResponse) Reset() { + *x = RecommendationAppliedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[180] + mi := &file_api_v1_recommendation_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyResponse) String() string { +func (x *RecommendationAppliedResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyResponse) ProtoMessage() {} +func (*RecommendationAppliedResponse) ProtoMessage() {} -func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[180] +func (x *RecommendationAppliedResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[195] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15327,47 +18528,44 @@ func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*SuggestedNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{180} -} - -func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { - if x != nil { - return x.Policy - } - return nil +// Deprecated: Use RecommendationAppliedResponse.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{195} } -type GenerateNodePoliciesFromKarpenterRequest struct { +type ApplyRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - // When true, the generated policies will be saved to the database - // and node policy targets will be created for each policy (with enabled=false). - PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RecommendationId string `protobuf:"bytes,11,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + Kind *K8SObjectKind `protobuf:"varint,12,opt,name=kind,proto3,enum=api.v1.K8SObjectKind,oneof" json:"kind,omitempty"` // if set, means its workload + // If true, generate a WorkloadRule instead of applying the recommendation directly. + // This is used when the policy has EnableInClusterMpa enabled, allowing the in-cluster + // MPA controller to evaluate the rule and generate recommendations locally. + GenerateRule bool `protobuf:"varint,13,opt,name=generate_rule,json=generateRule,proto3" json:"generate_rule,omitempty"` + WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,14,opt,name=workload_recommendation,json=workloadRecommendation,proto3,oneof" json:"workload_recommendation,omitempty"` } -func (x *GenerateNodePoliciesFromKarpenterRequest) Reset() { - *x = GenerateNodePoliciesFromKarpenterRequest{} +func (x *ApplyRecommendationRequest) Reset() { + *x = ApplyRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[181] + mi := &file_api_v1_recommendation_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { +func (x *ApplyRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} +func (*ApplyRecommendationRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[181] +func (x *ApplyRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[196] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15378,59 +18576,76 @@ func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromKarpenterRequest.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromKarpenterRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{181} +// Deprecated: Use ApplyRecommendationRequest.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{196} } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { +func (x *ApplyRecommendationRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { +func (x *ApplyRecommendationRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { +func (x *ApplyRecommendationRequest) GetRecommendationId() string { if x != nil { - return x.PersistPolicies + return x.RecommendationId + } + return "" +} + +func (x *ApplyRecommendationRequest) GetKind() K8SObjectKind { + if x != nil && x.Kind != nil { + return *x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +func (x *ApplyRecommendationRequest) GetGenerateRule() bool { + if x != nil { + return x.GenerateRule } return false } -type GenerateNodePoliciesFromKarpenterResponse struct { +func (x *ApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { + if x != nil { + return x.WorkloadRecommendation + } + return nil +} + +type ApplyRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` - // Targets created when persist_policies is true - Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GenerateNodePoliciesFromKarpenterResponse) Reset() { - *x = GenerateNodePoliciesFromKarpenterResponse{} +func (x *ApplyRecommendationResponse) Reset() { + *x = ApplyRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[182] + mi := &file_api_v1_recommendation_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { +func (x *ApplyRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} +func (*ApplyRecommendationResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[182] +func (x *ApplyRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[197] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15441,54 +18656,34 @@ func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromKarpenterResponse.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromKarpenterResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{182} -} - -func (x *GenerateNodePoliciesFromKarpenterResponse) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *GenerateNodePoliciesFromKarpenterResponse) GetTargets() []*NodePolicyTarget { - if x != nil { - return x.Targets - } - return nil +// Deprecated: Use ApplyRecommendationResponse.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{197} } -type GenerateNodePoliciesFromNodeGroupsRequest struct { +type RecommendationEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - // When true, the generated policies will be saved to the database - // and node policy targets will be created for each policy (with enabled=false). - PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsRequest{} +func (x *RecommendationEventsRequest) Reset() { + *x = RecommendationEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[183] + mi := &file_api_v1_recommendation_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { +func (x *RecommendationEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} +func (*RecommendationEventsRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[183] +func (x *RecommendationEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[198] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15499,65 +18694,36 @@ func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromNodeGroupsRequest.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromNodeGroupsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{183} -} - -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetPersistPolicies() bool { - if x != nil { - return x.PersistPolicies - } - return false +// Deprecated: Use RecommendationEventsRequest.ProtoReflect.Descriptor instead. +func (*RecommendationEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{198} } -type GenerateNodePoliciesFromNodeGroupsResponse struct { +type RecommendationEventsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` - Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` - Warnings []*WorkloadCompatibilityWarning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` - // eligibility carries per-node-group "may this be migrated?" information - // computed from the current node observations. The wizard reads this to - // disable Step 3 rows for groups the operator must NOT migrate, with a - // tooltip explaining why. Always parallel-keyed by group name (matches - // NodePolicy.name). Empty when every group is migratable. - Eligibility []*NodeGroupMigrationEligibility `protobuf:"bytes,4,rep,name=eligibility,proto3" json:"eligibility,omitempty"` + Events []string `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsResponse{} +func (x *RecommendationEventsResponse) Reset() { + *x = RecommendationEventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[184] + mi := &file_api_v1_recommendation_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { +func (x *RecommendationEventsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} +func (*RecommendationEventsResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[184] +func (x *RecommendationEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[199] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15568,114 +18734,51 @@ func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use GenerateNodePoliciesFromNodeGroupsResponse.ProtoReflect.Descriptor instead. -func (*GenerateNodePoliciesFromNodeGroupsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{184} -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetTargets() []*NodePolicyTarget { - if x != nil { - return x.Targets - } - return nil -} - -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetWarnings() []*WorkloadCompatibilityWarning { - if x != nil { - return x.Warnings - } - return nil +// Deprecated: Use RecommendationEventsResponse.ProtoReflect.Descriptor instead. +func (*RecommendationEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{199} } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetEligibility() []*NodeGroupMigrationEligibility { +func (x *RecommendationEventsResponse) GetEvents() []string { if x != nil { - return x.Eligibility + return x.Events } return nil } -// NodeGroupMigrationEligibility flags a node group as not-safe-to-migrate -// for the CAS-migration wizard. Eligibility is preview-time only — it -// describes the *current* state of the source pool, not a property of the -// generated NodePolicy, so it's surfaced alongside the policies rather -// than embedded in NodePolicy itself. -type NodeGroupMigrationEligibility struct { +// RetrieveSavingsForWorkloadRequest is used to fetch autoscaling impact information for workloads in a cluster. +type RetrieveSavingsForWorkloadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // group_name matches NodePolicy.name (the source node group's name). - GroupName string `protobuf:"bytes,1,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` - // migratable=false means the wizard MUST disable this row in Step 3 - // (BLOCKING reason present). True (or absent) means safe-to-migrate; - // an ADVISORY reason may still be present, in which case the wizard - // should show a non-blocking yellow caveat next to the row. - Migratable bool `protobuf:"varint,2,opt,name=migratable,proto3" json:"migratable,omitempty"` - // reasons documents why migration is blocked OR carries caveats. - // Stable identifier strings the wizard maps to human-readable messages. - // - // Blocking reasons (force migratable=false; row is disabled): - // - // "system_pool" — AKS pool with kubernetes.azure.com/mode=system - // or GKE pool with cloud.google.com/gke-system-only=true - // or the GKE system-only taint - // (CriticalAddonsOnly=true:NoSchedule). AKS - // requires ≥1 System pool to keep kube-system - // schedulable; draining the last one bricks - // the control plane. - // "karpenter_ops_pool" — pool labelled devzero.io/karpenter-ops-pool=true - // by dz-installer (setup-azure.sh / - // setup-gcp.sh). Migrating the pool that runs - // karpenter itself is a chicken-and-egg — - // karpenter would have to drain itself. - // "azure_sku_restricted" — source pool runs an AKS-restricted VM size - // (Basic A-series, B1s/B1ms, F1/F1s, - // A0/A1/A1_v2). kp-azure refuses to provision - // these. No workaround at the policy layer. - // "azure_sku_confidential" — source pool runs a Confidential Compute - // SKU (DC* / EC*). kp-azure's isConfidential - // predicate excludes these. - // - // Advisory reasons (migratable stays true; show as caveat): - // - // "azure_sku_nvme_under_cig" — source pool's SKU is NVMe-only - // (Standard_D*ads_v6 / D*alds_v6 / E*ads_v6 etc). - // kp-azure's default CIG image source isn't - // NVMe-tagged, so the controller filters these - // SKUs out of its catalog. Migration still - // works because the generated NodePool only - // requires sku-family (instance-category) — - // karpenter picks a compatible non-NVMe SKU - // from the same family. Operator should know - // the launched nodes won't exactly match the - // source pool. - Reasons []string `protobuf:"bytes,3,rep,name=reasons,proto3" json:"reasons,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Unique identifier for the cluster. + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` // Kind of the workload (e.g., Deployment, StatefulSet). + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` // Unique identifier for the workload. + StartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + IncludeDeleted bool `protobuf:"varint,11,opt,name=include_deleted,json=includeDeleted,proto3" json:"include_deleted,omitempty"` + IncludeGetWorkloadResp bool `protobuf:"varint,12,opt,name=include_get_workload_resp,json=includeGetWorkloadResp,proto3" json:"include_get_workload_resp,omitempty"` } -func (x *NodeGroupMigrationEligibility) Reset() { - *x = NodeGroupMigrationEligibility{} +func (x *RetrieveSavingsForWorkloadRequest) Reset() { + *x = RetrieveSavingsForWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[185] + mi := &file_api_v1_recommendation_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupMigrationEligibility) String() string { +func (x *RetrieveSavingsForWorkloadRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupMigrationEligibility) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadRequest) ProtoMessage() {} -func (x *NodeGroupMigrationEligibility) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[185] +func (x *RetrieveSavingsForWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[200] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15686,58 +18789,93 @@ func (x *NodeGroupMigrationEligibility) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupMigrationEligibility.ProtoReflect.Descriptor instead. -func (*NodeGroupMigrationEligibility) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{185} +// Deprecated: Use RetrieveSavingsForWorkloadRequest.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{200} } -func (x *NodeGroupMigrationEligibility) GetGroupName() string { +func (x *RetrieveSavingsForWorkloadRequest) GetTeamId() string { if x != nil { - return x.GroupName + return x.TeamId } return "" } -func (x *NodeGroupMigrationEligibility) GetMigratable() bool { +func (x *RetrieveSavingsForWorkloadRequest) GetClusterId() string { if x != nil { - return x.Migratable + return x.ClusterId } - return false + return "" } -func (x *NodeGroupMigrationEligibility) GetReasons() []string { +func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { if x != nil { - return x.Reasons + return x.Kind + } + return "" +} + +func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime } return nil } -type GetNodeAnnotationReadinessRequest struct { +func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { + if x != nil { + return x.EndTime + } + return nil +} + +func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted + } + return false +} + +func (x *RetrieveSavingsForWorkloadRequest) GetIncludeGetWorkloadResp() bool { + if x != nil { + return x.IncludeGetWorkloadResp + } + return false +} + +type RetrieveSavingsForWorkloadResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Savings *SavingsTimeSeries `protobuf:"bytes,1,opt,name=savings,proto3" json:"savings,omitempty"` + GetWorkloadResp *GetWorkloadResponse `protobuf:"bytes,11,opt,name=get_workload_resp,json=getWorkloadResp,proto3,oneof" json:"get_workload_resp,omitempty"` } -func (x *GetNodeAnnotationReadinessRequest) Reset() { - *x = GetNodeAnnotationReadinessRequest{} +func (x *RetrieveSavingsForWorkloadResponse) Reset() { + *x = RetrieveSavingsForWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[186] + mi := &file_api_v1_recommendation_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessRequest) String() string { +func (x *RetrieveSavingsForWorkloadResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessRequest) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[186] +func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[201] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15748,67 +18886,51 @@ func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeAnnotationReadinessRequest.ProtoReflect.Descriptor instead. -func (*GetNodeAnnotationReadinessRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{186} +// Deprecated: Use RetrieveSavingsForWorkloadResponse.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{201} } -func (x *GetNodeAnnotationReadinessRequest) GetTeamId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { if x != nil { - return x.TeamId + return x.Savings } - return "" + return nil } -func (x *GetNodeAnnotationReadinessRequest) GetClusterId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { if x != nil { - return x.ClusterId + return x.GetWorkloadResp } - return "" + return nil } -type GetNodeAnnotationReadinessResponse struct { +type CreateNodePoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TotalNodes int32 `protobuf:"varint,1,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` - AnnotatedNodes int32 `protobuf:"varint,2,opt,name=annotated_nodes,json=annotatedNodes,proto3" json:"annotated_nodes,omitempty"` - UnannotatedNodes int32 `protobuf:"varint,3,opt,name=unannotated_nodes,json=unannotatedNodes,proto3" json:"unannotated_nodes,omitempty"` - Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` - UnannotatedNodeNames []string `protobuf:"bytes,5,rep,name=unannotated_node_names,json=unannotatedNodeNames,proto3" json:"unannotated_node_names,omitempty"` - // supported is false when the cluster's cloud provider has no annotation - // schema yet (OCI today). The wizard renders a clear "not supported" - // state instead of polling indefinitely. - Supported bool `protobuf:"varint,6,opt,name=supported,proto3" json:"supported,omitempty"` - // aks_cluster_resource_group is the resource group that hosts the AKS - // managed-cluster resource (NOT the MC_* node RG). Surfaced here so the - // wizard's Step 5 / Step 7 commands (`az aks nodepool update/scale`) - // can drop the placeholder. Populated from - // devzero.io/azure-aks-cluster-rg on any annotated node. Empty when - // the cluster isn't Azure or when the controller wasn't configured - // with ARM_RESOURCE_GROUP — in either case the wizard falls back to - // the placeholder. - AksClusterResourceGroup string `protobuf:"bytes,7,opt,name=aks_cluster_resource_group,json=aksClusterResourceGroup,proto3" json:"aks_cluster_resource_group,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,11,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetNodeAnnotationReadinessResponse) Reset() { - *x = GetNodeAnnotationReadinessResponse{} +func (x *CreateNodePoliciesRequest) Reset() { + *x = CreateNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[187] + mi := &file_api_v1_recommendation_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessResponse) String() string { +func (x *CreateNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessResponse) ProtoMessage() {} +func (*CreateNodePoliciesRequest) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[187] +func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[202] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15819,62 +18941,73 @@ func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeAnnotationReadinessResponse.ProtoReflect.Descriptor instead. -func (*GetNodeAnnotationReadinessResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{187} +// Deprecated: Use CreateNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{202} } -func (x *GetNodeAnnotationReadinessResponse) GetTotalNodes() int32 { +func (x *CreateNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.TotalNodes + return x.TeamId } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetAnnotatedNodes() int32 { +func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { if x != nil { - return x.AnnotatedNodes + return x.Policies } - return 0 + return nil } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodes() int32 { - if x != nil { - return x.UnannotatedNodes - } - return 0 +type CreateNodePoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetNodeAnnotationReadinessResponse) GetReady() bool { - if x != nil { - return x.Ready +func (x *CreateNodePoliciesResponse) Reset() { + *x = CreateNodePoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[203] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodeNames() []string { - if x != nil { - return x.UnannotatedNodeNames - } - return nil +func (x *CreateNodePoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *GetNodeAnnotationReadinessResponse) GetSupported() bool { - if x != nil { - return x.Supported +func (*CreateNodePoliciesResponse) ProtoMessage() {} + +func (x *CreateNodePoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[203] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *GetNodeAnnotationReadinessResponse) GetAksClusterResourceGroup() string { +// Deprecated: Use CreateNodePoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateNodePoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{203} +} + +func (x *CreateNodePoliciesResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.AksClusterResourceGroup + return x.Policies } - return "" + return nil } -// Migration wizard state -type GetMigrationStateRequest struct { +type SuggestedNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -15883,23 +19016,23 @@ type GetMigrationStateRequest struct { ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetMigrationStateRequest) Reset() { - *x = GetMigrationStateRequest{} +func (x *SuggestedNodePolicyRequest) Reset() { + *x = SuggestedNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[188] + mi := &file_api_v1_recommendation_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateRequest) String() string { +func (x *SuggestedNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateRequest) ProtoMessage() {} +func (*SuggestedNodePolicyRequest) ProtoMessage() {} -func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[188] +func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[204] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15910,56 +19043,50 @@ func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMigrationStateRequest.ProtoReflect.Descriptor instead. -func (*GetMigrationStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{188} +// Deprecated: Use SuggestedNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{204} } -func (x *GetMigrationStateRequest) GetTeamId() string { +func (x *SuggestedNodePolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetMigrationStateRequest) GetClusterId() string { +func (x *SuggestedNodePolicyRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -type GetMigrationStateResponse struct { +type SuggestedNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` - StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *GetMigrationStateResponse) Reset() { - *x = GetMigrationStateResponse{} +func (x *SuggestedNodePolicyResponse) Reset() { + *x = SuggestedNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[189] + mi := &file_api_v1_recommendation_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateResponse) String() string { +func (x *SuggestedNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateResponse) ProtoMessage() {} +func (*SuggestedNodePolicyResponse) ProtoMessage() {} -func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[189] +func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[205] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15970,89 +19097,47 @@ func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMigrationStateResponse.ProtoReflect.Descriptor instead. -func (*GetMigrationStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{189} -} - -func (x *GetMigrationStateResponse) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *GetMigrationStateResponse) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *GetMigrationStateResponse) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *GetMigrationStateResponse) GetCurrentStep() int32 { - if x != nil { - return x.CurrentStep - } - return 0 -} - -func (x *GetMigrationStateResponse) GetStateJson() string { - if x != nil { - return x.StateJson - } - return "" -} - -func (x *GetMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil +// Deprecated: Use SuggestedNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{205} } -func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { +func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.UpdatedAt + return x.Policy } return nil } -type UpdateMigrationStateRequest struct { +type GenerateNodePoliciesFromKarpenterRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` - StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // When true, the generated policies will be saved to the database + // and node policy targets will be created for each policy (with enabled=false). + PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` } -func (x *UpdateMigrationStateRequest) Reset() { - *x = UpdateMigrationStateRequest{} +func (x *GenerateNodePoliciesFromKarpenterRequest) Reset() { + *x = GenerateNodePoliciesFromKarpenterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[190] + mi := &file_api_v1_recommendation_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateRequest) String() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} -func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[190] +func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[206] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16063,71 +19148,59 @@ func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateMigrationStateRequest.ProtoReflect.Descriptor instead. -func (*UpdateMigrationStateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{190} +// Deprecated: Use GenerateNodePoliciesFromKarpenterRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{206} } -func (x *UpdateMigrationStateRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateMigrationStateRequest) GetClusterId() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *UpdateMigrationStateRequest) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *UpdateMigrationStateRequest) GetCurrentStep() int32 { - if x != nil { - return x.CurrentStep - } - return 0 -} - -func (x *UpdateMigrationStateRequest) GetStateJson() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { if x != nil { - return x.StateJson + return x.PersistPolicies } - return "" + return false } -type UpdateMigrationStateResponse struct { +type GenerateNodePoliciesFromKarpenterResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // Targets created when persist_policies is true + Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *UpdateMigrationStateResponse) Reset() { - *x = UpdateMigrationStateResponse{} +func (x *GenerateNodePoliciesFromKarpenterResponse) Reset() { + *x = GenerateNodePoliciesFromKarpenterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[191] + mi := &file_api_v1_recommendation_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateResponse) String() string { +func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateResponse) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} -func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[191] +func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[207] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16138,49 +19211,54 @@ func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateMigrationStateResponse.ProtoReflect.Descriptor instead. -func (*UpdateMigrationStateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{191} +// Deprecated: Use GenerateNodePoliciesFromKarpenterResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{207} } -func (x *UpdateMigrationStateResponse) GetId() string { +func (x *GenerateNodePoliciesFromKarpenterResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.Id + return x.Policies } - return "" + return nil } -// NodePool validation -type ReportNodePoolValidationRequest struct { +func (x *GenerateNodePoliciesFromKarpenterResponse) GetTargets() []*NodePolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type GenerateNodePoliciesFromNodeGroupsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - NodepoolName string `protobuf:"bytes,2,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` - NodeName string `protobuf:"bytes,3,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - Zone string `protobuf:"bytes,5,opt,name=zone,proto3" json:"zone,omitempty"` - TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // When true, the generated policies will be saved to the database + // and node policy targets will be created for each policy (with enabled=false). + PersistPolicies bool `protobuf:"varint,3,opt,name=persist_policies,json=persistPolicies,proto3" json:"persist_policies,omitempty"` } -func (x *ReportNodePoolValidationRequest) Reset() { - *x = ReportNodePoolValidationRequest{} +func (x *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[192] + mi := &file_api_v1_recommendation_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationRequest) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} -func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[192] +func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[208] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16191,76 +19269,67 @@ func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReportNodePoolValidationRequest.ProtoReflect.Descriptor instead. -func (*ReportNodePoolValidationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{192} -} - -func (x *ReportNodePoolValidationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *ReportNodePoolValidationRequest) GetNodepoolName() string { - if x != nil { - return x.NodepoolName - } - return "" -} - -func (x *ReportNodePoolValidationRequest) GetNodeName() string { - if x != nil { - return x.NodeName - } - return "" +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{208} } -func (x *ReportNodePoolValidationRequest) GetInstanceType() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { if x != nil { - return x.InstanceType + return x.TeamId } return "" } -func (x *ReportNodePoolValidationRequest) GetZone() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { if x != nil { - return x.Zone + return x.ClusterId } return "" } -func (x *ReportNodePoolValidationRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetPersistPolicies() bool { if x != nil { - return x.TeamId + return x.PersistPolicies } - return "" + return false } -type ReportNodePoolValidationResponse struct { +type GenerateNodePoliciesFromNodeGroupsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` + Warnings []*WorkloadCompatibilityWarning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` + // eligibility carries per-node-group "may this be migrated?" information + // computed from the current node observations. The wizard reads this to + // disable Step 3 rows for groups the operator must NOT migrate, with a + // tooltip explaining why. Keyed by group name (matches NodePolicy.name) + // and populated for every discovered group — including groups that are + // already managed by an existing node policy, which carry the + // "already_migrated" reason and have NO corresponding entry in policies. + Eligibility []*NodeGroupMigrationEligibility `protobuf:"bytes,4,rep,name=eligibility,proto3" json:"eligibility,omitempty"` } -func (x *ReportNodePoolValidationResponse) Reset() { - *x = ReportNodePoolValidationResponse{} +func (x *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[193] + mi := &file_api_v1_recommendation_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationResponse) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationResponse) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} -func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[193] +func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[209] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16271,95 +19340,125 @@ func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ReportNodePoolValidationResponse.ProtoReflect.Descriptor instead. -func (*ReportNodePoolValidationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} -} - -type GetNodePoolValidationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{209} } -func (x *GetNodePoolValidationsRequest) Reset() { - *x = GetNodePoolValidationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[194] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetPolicies() []*NodePolicy { + if x != nil { + return x.Policies } + return nil } -func (x *GetNodePoolValidationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetNodePoolValidationsRequest) ProtoMessage() {} - -func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[194] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetTargets() []*NodePolicyTarget { + if x != nil { + return x.Targets } - return mi.MessageOf(x) -} - -// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. -func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{194} + return nil } -func (x *GetNodePoolValidationsRequest) GetClusterId() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetWarnings() []*WorkloadCompatibilityWarning { if x != nil { - return x.ClusterId + return x.Warnings } - return "" + return nil } -func (x *GetNodePoolValidationsRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetEligibility() []*NodeGroupMigrationEligibility { if x != nil { - return x.TeamId + return x.Eligibility } - return "" + return nil } -type NodePoolValidationReport struct { +// NodeGroupMigrationEligibility flags a node group as not-safe-to-migrate +// for the CAS-migration wizard. Eligibility is preview-time only — it +// describes the *current* state of the source pool, not a property of the +// generated NodePolicy, so it's surfaced alongside the policies rather +// than embedded in NodePolicy itself. +type NodeGroupMigrationEligibility struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodepoolName string `protobuf:"bytes,1,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` - NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` - Zone string `protobuf:"bytes,4,opt,name=zone,proto3" json:"zone,omitempty"` - ReportedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=reported_at,json=reportedAt,proto3" json:"reported_at,omitempty"` + // group_name matches NodePolicy.name (the source node group's name). + GroupName string `protobuf:"bytes,1,opt,name=group_name,json=groupName,proto3" json:"group_name,omitempty"` + // migratable=false means the wizard MUST disable this row in Step 3 + // (BLOCKING reason present). True (or absent) means safe-to-migrate; + // an ADVISORY reason may still be present, in which case the wizard + // should show a non-blocking yellow caveat next to the row. + Migratable bool `protobuf:"varint,2,opt,name=migratable,proto3" json:"migratable,omitempty"` + // reasons documents why migration is blocked OR carries caveats. + // Stable identifier strings the wizard maps to human-readable messages. + // + // Blocking reasons (force migratable=false; row is disabled): + // + // "system_pool" — AKS pool with kubernetes.azure.com/mode=system + // or GKE pool with cloud.google.com/gke-system-only=true + // or the GKE system-only taint + // (CriticalAddonsOnly=true:NoSchedule). AKS + // requires ≥1 System pool to keep kube-system + // schedulable; draining the last one bricks + // the control plane. + // "karpenter_ops_pool" — pool labelled devzero.io/karpenter-ops-pool=true + // by dz-installer (setup-azure.sh / + // setup-gcp.sh). Migrating the pool that runs + // karpenter itself is a chicken-and-egg — + // karpenter would have to drain itself. + // "azure_sku_restricted" — source pool runs an AKS-restricted VM size + // (Basic A-series, B1s/B1ms, F1/F1s, + // A0/A1/A1_v2). kp-azure refuses to provision + // these. No workaround at the policy layer. + // "azure_sku_confidential" — source pool runs a Confidential Compute + // SKU (DC* / EC*). kp-azure's isConfidential + // predicate excludes these. + // "already_migrated" — the group is already managed by a live node + // policy with a live target scoped to this + // cluster. Unlike the other reasons, such + // groups are excluded from the policies list + // entirely (regenerating would create a + // duplicate policy); the entry exists so the + // UI can explain why the group is absent. + // + // Advisory reasons (migratable stays true; show as caveat): + // + // "azure_sku_nvme_under_cig" — source pool's SKU is NVMe-only + // (Standard_D*ads_v6 / D*alds_v6 / E*ads_v6 etc). + // kp-azure's default CIG image source isn't + // NVMe-tagged, so the controller filters these + // SKUs out of its catalog. Migration still + // works because the generated NodePool only + // requires sku-family (instance-category) — + // karpenter picks a compatible non-NVMe SKU + // from the same family. Operator should know + // the launched nodes won't exactly match the + // source pool. + // "cast_ai_live_migration_pool" — the group hosts cast.ai + // live-migration components, which stop + // working once those components are disabled + // during this migration. + Reasons []string `protobuf:"bytes,3,rep,name=reasons,proto3" json:"reasons,omitempty"` } -func (x *NodePoolValidationReport) Reset() { - *x = NodePoolValidationReport{} +func (x *NodeGroupMigrationEligibility) Reset() { + *x = NodeGroupMigrationEligibility{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[195] + mi := &file_api_v1_recommendation_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePoolValidationReport) String() string { +func (x *NodeGroupMigrationEligibility) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePoolValidationReport) ProtoMessage() {} +func (*NodeGroupMigrationEligibility) ProtoMessage() {} -func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[195] +func (x *NodeGroupMigrationEligibility) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[210] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16370,71 +19469,58 @@ func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePoolValidationReport.ProtoReflect.Descriptor instead. -func (*NodePoolValidationReport) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{195} -} - -func (x *NodePoolValidationReport) GetNodepoolName() string { - if x != nil { - return x.NodepoolName - } - return "" -} - -func (x *NodePoolValidationReport) GetNodeName() string { - if x != nil { - return x.NodeName - } - return "" +// Deprecated: Use NodeGroupMigrationEligibility.ProtoReflect.Descriptor instead. +func (*NodeGroupMigrationEligibility) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{210} } -func (x *NodePoolValidationReport) GetInstanceType() string { +func (x *NodeGroupMigrationEligibility) GetGroupName() string { if x != nil { - return x.InstanceType + return x.GroupName } return "" } -func (x *NodePoolValidationReport) GetZone() string { +func (x *NodeGroupMigrationEligibility) GetMigratable() bool { if x != nil { - return x.Zone + return x.Migratable } - return "" + return false } -func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { +func (x *NodeGroupMigrationEligibility) GetReasons() []string { if x != nil { - return x.ReportedAt + return x.Reasons } return nil } -type GetNodePoolValidationsResponse struct { +type GetNodeAnnotationReadinessRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Validations []*NodePoolValidationReport `protobuf:"bytes,1,rep,name=validations,proto3" json:"validations,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *GetNodePoolValidationsResponse) Reset() { - *x = GetNodePoolValidationsResponse{} +func (x *GetNodeAnnotationReadinessRequest) Reset() { + *x = GetNodeAnnotationReadinessRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[196] + mi := &file_api_v1_recommendation_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodePoolValidationsResponse) String() string { +func (x *GetNodeAnnotationReadinessRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodePoolValidationsResponse) ProtoMessage() {} +func (*GetNodeAnnotationReadinessRequest) ProtoMessage() {} -func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[196] +func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[211] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16445,47 +19531,67 @@ func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodePoolValidationsResponse.ProtoReflect.Descriptor instead. -func (*GetNodePoolValidationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{196} +// Deprecated: Use GetNodeAnnotationReadinessRequest.ProtoReflect.Descriptor instead. +func (*GetNodeAnnotationReadinessRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{211} } -func (x *GetNodePoolValidationsResponse) GetValidations() []*NodePoolValidationReport { +func (x *GetNodeAnnotationReadinessRequest) GetTeamId() string { if x != nil { - return x.Validations + return x.TeamId } - return nil + return "" } -type WorkloadCompatibilityWarning struct { +func (x *GetNodeAnnotationReadinessRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type GetNodeAnnotationReadinessResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadName string `protobuf:"bytes,1,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - WorkloadNamespace string `protobuf:"bytes,2,opt,name=workload_namespace,json=workloadNamespace,proto3" json:"workload_namespace,omitempty"` - Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` - NodeGroup string `protobuf:"bytes,4,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` - Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + TotalNodes int32 `protobuf:"varint,1,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` + AnnotatedNodes int32 `protobuf:"varint,2,opt,name=annotated_nodes,json=annotatedNodes,proto3" json:"annotated_nodes,omitempty"` + UnannotatedNodes int32 `protobuf:"varint,3,opt,name=unannotated_nodes,json=unannotatedNodes,proto3" json:"unannotated_nodes,omitempty"` + Ready bool `protobuf:"varint,4,opt,name=ready,proto3" json:"ready,omitempty"` + UnannotatedNodeNames []string `protobuf:"bytes,5,rep,name=unannotated_node_names,json=unannotatedNodeNames,proto3" json:"unannotated_node_names,omitempty"` + // supported is false when the cluster's cloud provider has no annotation + // schema yet (OCI today). The wizard renders a clear "not supported" + // state instead of polling indefinitely. + Supported bool `protobuf:"varint,6,opt,name=supported,proto3" json:"supported,omitempty"` + // aks_cluster_resource_group is the resource group that hosts the AKS + // managed-cluster resource (NOT the MC_* node RG). Surfaced here so the + // wizard's Step 5 / Step 7 commands (`az aks nodepool update/scale`) + // can drop the placeholder. Populated from + // devzero.io/azure-aks-cluster-rg on any annotated node. Empty when + // the cluster isn't Azure or when the controller wasn't configured + // with ARM_RESOURCE_GROUP — in either case the wizard falls back to + // the placeholder. + AksClusterResourceGroup string `protobuf:"bytes,7,opt,name=aks_cluster_resource_group,json=aksClusterResourceGroup,proto3" json:"aks_cluster_resource_group,omitempty"` } -func (x *WorkloadCompatibilityWarning) Reset() { - *x = WorkloadCompatibilityWarning{} +func (x *GetNodeAnnotationReadinessResponse) Reset() { + *x = GetNodeAnnotationReadinessResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[197] + mi := &file_api_v1_recommendation_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadCompatibilityWarning) String() string { +func (x *GetNodeAnnotationReadinessResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadCompatibilityWarning) ProtoMessage() {} +func (*GetNodeAnnotationReadinessResponse) ProtoMessage() {} -func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[197] +func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[212] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16496,71 +19602,86 @@ func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadCompatibilityWarning.ProtoReflect.Descriptor instead. -func (*WorkloadCompatibilityWarning) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{197} +// Deprecated: Use GetNodeAnnotationReadinessResponse.ProtoReflect.Descriptor instead. +func (*GetNodeAnnotationReadinessResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{212} } -func (x *WorkloadCompatibilityWarning) GetWorkloadName() string { +func (x *GetNodeAnnotationReadinessResponse) GetTotalNodes() int32 { if x != nil { - return x.WorkloadName + return x.TotalNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetWorkloadNamespace() string { +func (x *GetNodeAnnotationReadinessResponse) GetAnnotatedNodes() int32 { if x != nil { - return x.WorkloadNamespace + return x.AnnotatedNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetKind() string { +func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodes() int32 { if x != nil { - return x.Kind + return x.UnannotatedNodes } - return "" + return 0 } -func (x *WorkloadCompatibilityWarning) GetNodeGroup() string { +func (x *GetNodeAnnotationReadinessResponse) GetReady() bool { if x != nil { - return x.NodeGroup + return x.Ready } - return "" + return false } -func (x *WorkloadCompatibilityWarning) GetReason() string { +func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodeNames() []string { if x != nil { - return x.Reason + return x.UnannotatedNodeNames + } + return nil +} + +func (x *GetNodeAnnotationReadinessResponse) GetSupported() bool { + if x != nil { + return x.Supported + } + return false +} + +func (x *GetNodeAnnotationReadinessResponse) GetAksClusterResourceGroup() string { + if x != nil { + return x.AksClusterResourceGroup } return "" } -type ListNodePoliciesRequest struct { +type DetectClusterAutoscalerRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *ListNodePoliciesRequest) Reset() { - *x = ListNodePoliciesRequest{} +func (x *DetectClusterAutoscalerRequest) Reset() { + *x = DetectClusterAutoscalerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[198] + mi := &file_api_v1_recommendation_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePoliciesRequest) String() string { +func (x *DetectClusterAutoscalerRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePoliciesRequest) ProtoMessage() {} +func (*DetectClusterAutoscalerRequest) ProtoMessage() {} -func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[198] +func (x *DetectClusterAutoscalerRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[213] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16571,43 +19692,58 @@ func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListNodePoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{198} +// Deprecated: Use DetectClusterAutoscalerRequest.ProtoReflect.Descriptor instead. +func (*DetectClusterAutoscalerRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{213} } -func (x *ListNodePoliciesRequest) GetTeamId() string { +func (x *DetectClusterAutoscalerRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -type ListNodePoliciesResponse struct { +func (x *DetectClusterAutoscalerRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type DetectClusterAutoscalerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // One of: karpenter | cluster_autoscaler | cast_ai | transitioning | unmanaged. + // Plain string (not an enum) so new families ship without a proto bump, + // matching node_scheduling_health.proto's autoscaler_type convention. + AutoscalerType string `protobuf:"bytes,1,opt,name=autoscaler_type,json=autoscalerType,proto3" json:"autoscaler_type,omitempty"` + // Per-family raw booleans so the wizard can pick the SOURCE autoscaler even + // while autoscaler_type reads transitioning (mid-migration both are live). + HasKarpenter bool `protobuf:"varint,2,opt,name=has_karpenter,json=hasKarpenter,proto3" json:"has_karpenter,omitempty"` + HasClusterAutoscaler bool `protobuf:"varint,3,opt,name=has_cluster_autoscaler,json=hasClusterAutoscaler,proto3" json:"has_cluster_autoscaler,omitempty"` + HasCastAi bool `protobuf:"varint,4,opt,name=has_cast_ai,json=hasCastAi,proto3" json:"has_cast_ai,omitempty"` } -func (x *ListNodePoliciesResponse) Reset() { - *x = ListNodePoliciesResponse{} +func (x *DetectClusterAutoscalerResponse) Reset() { + *x = DetectClusterAutoscalerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[199] + mi := &file_api_v1_recommendation_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePoliciesResponse) String() string { +func (x *DetectClusterAutoscalerResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePoliciesResponse) ProtoMessage() {} +func (*DetectClusterAutoscalerResponse) ProtoMessage() {} -func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[199] +func (x *DetectClusterAutoscalerResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[214] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16618,44 +19754,66 @@ func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListNodePoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{199} +// Deprecated: Use DetectClusterAutoscalerResponse.ProtoReflect.Descriptor instead. +func (*DetectClusterAutoscalerResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{214} } -func (x *ListNodePoliciesResponse) GetPolicies() []*NodePolicy { +func (x *DetectClusterAutoscalerResponse) GetAutoscalerType() string { if x != nil { - return x.Policies + return x.AutoscalerType } - return nil + return "" } -type UpdateNodePolicyRequest struct { +func (x *DetectClusterAutoscalerResponse) GetHasKarpenter() bool { + if x != nil { + return x.HasKarpenter + } + return false +} + +func (x *DetectClusterAutoscalerResponse) GetHasClusterAutoscaler() bool { + if x != nil { + return x.HasClusterAutoscaler + } + return false +} + +func (x *DetectClusterAutoscalerResponse) GetHasCastAi() bool { + if x != nil { + return x.HasCastAi + } + return false +} + +// Migration wizard state +type GetMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Policy *NodePolicy `protobuf:"bytes,11,opt,name=policy,proto3" json:"policy,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *UpdateNodePolicyRequest) Reset() { - *x = UpdateNodePolicyRequest{} +func (x *GetMigrationStateRequest) Reset() { + *x = GetMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[200] + mi := &file_api_v1_recommendation_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyRequest) String() string { +func (x *GetMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyRequest) ProtoMessage() {} +func (*GetMigrationStateRequest) ProtoMessage() {} -func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[200] +func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[215] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16666,50 +19824,56 @@ func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{200} +// Deprecated: Use GetMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*GetMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{215} } -func (x *UpdateNodePolicyRequest) GetTeamId() string { +func (x *GetMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateNodePolicyRequest) GetPolicy() *NodePolicy { +func (x *GetMigrationStateRequest) GetClusterId() string { if x != nil { - return x.Policy + return x.ClusterId } - return nil + return "" } -type UpdateNodePolicyResponse struct { +type GetMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *UpdateNodePolicyResponse) Reset() { - *x = UpdateNodePolicyResponse{} +func (x *GetMigrationStateResponse) Reset() { + *x = GetMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[201] + mi := &file_api_v1_recommendation_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyResponse) String() string { +func (x *GetMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyResponse) ProtoMessage() {} +func (*GetMigrationStateResponse) ProtoMessage() {} -func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[201] +func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[216] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16720,126 +19884,89 @@ func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{201} +// Deprecated: Use GetMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*GetMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{216} } -func (x *UpdateNodePolicyResponse) GetPolicy() *NodePolicy { +func (x *GetMigrationStateResponse) GetId() string { if x != nil { - return x.Policy + return x.Id } - return nil + return "" } -type NodeGroupCheckpointStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - State NodeGroupCheckpointState `protobuf:"varint,1,opt,name=state,proto3,enum=api.v1.NodeGroupCheckpointState" json:"state,omitempty"` - // Associated node policy (empty when NOT_DZ_MANAGED). - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` - // For scope disclosure on the CTA: all node pool names this policy compiles - // to / clusters it targets — toggling the label affects all of them. - SharedNodePoolNames []string `protobuf:"bytes,4,rep,name=shared_node_pool_names,json=sharedNodePoolNames,proto3" json:"shared_node_pool_names,omitempty"` - SharedClusterIds []string `protobuf:"bytes,5,rep,name=shared_cluster_ids,json=sharedClusterIds,proto3" json:"shared_cluster_ids,omitempty"` -} - -func (x *NodeGroupCheckpointStatus) Reset() { - *x = NodeGroupCheckpointStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[202] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NodeGroupCheckpointStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NodeGroupCheckpointStatus) ProtoMessage() {} - -func (x *NodeGroupCheckpointStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[202] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GetMigrationStateResponse) GetClusterId() string { + if x != nil { + return x.ClusterId } - return mi.MessageOf(x) -} - -// Deprecated: Use NodeGroupCheckpointStatus.ProtoReflect.Descriptor instead. -func (*NodeGroupCheckpointStatus) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{202} + return "" } -func (x *NodeGroupCheckpointStatus) GetState() NodeGroupCheckpointState { +func (x *GetMigrationStateResponse) GetStatus() string { if x != nil { - return x.State + return x.Status } - return NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED + return "" } -func (x *NodeGroupCheckpointStatus) GetPolicyId() string { +func (x *GetMigrationStateResponse) GetCurrentStep() int32 { if x != nil { - return x.PolicyId + return x.CurrentStep } - return "" + return 0 } -func (x *NodeGroupCheckpointStatus) GetPolicyName() string { +func (x *GetMigrationStateResponse) GetStateJson() string { if x != nil { - return x.PolicyName + return x.StateJson } return "" } -func (x *NodeGroupCheckpointStatus) GetSharedNodePoolNames() []string { +func (x *GetMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.SharedNodePoolNames + return x.CreatedAt } return nil } -func (x *NodeGroupCheckpointStatus) GetSharedClusterIds() []string { +func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.SharedClusterIds + return x.UpdatedAt } return nil } -type GetNodeGroupsCheckpointStatusRequest struct { +type UpdateMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` } -func (x *GetNodeGroupsCheckpointStatusRequest) Reset() { - *x = GetNodeGroupsCheckpointStatusRequest{} +func (x *UpdateMigrationStateRequest) Reset() { + *x = UpdateMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[203] + mi := &file_api_v1_recommendation_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsCheckpointStatusRequest) String() string { +func (x *UpdateMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsCheckpointStatusRequest) ProtoMessage() {} +func (*UpdateMigrationStateRequest) ProtoMessage() {} -func (x *GetNodeGroupsCheckpointStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[203] +func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[217] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16850,51 +19977,71 @@ func (x *GetNodeGroupsCheckpointStatusRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsCheckpointStatusRequest.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsCheckpointStatusRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{203} +// Deprecated: Use UpdateMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{217} } -func (x *GetNodeGroupsCheckpointStatusRequest) GetTeamId() string { +func (x *UpdateMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetNodeGroupsCheckpointStatusRequest) GetClusterId() string { +func (x *UpdateMigrationStateRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -type GetNodeGroupsCheckpointStatusResponse struct { +func (x *UpdateMigrationStateRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *UpdateMigrationStateRequest) GetCurrentStep() int32 { + if x != nil { + return x.CurrentStep + } + return 0 +} + +func (x *UpdateMigrationStateRequest) GetStateJson() string { + if x != nil { + return x.StateJson + } + return "" +} + +type UpdateMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Keyed by node group name. - ByNodeGroup map[string]*NodeGroupCheckpointStatus `protobuf:"bytes,1,rep,name=by_node_group,json=byNodeGroup,proto3" json:"by_node_group,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *GetNodeGroupsCheckpointStatusResponse) Reset() { - *x = GetNodeGroupsCheckpointStatusResponse{} +func (x *UpdateMigrationStateResponse) Reset() { + *x = UpdateMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[204] + mi := &file_api_v1_recommendation_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeGroupsCheckpointStatusResponse) String() string { +func (x *UpdateMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeGroupsCheckpointStatusResponse) ProtoMessage() {} +func (*UpdateMigrationStateResponse) ProtoMessage() {} -func (x *GetNodeGroupsCheckpointStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[204] +func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[218] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16905,46 +20052,45 @@ func (x *GetNodeGroupsCheckpointStatusResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetNodeGroupsCheckpointStatusResponse.ProtoReflect.Descriptor instead. -func (*GetNodeGroupsCheckpointStatusResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{204} +// Deprecated: Use UpdateMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{218} } -func (x *GetNodeGroupsCheckpointStatusResponse) GetByNodeGroup() map[string]*NodeGroupCheckpointStatus { +func (x *UpdateMigrationStateResponse) GetId() string { if x != nil { - return x.ByNodeGroup + return x.Id } - return nil + return "" } -type SetNodePolicyCheckpointLabelRequest struct { +// Karpenter migration wizard +type GetKarpenterMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - // true adds dakr.devzero.io/checkpoint-node=true; false removes the key. - Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *SetNodePolicyCheckpointLabelRequest) Reset() { - *x = SetNodePolicyCheckpointLabelRequest{} +func (x *GetKarpenterMigrationStateRequest) Reset() { + *x = GetKarpenterMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[205] + mi := &file_api_v1_recommendation_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SetNodePolicyCheckpointLabelRequest) String() string { +func (x *GetKarpenterMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetNodePolicyCheckpointLabelRequest) ProtoMessage() {} +func (*GetKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *SetNodePolicyCheckpointLabelRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[205] +func (x *GetKarpenterMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[219] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16955,57 +20101,56 @@ func (x *SetNodePolicyCheckpointLabelRequest) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use SetNodePolicyCheckpointLabelRequest.ProtoReflect.Descriptor instead. -func (*SetNodePolicyCheckpointLabelRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{205} +// Deprecated: Use GetKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{219} } -func (x *SetNodePolicyCheckpointLabelRequest) GetTeamId() string { +func (x *GetKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *SetNodePolicyCheckpointLabelRequest) GetPolicyId() string { +func (x *GetKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.PolicyId + return x.ClusterId } return "" } -func (x *SetNodePolicyCheckpointLabelRequest) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -type SetNodePolicyCheckpointLabelResponse struct { +type GetKarpenterMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *SetNodePolicyCheckpointLabelResponse) Reset() { - *x = SetNodePolicyCheckpointLabelResponse{} +func (x *GetKarpenterMigrationStateResponse) Reset() { + *x = GetKarpenterMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[206] + mi := &file_api_v1_recommendation_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SetNodePolicyCheckpointLabelResponse) String() string { +func (x *GetKarpenterMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SetNodePolicyCheckpointLabelResponse) ProtoMessage() {} +func (*GetKarpenterMigrationStateResponse) ProtoMessage() {} -func (x *SetNodePolicyCheckpointLabelResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[206] +func (x *GetKarpenterMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[220] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17016,44 +20161,89 @@ func (x *SetNodePolicyCheckpointLabelResponse) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use SetNodePolicyCheckpointLabelResponse.ProtoReflect.Descriptor instead. -func (*SetNodePolicyCheckpointLabelResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{206} +// Deprecated: Use GetKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{220} } -func (x *SetNodePolicyCheckpointLabelResponse) GetSuccess() bool { +func (x *GetKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.Success + return x.Id } - return false + return "" } -type DeleteNodePolicyRequest struct { +func (x *GetKarpenterMigrationStateResponse) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetKarpenterMigrationStateResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *GetKarpenterMigrationStateResponse) GetCurrentStep() int32 { + if x != nil { + return x.CurrentStep + } + return 0 +} + +func (x *GetKarpenterMigrationStateResponse) GetStateJson() string { + if x != nil { + return x.StateJson + } + return "" +} + +func (x *GetKarpenterMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *GetKarpenterMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type UpdateKarpenterMigrationStateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + CurrentStep int32 `protobuf:"varint,4,opt,name=current_step,json=currentStep,proto3" json:"current_step,omitempty"` + StateJson string `protobuf:"bytes,5,opt,name=state_json,json=stateJson,proto3" json:"state_json,omitempty"` } -func (x *DeleteNodePolicyRequest) Reset() { - *x = DeleteNodePolicyRequest{} +func (x *UpdateKarpenterMigrationStateRequest) Reset() { + *x = UpdateKarpenterMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[207] + mi := &file_api_v1_recommendation_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyRequest) String() string { +func (x *UpdateKarpenterMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyRequest) ProtoMessage() {} +func (*UpdateKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[207] +func (x *UpdateKarpenterMigrationStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[221] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17064,52 +20254,71 @@ func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteNodePolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteNodePolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{207} +// Deprecated: Use UpdateKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} } -func (x *DeleteNodePolicyRequest) GetTeamId() string { +func (x *UpdateKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *DeleteNodePolicyRequest) GetPolicyId() string { +func (x *UpdateKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.PolicyId + return x.ClusterId } return "" } -type DeleteNodePolicyResponse struct { +func (x *UpdateKarpenterMigrationStateRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *UpdateKarpenterMigrationStateRequest) GetCurrentStep() int32 { + if x != nil { + return x.CurrentStep + } + return 0 +} + +func (x *UpdateKarpenterMigrationStateRequest) GetStateJson() string { + if x != nil { + return x.StateJson + } + return "" +} + +type UpdateKarpenterMigrationStateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - // Number of NodePolicyTargets that were cascade-deleted along with the policy. - DeletedTargetCount int32 `protobuf:"varint,2,opt,name=deleted_target_count,json=deletedTargetCount,proto3" json:"deleted_target_count,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *DeleteNodePolicyResponse) Reset() { - *x = DeleteNodePolicyResponse{} +func (x *UpdateKarpenterMigrationStateResponse) Reset() { + *x = UpdateKarpenterMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[208] + mi := &file_api_v1_recommendation_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyResponse) String() string { +func (x *UpdateKarpenterMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyResponse) ProtoMessage() {} +func (*UpdateKarpenterMigrationStateResponse) ProtoMessage() {} -func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[208] +func (x *UpdateKarpenterMigrationStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[222] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17120,109 +20329,49 @@ func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteNodePolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteNodePolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{208} -} - -func (x *DeleteNodePolicyResponse) GetSuccess() bool { - if x != nil { - return x.Success - } - return false +// Deprecated: Use UpdateKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} } -func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { +func (x *UpdateKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.DeletedTargetCount + return x.Id } - return 0 + return "" } -type NodePolicy struct { +type KarpenterOwnershipConflict struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Cross-cloud core - InstanceCategories *LabelSelector `protobuf:"bytes,10,opt,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` // abstract, per-cloud mapping; UI: Family; e.g., D (Azure), m (AWS) - InstanceFamilies *LabelSelector `protobuf:"bytes,11,opt,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` // abstract, per-cloud mapping (c5, m5d, r4, etc) - InstanceCpus *LabelSelector `protobuf:"bytes,12,opt,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` // cpu count in cores (4, 8, 1, 2, etc) - InstanceHypervisors *LabelSelector `protobuf:"bytes,13,opt,name=instance_hypervisors,json=instanceHypervisors,proto3" json:"instance_hypervisors,omitempty"` // self explanatory - InstanceGenerations *LabelSelector `protobuf:"bytes,14,opt,name=instance_generations,json=instanceGenerations,proto3" json:"instance_generations,omitempty"` // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) - InstanceSizes *LabelSelector `protobuf:"bytes,15,opt,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` // UI: Size; eg: Standard_D4s (Azure), large (AWS) - InstanceTypes *LabelSelector `protobuf:"bytes,16,opt,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) - // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per - // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this - // field is silently dropped on the compile path for those providers. - InstanceLocalNvme *LabelSelector `protobuf:"bytes,113,opt,name=instance_local_nvme,json=instanceLocalNvme,proto3" json:"instance_local_nvme,omitempty"` - InstanceCategoriesTip *string `protobuf:"bytes,26,opt,name=instance_categories_tip,json=instanceCategoriesTip,proto3,oneof" json:"instance_categories_tip,omitempty"` - InstanceFamiliesTip *string `protobuf:"bytes,27,opt,name=instance_families_tip,json=instanceFamiliesTip,proto3,oneof" json:"instance_families_tip,omitempty"` - InstanceCpusTip *string `protobuf:"bytes,28,opt,name=instance_cpus_tip,json=instanceCpusTip,proto3,oneof" json:"instance_cpus_tip,omitempty"` - InstanceHypervisorsTip *string `protobuf:"bytes,29,opt,name=instance_hypervisors_tip,json=instanceHypervisorsTip,proto3,oneof" json:"instance_hypervisors_tip,omitempty"` - InstanceGenerationsTip *string `protobuf:"bytes,30,opt,name=instance_generations_tip,json=instanceGenerationsTip,proto3,oneof" json:"instance_generations_tip,omitempty"` - InstanceSizesTip *string `protobuf:"bytes,31,opt,name=instance_sizes_tip,json=instanceSizesTip,proto3,oneof" json:"instance_sizes_tip,omitempty"` - InstanceLocalNvmeTip *string `protobuf:"bytes,114,opt,name=instance_local_nvme_tip,json=instanceLocalNvmeTip,proto3,oneof" json:"instance_local_nvme_tip,omitempty"` - Zones *LabelSelector `protobuf:"bytes,36,opt,name=zones,proto3" json:"zones,omitempty"` // abstract, per-cloud mapping - Architectures *LabelSelector `protobuf:"bytes,37,opt,name=architectures,proto3" json:"architectures,omitempty"` // amd64, arm64 - CapacityTypes *LabelSelector `protobuf:"bytes,38,opt,name=capacity_types,json=capacityTypes,proto3" json:"capacity_types,omitempty"` // spot, on-demand, reserved - OperatingSystems *LabelSelector `protobuf:"bytes,39,opt,name=operating_systems,json=operatingSystems,proto3" json:"operating_systems,omitempty"` // linux, windows - Weight int32 `protobuf:"varint,40,opt,name=weight,proto3" json:"weight,omitempty"` - ZonesTip *string `protobuf:"bytes,45,opt,name=zones_tip,json=zonesTip,proto3,oneof" json:"zones_tip,omitempty"` - ArchitecturesTip *string `protobuf:"bytes,46,opt,name=architectures_tip,json=architecturesTip,proto3,oneof" json:"architectures_tip,omitempty"` - CapacityTypeTip *string `protobuf:"bytes,47,opt,name=capacity_type_tip,json=capacityTypeTip,proto3,oneof" json:"capacity_type_tip,omitempty"` - OperatingSystemsTip *string `protobuf:"bytes,48,opt,name=operating_systems_tip,json=operatingSystemsTip,proto3,oneof" json:"operating_systems_tip,omitempty"` - Labels map[string]string `protobuf:"bytes,51,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Taints []*Taint `protobuf:"bytes,52,rep,name=taints,proto3" json:"taints,omitempty"` - Disruption *DisruptionPolicy `protobuf:"bytes,53,opt,name=disruption,proto3" json:"disruption,omitempty"` - Limits *ResourceLimits `protobuf:"bytes,54,opt,name=limits,proto3" json:"limits,omitempty"` - StartupTaints []*Taint `protobuf:"bytes,55,rep,name=startup_taints,json=startupTaints,proto3" json:"startup_taints,omitempty"` - TaintsTip *string `protobuf:"bytes,57,opt,name=taints_tip,json=taintsTip,proto3,oneof" json:"taints_tip,omitempty"` - DisruptionsTip *string `protobuf:"bytes,58,opt,name=disruptions_tip,json=disruptionsTip,proto3,oneof" json:"disruptions_tip,omitempty"` - LimitsTip *string `protobuf:"bytes,59,opt,name=limits_tip,json=limitsTip,proto3,oneof" json:"limits_tip,omitempty"` - StartupTaintsTip *string `protobuf:"bytes,60,opt,name=startup_taints_tip,json=startupTaintsTip,proto3,oneof" json:"startup_taints_tip,omitempty"` - MasterOverrideRoleName string `protobuf:"bytes,61,opt,name=master_override_role_name,json=masterOverrideRoleName,proto3" json:"master_override_role_name,omitempty"` - NodePoolName string `protobuf:"bytes,71,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` - NodeClassName string `protobuf:"bytes,72,opt,name=node_class_name,json=nodeClassName,proto3" json:"node_class_name,omitempty"` - // Provider-specific overrides - Aws *AWSNodeClassSpec `protobuf:"bytes,81,opt,name=aws,proto3" json:"aws,omitempty"` - Gcp *GCPNodeClassSpec `protobuf:"bytes,82,opt,name=gcp,proto3" json:"gcp,omitempty"` - Azure *AzureNodeClassSpec `protobuf:"bytes,83,opt,name=azure,proto3" json:"azure,omitempty"` - Oci *OCINodeClassSpec `protobuf:"bytes,84,opt,name=oci,proto3" json:"oci,omitempty"` - CloudProviderId *int64 `protobuf:"varint,85,opt,name=cloud_provider_id,json=cloudProviderId,proto3,oneof" json:"cloud_provider_id,omitempty"` - CloudProvider *CloudProvider `protobuf:"bytes,86,opt,name=cloud_provider,json=cloudProvider,proto3" json:"cloud_provider,omitempty"` - // Cloud-agnostic opt-in for AZ outage handling (AWS ARC zonal shift today; - // analogous GCP behavior planned). The compile step translates this to - // provider-specific annotations on the Karpenter NodePool. - ZonalShift *ZonalShiftConfig `protobuf:"bytes,90,opt,name=zonal_shift,json=zonalShift,proto3" json:"zonal_shift,omitempty"` - // Raw escape hatch for node pool - Raw []*RawKarpenterSpec `protobuf:"bytes,100,rep,name=raw,proto3" json:"raw,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ResourceKind string `protobuf:"bytes,2,opt,name=resource_kind,json=resourceKind,proto3" json:"resource_kind,omitempty"` + ResourceName string `protobuf:"bytes,3,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + OwnerTool string `protobuf:"bytes,4,opt,name=owner_tool,json=ownerTool,proto3" json:"owner_tool,omitempty"` + DetectedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=detected_at,json=detectedAt,proto3" json:"detected_at,omitempty"` + AcknowledgedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=acknowledged_at,json=acknowledgedAt,proto3" json:"acknowledged_at,omitempty"` // unset if not yet acknowledged + AcknowledgedBy string `protobuf:"bytes,7,opt,name=acknowledged_by,json=acknowledgedBy,proto3" json:"acknowledged_by,omitempty"` } -func (x *NodePolicy) Reset() { - *x = NodePolicy{} +func (x *KarpenterOwnershipConflict) Reset() { + *x = KarpenterOwnershipConflict{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[209] + mi := &file_api_v1_recommendation_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicy) String() string { +func (x *KarpenterOwnershipConflict) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicy) ProtoMessage() {} +func (*KarpenterOwnershipConflict) ProtoMessage() {} -func (x *NodePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[209] +func (x *KarpenterOwnershipConflict) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[223] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17233,396 +20382,527 @@ func (x *NodePolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicy.ProtoReflect.Descriptor instead. -func (*NodePolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{209} +// Deprecated: Use KarpenterOwnershipConflict.ProtoReflect.Descriptor instead. +func (*KarpenterOwnershipConflict) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{223} } -func (x *NodePolicy) GetId() string { +func (x *KarpenterOwnershipConflict) GetId() string { if x != nil { return x.Id } return "" } -func (x *NodePolicy) GetName() string { +func (x *KarpenterOwnershipConflict) GetResourceKind() string { if x != nil { - return x.Name + return x.ResourceKind } return "" } -func (x *NodePolicy) GetDescription() string { +func (x *KarpenterOwnershipConflict) GetResourceName() string { if x != nil { - return x.Description + return x.ResourceName } return "" } -func (x *NodePolicy) GetTeamId() string { +func (x *KarpenterOwnershipConflict) GetOwnerTool() string { if x != nil { - return x.TeamId + return x.OwnerTool } return "" } -func (x *NodePolicy) GetInstanceCategories() *LabelSelector { +func (x *KarpenterOwnershipConflict) GetDetectedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceCategories + return x.DetectedAt } return nil } -func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { +func (x *KarpenterOwnershipConflict) GetAcknowledgedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceFamilies + return x.AcknowledgedAt } return nil } -func (x *NodePolicy) GetInstanceCpus() *LabelSelector { +func (x *KarpenterOwnershipConflict) GetAcknowledgedBy() string { if x != nil { - return x.InstanceCpus + return x.AcknowledgedBy } - return nil + return "" } -func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { - if x != nil { - return x.InstanceHypervisors - } - return nil +type DetectKarpenterOwnershipConflictsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { - if x != nil { - return x.InstanceGenerations +func (x *DetectKarpenterOwnershipConflictsRequest) Reset() { + *x = DetectKarpenterOwnershipConflictsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[224] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetInstanceSizes() *LabelSelector { - if x != nil { - return x.InstanceSizes - } - return nil +func (x *DetectKarpenterOwnershipConflictsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceTypes() *LabelSelector { - if x != nil { - return x.InstanceTypes +func (*DetectKarpenterOwnershipConflictsRequest) ProtoMessage() {} + +func (x *DetectKarpenterOwnershipConflictsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[224] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { - if x != nil { - return x.InstanceLocalNvme - } - return nil +// Deprecated: Use DetectKarpenterOwnershipConflictsRequest.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{224} } -func (x *NodePolicy) GetInstanceCategoriesTip() string { - if x != nil && x.InstanceCategoriesTip != nil { - return *x.InstanceCategoriesTip +func (x *DetectKarpenterOwnershipConflictsRequest) GetTeamId() string { + if x != nil { + return x.TeamId } return "" } -func (x *NodePolicy) GetInstanceFamiliesTip() string { - if x != nil && x.InstanceFamiliesTip != nil { - return *x.InstanceFamiliesTip +func (x *DetectKarpenterOwnershipConflictsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId } return "" } -func (x *NodePolicy) GetInstanceCpusTip() string { - if x != nil && x.InstanceCpusTip != nil { - return *x.InstanceCpusTip - } - return "" +type DetectKarpenterOwnershipConflictsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Conflicts []*KarpenterOwnershipConflict `protobuf:"bytes,1,rep,name=conflicts,proto3" json:"conflicts,omitempty"` // includes previously-acknowledged ones so the UI can show history + AlreadyDevZeroManaged bool `protobuf:"varint,2,opt,name=already_dev_zero_managed,json=alreadyDevZeroManaged,proto3" json:"already_dev_zero_managed,omitempty"` // true if karpDeployment.IsDevZeroManaged() — short-circuit signal for Detect step } -func (x *NodePolicy) GetInstanceHypervisorsTip() string { - if x != nil && x.InstanceHypervisorsTip != nil { - return *x.InstanceHypervisorsTip +func (x *DetectKarpenterOwnershipConflictsResponse) Reset() { + *x = DetectKarpenterOwnershipConflictsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[225] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetInstanceGenerationsTip() string { - if x != nil && x.InstanceGenerationsTip != nil { - return *x.InstanceGenerationsTip - } - return "" +func (x *DetectKarpenterOwnershipConflictsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceSizesTip() string { - if x != nil && x.InstanceSizesTip != nil { - return *x.InstanceSizesTip +func (*DetectKarpenterOwnershipConflictsResponse) ProtoMessage() {} + +func (x *DetectKarpenterOwnershipConflictsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[225] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetInstanceLocalNvmeTip() string { - if x != nil && x.InstanceLocalNvmeTip != nil { - return *x.InstanceLocalNvmeTip - } - return "" +// Deprecated: Use DetectKarpenterOwnershipConflictsResponse.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} } -func (x *NodePolicy) GetZones() *LabelSelector { +func (x *DetectKarpenterOwnershipConflictsResponse) GetConflicts() []*KarpenterOwnershipConflict { if x != nil { - return x.Zones + return x.Conflicts } return nil } -func (x *NodePolicy) GetArchitectures() *LabelSelector { +func (x *DetectKarpenterOwnershipConflictsResponse) GetAlreadyDevZeroManaged() bool { if x != nil { - return x.Architectures + return x.AlreadyDevZeroManaged } - return nil + return false } -func (x *NodePolicy) GetCapacityTypes() *LabelSelector { - if x != nil { - return x.CapacityTypes - } - return nil +type AcknowledgeKarpenterOwnershipConflictRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ConflictId string `protobuf:"bytes,2,opt,name=conflict_id,json=conflictId,proto3" json:"conflict_id,omitempty"` + AcknowledgedBy string `protobuf:"bytes,3,opt,name=acknowledged_by,json=acknowledgedBy,proto3" json:"acknowledged_by,omitempty"` } -func (x *NodePolicy) GetOperatingSystems() *LabelSelector { - if x != nil { - return x.OperatingSystems +func (x *AcknowledgeKarpenterOwnershipConflictRequest) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[226] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetWeight() int32 { - if x != nil { - return x.Weight - } - return 0 +func (x *AcknowledgeKarpenterOwnershipConflictRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetZonesTip() string { - if x != nil && x.ZonesTip != nil { - return *x.ZonesTip +func (*AcknowledgeKarpenterOwnershipConflictRequest) ProtoMessage() {} + +func (x *AcknowledgeKarpenterOwnershipConflictRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[226] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetArchitecturesTip() string { - if x != nil && x.ArchitecturesTip != nil { - return *x.ArchitecturesTip - } - return "" +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictRequest.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} } -func (x *NodePolicy) GetCapacityTypeTip() string { - if x != nil && x.CapacityTypeTip != nil { - return *x.CapacityTypeTip +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetTeamId() string { + if x != nil { + return x.TeamId } return "" } -func (x *NodePolicy) GetOperatingSystemsTip() string { - if x != nil && x.OperatingSystemsTip != nil { - return *x.OperatingSystemsTip +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetConflictId() string { + if x != nil { + return x.ConflictId } return "" } -func (x *NodePolicy) GetLabels() map[string]string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetAcknowledgedBy() string { if x != nil { - return x.Labels + return x.AcknowledgedBy } - return nil + return "" } -func (x *NodePolicy) GetTaints() []*Taint { - if x != nil { - return x.Taints - } - return nil +type AcknowledgeKarpenterOwnershipConflictResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *NodePolicy) GetDisruption() *DisruptionPolicy { - if x != nil { - return x.Disruption +func (x *AcknowledgeKarpenterOwnershipConflictResponse) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[227] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetLimits() *ResourceLimits { - if x != nil { - return x.Limits - } - return nil +func (x *AcknowledgeKarpenterOwnershipConflictResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetStartupTaints() []*Taint { - if x != nil { - return x.StartupTaints +func (*AcknowledgeKarpenterOwnershipConflictResponse) ProtoMessage() {} + +func (x *AcknowledgeKarpenterOwnershipConflictResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[227] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetTaintsTip() string { - if x != nil && x.TaintsTip != nil { - return *x.TaintsTip - } - return "" +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictResponse.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} } -func (x *NodePolicy) GetDisruptionsTip() string { - if x != nil && x.DisruptionsTip != nil { - return *x.DisruptionsTip +func (x *AcknowledgeKarpenterOwnershipConflictResponse) GetId() string { + if x != nil { + return x.Id } return "" } -func (x *NodePolicy) GetLimitsTip() string { - if x != nil && x.LimitsTip != nil { - return *x.LimitsTip +type KarpenterSourceResource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` // "NodePool" | "EC2NodeClass" | "AKSNodeClass" | "GCENodeClass" + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Yaml string `protobuf:"bytes,3,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *KarpenterSourceResource) Reset() { + *x = KarpenterSourceResource{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[228] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetStartupTaintsTip() string { - if x != nil && x.StartupTaintsTip != nil { - return *x.StartupTaintsTip +func (x *KarpenterSourceResource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KarpenterSourceResource) ProtoMessage() {} + +func (x *KarpenterSourceResource) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[228] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetMasterOverrideRoleName() string { +// Deprecated: Use KarpenterSourceResource.ProtoReflect.Descriptor instead. +func (*KarpenterSourceResource) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} +} + +func (x *KarpenterSourceResource) GetKind() string { if x != nil { - return x.MasterOverrideRoleName + return x.Kind } return "" } -func (x *NodePolicy) GetNodePoolName() string { +func (x *KarpenterSourceResource) GetName() string { if x != nil { - return x.NodePoolName + return x.Name } return "" } -func (x *NodePolicy) GetNodeClassName() string { +func (x *KarpenterSourceResource) GetYaml() string { if x != nil { - return x.NodeClassName + return x.Yaml } return "" } -func (x *NodePolicy) GetAws() *AWSNodeClassSpec { - if x != nil { - return x.Aws +type GetKarpenterSourceResourcesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *GetKarpenterSourceResourcesRequest) Reset() { + *x = GetKarpenterSourceResourcesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[229] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { - if x != nil { - return x.Gcp +func (x *GetKarpenterSourceResourcesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetKarpenterSourceResourcesRequest) ProtoMessage() {} + +func (x *GetKarpenterSourceResourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[229] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { +// Deprecated: Use GetKarpenterSourceResourcesRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterSourceResourcesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{229} +} + +func (x *GetKarpenterSourceResourcesRequest) GetTeamId() string { if x != nil { - return x.Azure + return x.TeamId } - return nil + return "" } -func (x *NodePolicy) GetOci() *OCINodeClassSpec { +func (x *GetKarpenterSourceResourcesRequest) GetClusterId() string { if x != nil { - return x.Oci + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetCloudProviderId() int64 { - if x != nil && x.CloudProviderId != nil { - return *x.CloudProviderId +type GetKarpenterSourceResourcesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resources []*KarpenterSourceResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` +} + +func (x *GetKarpenterSourceResourcesResponse) Reset() { + *x = GetKarpenterSourceResourcesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[230] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *NodePolicy) GetCloudProvider() *CloudProvider { - if x != nil { - return x.CloudProvider +func (x *GetKarpenterSourceResourcesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetKarpenterSourceResourcesResponse) ProtoMessage() {} + +func (x *GetKarpenterSourceResourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[230] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { +// Deprecated: Use GetKarpenterSourceResourcesResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterSourceResourcesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} +} + +func (x *GetKarpenterSourceResourcesResponse) GetResources() []*KarpenterSourceResource { if x != nil { - return x.ZonalShift + return x.Resources } return nil } -func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { - if x != nil { - return x.Raw +type NodePoolAdoptionStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodePoolName string `protobuf:"bytes,1,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + Ready bool `protobuf:"varint,2,opt,name=ready,proto3" json:"ready,omitempty"` +} + +func (x *NodePoolAdoptionStatus) Reset() { + *x = NodePoolAdoptionStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[231] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *NodePoolAdoptionStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodePoolAdoptionStatus) ProtoMessage() {} + +func (x *NodePoolAdoptionStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[231] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetUpdatedAt() *timestamppb.Timestamp { +// Deprecated: Use NodePoolAdoptionStatus.ProtoReflect.Descriptor instead. +func (*NodePoolAdoptionStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} +} + +func (x *NodePoolAdoptionStatus) GetNodePoolName() string { if x != nil { - return x.UpdatedAt + return x.NodePoolName } - return nil + return "" } -func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { +func (x *NodePoolAdoptionStatus) GetReady() bool { if x != nil { - return x.DeletedAt + return x.Ready } - return nil + return false } -type PreviewNodeRecommendationConfigRequest struct { +type GetKarpenterAdoptionStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Policies []*NodePolicy `protobuf:"bytes,6,rep,name=policies,proto3" json:"policies,omitempty"` - PolicyIds []string `protobuf:"bytes,11,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // if set, `repeated NodePolicy policies = 6;` is ignored + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodePoolNames []string `protobuf:"bytes,3,rep,name=node_pool_names,json=nodePoolNames,proto3" json:"node_pool_names,omitempty"` } -func (x *PreviewNodeRecommendationConfigRequest) Reset() { - *x = PreviewNodeRecommendationConfigRequest{} +func (x *GetKarpenterAdoptionStatusRequest) Reset() { + *x = GetKarpenterAdoptionStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[210] + mi := &file_api_v1_recommendation_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigRequest) String() string { +func (x *GetKarpenterAdoptionStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusRequest) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[210] +func (x *GetKarpenterAdoptionStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[232] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17633,64 +20913,57 @@ func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use PreviewNodeRecommendationConfigRequest.ProtoReflect.Descriptor instead. -func (*PreviewNodeRecommendationConfigRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{210} +// Deprecated: Use GetKarpenterAdoptionStatusRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} } -func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { +func (x *GetKarpenterAdoptionStatusRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { +func (x *GetKarpenterAdoptionStatusRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { +func (x *GetKarpenterAdoptionStatusRequest) GetNodePoolNames() []string { if x != nil { - return x.PolicyIds + return x.NodePoolNames } return nil } -type PreviewNodeRecommendationConfigResponse struct { +type GetKarpenterAdoptionStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` + Statuses []*NodePoolAdoptionStatus `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty"` } -func (x *PreviewNodeRecommendationConfigResponse) Reset() { - *x = PreviewNodeRecommendationConfigResponse{} +func (x *GetKarpenterAdoptionStatusResponse) Reset() { + *x = GetKarpenterAdoptionStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[211] + mi := &file_api_v1_recommendation_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigResponse) String() string { +func (x *GetKarpenterAdoptionStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusResponse) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[211] +func (x *GetKarpenterAdoptionStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[233] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17701,51 +20974,49 @@ func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use PreviewNodeRecommendationConfigResponse.ProtoReflect.Descriptor instead. -func (*PreviewNodeRecommendationConfigResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{211} +// Deprecated: Use GetKarpenterAdoptionStatusResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{233} } -func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { +func (x *GetKarpenterAdoptionStatusResponse) GetStatuses() []*NodePoolAdoptionStatus { if x != nil { - return x.Nrc + return x.Statuses } return nil } -type NodeRecommendationConfig struct { +// NodePool validation +type ReportNodePoolValidationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PolicyContainersJson string `protobuf:"bytes,6,opt,name=policy_containers_json,json=policyContainersJson,proto3" json:"policy_containers_json,omitempty"` - PolicyContainersYaml string `protobuf:"bytes,7,opt,name=policy_containers_yaml,json=policyContainersYaml,proto3" json:"policy_containers_yaml,omitempty"` - Status RecommendationStatus `protobuf:"varint,11,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` - Error string `protobuf:"bytes,12,opt,name=error,proto3" json:"error,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodepoolName string `protobuf:"bytes,2,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` + NodeName string `protobuf:"bytes,3,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + InstanceType string `protobuf:"bytes,4,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + Zone string `protobuf:"bytes,5,opt,name=zone,proto3" json:"zone,omitempty"` + TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *NodeRecommendationConfig) Reset() { - *x = NodeRecommendationConfig{} +func (x *ReportNodePoolValidationRequest) Reset() { + *x = ReportNodePoolValidationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[212] + mi := &file_api_v1_recommendation_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeRecommendationConfig) String() string { +func (x *ReportNodePoolValidationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendationConfig) ProtoMessage() {} +func (*ReportNodePoolValidationRequest) ProtoMessage() {} -func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[212] +func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[234] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17756,100 +21027,76 @@ func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeRecommendationConfig.ProtoReflect.Descriptor instead. -func (*NodeRecommendationConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{212} -} - -func (x *NodeRecommendationConfig) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use ReportNodePoolValidationRequest.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{234} } -func (x *NodeRecommendationConfig) GetClusterId() string { +func (x *ReportNodePoolValidationRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { +func (x *ReportNodePoolValidationRequest) GetNodepoolName() string { if x != nil { - return x.PolicyContainersJson + return x.NodepoolName } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { +func (x *ReportNodePoolValidationRequest) GetNodeName() string { if x != nil { - return x.PolicyContainersYaml + return x.NodeName } return "" } -func (x *NodeRecommendationConfig) GetStatus() RecommendationStatus { - if x != nil { - return x.Status - } - return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED -} - -func (x *NodeRecommendationConfig) GetError() string { +func (x *ReportNodePoolValidationRequest) GetInstanceType() string { if x != nil { - return x.Error + return x.InstanceType } return "" } -func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { +func (x *ReportNodePoolValidationRequest) GetZone() string { if x != nil { - return x.UpdatedAt + return x.Zone } - return nil + return "" } -func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { +func (x *ReportNodePoolValidationRequest) GetTeamId() string { if x != nil { - return x.DeletedAt + return x.TeamId } - return nil + return "" } -type SuggestedKarpenterConfigRequest struct { +type ReportNodePoolValidationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *SuggestedKarpenterConfigRequest) Reset() { - *x = SuggestedKarpenterConfigRequest{} +func (x *ReportNodePoolValidationResponse) Reset() { + *x = ReportNodePoolValidationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[213] + mi := &file_api_v1_recommendation_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigRequest) String() string { +func (x *ReportNodePoolValidationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} +func (*ReportNodePoolValidationResponse) ProtoMessage() {} -func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[213] +func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[235] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17860,51 +21107,37 @@ func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedKarpenterConfigRequest.ProtoReflect.Descriptor instead. -func (*SuggestedKarpenterConfigRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{213} -} - -func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use ReportNodePoolValidationResponse.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{235} } -type SuggestedKarpenterConfigResponse struct { +type GetNodePoolValidationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NgToOriginal map[string]*NodeRecommendationConfig `protobuf:"bytes,1,rep,name=ng_to_original,json=ngToOriginal,proto3" json:"ng_to_original,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NgToSuggested map[string]*NodeRecommendationConfig `protobuf:"bytes,11,rep,name=ng_to_suggested,json=ngToSuggested,proto3" json:"ng_to_suggested,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *SuggestedKarpenterConfigResponse) Reset() { - *x = SuggestedKarpenterConfigResponse{} +func (x *GetNodePoolValidationsRequest) Reset() { + *x = GetNodePoolValidationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[214] + mi := &file_api_v1_recommendation_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigResponse) String() string { +func (x *GetNodePoolValidationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} +func (*GetNodePoolValidationsRequest) ProtoMessage() {} -func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[214] +func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[236] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17915,52 +21148,54 @@ func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SuggestedKarpenterConfigResponse.ProtoReflect.Descriptor instead. -func (*SuggestedKarpenterConfigResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{214} +// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} } -func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { +func (x *GetNodePoolValidationsRequest) GetClusterId() string { if x != nil { - return x.NgToOriginal + return x.ClusterId } - return nil + return "" } -func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { +func (x *GetNodePoolValidationsRequest) GetTeamId() string { if x != nil { - return x.NgToSuggested + return x.TeamId } - return nil + return "" } -type GetAvailableKindsByTargetingFiltersRequest struct { +type NodePoolValidationReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - TargetFilters *TargetFilters `protobuf:"bytes,3,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` + NodepoolName string `protobuf:"bytes,1,opt,name=nodepool_name,json=nodepoolName,proto3" json:"nodepool_name,omitempty"` + NodeName string `protobuf:"bytes,2,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + InstanceType string `protobuf:"bytes,3,opt,name=instance_type,json=instanceType,proto3" json:"instance_type,omitempty"` + Zone string `protobuf:"bytes,4,opt,name=zone,proto3" json:"zone,omitempty"` + ReportedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=reported_at,json=reportedAt,proto3" json:"reported_at,omitempty"` } -func (x *GetAvailableKindsByTargetingFiltersRequest) Reset() { - *x = GetAvailableKindsByTargetingFiltersRequest{} +func (x *NodePoolValidationReport) Reset() { + *x = NodePoolValidationReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[215] + mi := &file_api_v1_recommendation_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { +func (x *NodePoolValidationReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} +func (*NodePoolValidationReport) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[215] +func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[237] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17971,62 +21206,71 @@ func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect return mi.MessageOf(x) } -// Deprecated: Use GetAvailableKindsByTargetingFiltersRequest.ProtoReflect.Descriptor instead. -func (*GetAvailableKindsByTargetingFiltersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{215} +// Deprecated: Use NodePoolValidationReport.ProtoReflect.Descriptor instead. +func (*NodePoolValidationReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { +func (x *NodePoolValidationReport) GetNodepoolName() string { if x != nil { - return x.TeamId + return x.NodepoolName } return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { +func (x *NodePoolValidationReport) GetNodeName() string { if x != nil { - return x.ClusterIds + return x.NodeName } - return nil + return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *NodePoolValidationReport) GetInstanceType() string { if x != nil { - return x.TargetFilters + return x.InstanceType + } + return "" +} + +func (x *NodePoolValidationReport) GetZone() string { + if x != nil { + return x.Zone + } + return "" +} + +func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { + if x != nil { + return x.ReportedAt } return nil } -// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria -type SearchResourcesByTargetingFiltersRequest struct { +type GetNodePoolValidationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. - ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Unique identifiers for the clusters. - SearchQuery string `protobuf:"bytes,3,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"` // Search term to match against resources. - TargetFilterType TargetFilterType `protobuf:"varint,4,opt,name=target_filter_type,json=targetFilterType,proto3,enum=api.v1.TargetFilterType" json:"target_filter_type,omitempty"` // Type of filter to apply. - TargetFilters *TargetFilters `protobuf:"bytes,5,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` + Validations []*NodePoolValidationReport `protobuf:"bytes,1,rep,name=validations,proto3" json:"validations,omitempty"` } -func (x *SearchResourcesByTargetingFiltersRequest) Reset() { - *x = SearchResourcesByTargetingFiltersRequest{} +func (x *GetNodePoolValidationsResponse) Reset() { + *x = GetNodePoolValidationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[216] + mi := &file_api_v1_recommendation_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersRequest) String() string { +func (x *GetNodePoolValidationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} +func (*GetNodePoolValidationsResponse) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[216] +func (x *GetNodePoolValidationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[238] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18037,79 +21281,47 @@ func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use SearchResourcesByTargetingFiltersRequest.ProtoReflect.Descriptor instead. -func (*SearchResourcesByTargetingFiltersRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{216} -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds - } - return nil -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetSearchQuery() string { - if x != nil { - return x.SearchQuery - } - return "" -} - -func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilterType() TargetFilterType { - if x != nil { - return x.TargetFilterType - } - return TargetFilterType_TARGET_FILTER_TYPE_UNSPECIFIED +// Deprecated: Use GetNodePoolValidationsResponse.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{238} } -func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *GetNodePoolValidationsResponse) GetValidations() []*NodePoolValidationReport { if x != nil { - return x.TargetFilters + return x.Validations } return nil } -type TargetFilters struct { +type WorkloadCompatibilityWarning struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NamespaceNames []string `protobuf:"bytes,1,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` - // optional LabelSelector namespace_selector = 1; // Target namespaces by labels - // optional LabelSelector annotation_selector = 2; // Target workloads by annotations - WorkloadNames []string `protobuf:"bytes,2,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` - NodeGroupNames []string `protobuf:"bytes,3,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` - Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - KindFilter []K8SObjectKind `protobuf:"varint,5,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds - NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern - NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern + WorkloadName string `protobuf:"bytes,1,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + WorkloadNamespace string `protobuf:"bytes,2,opt,name=workload_namespace,json=workloadNamespace,proto3" json:"workload_namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + NodeGroup string `protobuf:"bytes,4,opt,name=node_group,json=nodeGroup,proto3" json:"node_group,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` } -func (x *TargetFilters) Reset() { - *x = TargetFilters{} +func (x *WorkloadCompatibilityWarning) Reset() { + *x = WorkloadCompatibilityWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[217] + mi := &file_api_v1_recommendation_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TargetFilters) String() string { +func (x *WorkloadCompatibilityWarning) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TargetFilters) ProtoMessage() {} +func (*WorkloadCompatibilityWarning) ProtoMessage() {} -func (x *TargetFilters) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[217] +func (x *WorkloadCompatibilityWarning) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[239] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18120,85 +21332,71 @@ func (x *TargetFilters) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TargetFilters.ProtoReflect.Descriptor instead. -func (*TargetFilters) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{217} -} - -func (x *TargetFilters) GetNamespaceNames() []string { - if x != nil { - return x.NamespaceNames - } - return nil -} - -func (x *TargetFilters) GetWorkloadNames() []string { - if x != nil { - return x.WorkloadNames - } - return nil +// Deprecated: Use WorkloadCompatibilityWarning.ProtoReflect.Descriptor instead. +func (*WorkloadCompatibilityWarning) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{239} } -func (x *TargetFilters) GetNodeGroupNames() []string { +func (x *WorkloadCompatibilityWarning) GetWorkloadName() string { if x != nil { - return x.NodeGroupNames + return x.WorkloadName } - return nil + return "" } -func (x *TargetFilters) GetLabels() []string { +func (x *WorkloadCompatibilityWarning) GetWorkloadNamespace() string { if x != nil { - return x.Labels + return x.WorkloadNamespace } - return nil + return "" } -func (x *TargetFilters) GetKindFilter() []K8SObjectKind { +func (x *WorkloadCompatibilityWarning) GetKind() string { if x != nil { - return x.KindFilter + return x.Kind } - return nil + return "" } -func (x *TargetFilters) GetNamePattern() *RegexPattern { +func (x *WorkloadCompatibilityWarning) GetNodeGroup() string { if x != nil { - return x.NamePattern + return x.NodeGroup } - return nil + return "" } -func (x *TargetFilters) GetNamespacePattern() *RegexPattern { +func (x *WorkloadCompatibilityWarning) GetReason() string { if x != nil { - return x.NamespacePattern + return x.Reason } - return nil + return "" } -type GetAvailableKindsByTargetingFiltersResponse struct { +type ListNodePoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kinds []K8SObjectKind `protobuf:"varint,1,rep,packed,name=kinds,proto3,enum=api.v1.K8SObjectKind" json:"kinds,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetAvailableKindsByTargetingFiltersResponse) Reset() { - *x = GetAvailableKindsByTargetingFiltersResponse{} +func (x *ListNodePoliciesRequest) Reset() { + *x = ListNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[218] + mi := &file_api_v1_recommendation_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { +func (x *ListNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} +func (*ListNodePoliciesRequest) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[218] +func (x *ListNodePoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[240] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18209,46 +21407,43 @@ func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflec return mi.MessageOf(x) } -// Deprecated: Use GetAvailableKindsByTargetingFiltersResponse.ProtoReflect.Descriptor instead. -func (*GetAvailableKindsByTargetingFiltersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{218} +// Deprecated: Use ListNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{240} } -func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { +func (x *ListNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.Kinds + return x.TeamId } - return nil + return "" } -type SearchResourcesByTargetingFiltersResponse struct { +type ListNodePoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespaces []*NamespaceSearchResult `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` - Workloads []*WorkloadSearchResult `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` - NodeGroups []*NodeGroupSearchResult `protobuf:"bytes,3,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` - Labels []*LabelSearchResult `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *SearchResourcesByTargetingFiltersResponse) Reset() { - *x = SearchResourcesByTargetingFiltersResponse{} +func (x *ListNodePoliciesResponse) Reset() { + *x = ListNodePoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[219] + mi := &file_api_v1_recommendation_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersResponse) String() string { +func (x *ListNodePoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} +func (*ListNodePoliciesResponse) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[219] +func (x *ListNodePoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[241] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18259,64 +21454,44 @@ func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use SearchResourcesByTargetingFiltersResponse.ProtoReflect.Descriptor instead. -func (*SearchResourcesByTargetingFiltersResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{219} -} - -func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { - if x != nil { - return x.Namespaces - } - return nil -} - -func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { - if x != nil { - return x.Workloads - } - return nil -} - -func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { - if x != nil { - return x.NodeGroups - } - return nil +// Deprecated: Use ListNodePoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{241} } -func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { +func (x *ListNodePoliciesResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.Labels + return x.Policies } return nil } -type NamespaceSearchResult struct { +type UpdateNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *NodePolicy `protobuf:"bytes,11,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *NamespaceSearchResult) Reset() { - *x = NamespaceSearchResult{} +func (x *UpdateNodePolicyRequest) Reset() { + *x = UpdateNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[220] + mi := &file_api_v1_recommendation_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NamespaceSearchResult) String() string { +func (x *UpdateNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NamespaceSearchResult) ProtoMessage() {} +func (*UpdateNodePolicyRequest) ProtoMessage() {} -func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[220] +func (x *UpdateNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[242] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18327,44 +21502,50 @@ func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NamespaceSearchResult.ProtoReflect.Descriptor instead. -func (*NamespaceSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{220} +// Deprecated: Use UpdateNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} } -func (x *NamespaceSearchResult) GetName() string { +func (x *UpdateNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -type WorkloadSearchResult struct { +func (x *UpdateNodePolicyRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *WorkloadSearchResult) Reset() { - *x = WorkloadSearchResult{} +func (x *UpdateNodePolicyResponse) Reset() { + *x = UpdateNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[221] + mi := &file_api_v1_recommendation_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadSearchResult) String() string { +func (x *UpdateNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadSearchResult) ProtoMessage() {} +func (*UpdateNodePolicyResponse) ProtoMessage() {} -func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[221] +func (x *UpdateNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[243] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18375,50 +21556,53 @@ func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadSearchResult.ProtoReflect.Descriptor instead. -func (*WorkloadSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} -} - -func (x *WorkloadSearchResult) GetKind() string { - if x != nil { - return x.Kind - } - return "" +// Deprecated: Use UpdateNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{243} } -func (x *WorkloadSearchResult) GetName() string { +func (x *UpdateNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.Name + return x.Policy } - return "" + return nil } -type NodeGroupSearchResult struct { +type NodeGroupCheckpointStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + State NodeGroupCheckpointState `protobuf:"varint,1,opt,name=state,proto3,enum=api.v1.NodeGroupCheckpointState" json:"state,omitempty"` + // Associated node policy (empty when NOT_DZ_MANAGED). + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + // For scope disclosure on the CTA: all node pool names this policy compiles + // to / clusters it targets — toggling the label affects all of them. + SharedNodePoolNames []string `protobuf:"bytes,4,rep,name=shared_node_pool_names,json=sharedNodePoolNames,proto3" json:"shared_node_pool_names,omitempty"` + SharedClusterIds []string `protobuf:"bytes,5,rep,name=shared_cluster_ids,json=sharedClusterIds,proto3" json:"shared_cluster_ids,omitempty"` + // Why this NG is in CONFIGURED (vs ENABLED). UNSPECIFIED for non-CONFIGURED + // states. + Reason CheckpointReason `protobuf:"varint,6,opt,name=reason,proto3,enum=api.v1.CheckpointReason" json:"reason,omitempty"` } -func (x *NodeGroupSearchResult) Reset() { - *x = NodeGroupSearchResult{} +func (x *NodeGroupCheckpointStatus) Reset() { + *x = NodeGroupCheckpointStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[222] + mi := &file_api_v1_recommendation_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupSearchResult) String() string { +func (x *NodeGroupCheckpointStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupSearchResult) ProtoMessage() {} +func (*NodeGroupCheckpointStatus) ProtoMessage() {} -func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[222] +func (x *NodeGroupCheckpointStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[244] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18429,44 +21613,79 @@ func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeGroupSearchResult.ProtoReflect.Descriptor instead. -func (*NodeGroupSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} +// Deprecated: Use NodeGroupCheckpointStatus.ProtoReflect.Descriptor instead. +func (*NodeGroupCheckpointStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{244} } -func (x *NodeGroupSearchResult) GetName() string { +func (x *NodeGroupCheckpointStatus) GetState() NodeGroupCheckpointState { if x != nil { - return x.Name + return x.State + } + return NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED +} + +func (x *NodeGroupCheckpointStatus) GetPolicyId() string { + if x != nil { + return x.PolicyId } return "" } -type LabelSearchResult struct { +func (x *NodeGroupCheckpointStatus) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *NodeGroupCheckpointStatus) GetSharedNodePoolNames() []string { + if x != nil { + return x.SharedNodePoolNames + } + return nil +} + +func (x *NodeGroupCheckpointStatus) GetSharedClusterIds() []string { + if x != nil { + return x.SharedClusterIds + } + return nil +} + +func (x *NodeGroupCheckpointStatus) GetReason() CheckpointReason { + if x != nil { + return x.Reason + } + return CheckpointReason_CHECKPOINT_REASON_UNSPECIFIED +} + +type GetNodeGroupsCheckpointStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` } -func (x *LabelSearchResult) Reset() { - *x = LabelSearchResult{} +func (x *GetNodeGroupsCheckpointStatusRequest) Reset() { + *x = GetNodeGroupsCheckpointStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[223] + mi := &file_api_v1_recommendation_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSearchResult) String() string { +func (x *GetNodeGroupsCheckpointStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSearchResult) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusRequest) ProtoMessage() {} -func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[223] +func (x *GetNodeGroupsCheckpointStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[245] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18477,50 +21696,51 @@ func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use LabelSearchResult.ProtoReflect.Descriptor instead. -func (*LabelSearchResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{223} +// Deprecated: Use GetNodeGroupsCheckpointStatusRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} } -func (x *LabelSearchResult) GetKey() string { +func (x *GetNodeGroupsCheckpointStatusRequest) GetTeamId() string { if x != nil { - return x.Key + return x.TeamId } return "" } -func (x *LabelSearchResult) GetValue() string { +func (x *GetNodeGroupsCheckpointStatusRequest) GetClusterId() string { if x != nil { - return x.Value + return x.ClusterId } return "" } -type CreateNodePolicyTargetsRequest struct { +type GetNodeGroupsCheckpointStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + // Keyed by node group name. + ByNodeGroup map[string]*NodeGroupCheckpointStatus `protobuf:"bytes,1,rep,name=by_node_group,json=byNodeGroup,proto3" json:"by_node_group,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *CreateNodePolicyTargetsRequest) Reset() { - *x = CreateNodePolicyTargetsRequest{} +func (x *GetNodeGroupsCheckpointStatusResponse) Reset() { + *x = GetNodeGroupsCheckpointStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[224] + mi := &file_api_v1_recommendation_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsRequest) String() string { +func (x *GetNodeGroupsCheckpointStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusResponse) ProtoMessage() {} -func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[224] +func (x *GetNodeGroupsCheckpointStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[246] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18531,43 +21751,46 @@ func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*CreateNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{224} +// Deprecated: Use GetNodeGroupsCheckpointStatusResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{246} } -func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { +func (x *GetNodeGroupsCheckpointStatusResponse) GetByNodeGroup() map[string]*NodeGroupCheckpointStatus { if x != nil { - return x.Targets + return x.ByNodeGroup } return nil } -type CreateNodePolicyTargetsResponse struct { +type SetNodePolicyCheckpointLabelRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // true adds dakr.devzero.io/checkpoint-node=true; false removes the key. + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` } -func (x *CreateNodePolicyTargetsResponse) Reset() { - *x = CreateNodePolicyTargetsResponse{} +func (x *SetNodePolicyCheckpointLabelRequest) Reset() { + *x = SetNodePolicyCheckpointLabelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[225] + mi := &file_api_v1_recommendation_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsResponse) String() string { +func (x *SetNodePolicyCheckpointLabelRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelRequest) ProtoMessage() {} -func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[225] +func (x *SetNodePolicyCheckpointLabelRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[247] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18578,43 +21801,57 @@ func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*CreateNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} +// Deprecated: Use SetNodePolicyCheckpointLabelRequest.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} } -func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *SetNodePolicyCheckpointLabelRequest) GetTeamId() string { if x != nil { - return x.Targets + return x.TeamId } - return nil + return "" } -type ListNodePolicyTargetsRequest struct { +func (x *SetNodePolicyCheckpointLabelRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SetNodePolicyCheckpointLabelRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +type SetNodePolicyCheckpointLabelResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *ListNodePolicyTargetsRequest) Reset() { - *x = ListNodePolicyTargetsRequest{} +func (x *SetNodePolicyCheckpointLabelResponse) Reset() { + *x = SetNodePolicyCheckpointLabelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[226] + mi := &file_api_v1_recommendation_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePolicyTargetsRequest) String() string { +func (x *SetNodePolicyCheckpointLabelResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePolicyTargetsRequest) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelResponse) ProtoMessage() {} -func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[226] +func (x *SetNodePolicyCheckpointLabelResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[248] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18625,43 +21862,44 @@ func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*ListNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} +// Deprecated: Use SetNodePolicyCheckpointLabelResponse.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{248} } -func (x *ListNodePolicyTargetsRequest) GetTeamId() string { +func (x *SetNodePolicyCheckpointLabelResponse) GetSuccess() bool { if x != nil { - return x.TeamId + return x.Success } - return "" + return false } -type ListNodePolicyTargetsResponse struct { +type DeleteNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *ListNodePolicyTargetsResponse) Reset() { - *x = ListNodePolicyTargetsResponse{} +func (x *DeleteNodePolicyRequest) Reset() { + *x = DeleteNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[227] + mi := &file_api_v1_recommendation_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePolicyTargetsResponse) String() string { +func (x *DeleteNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePolicyTargetsResponse) ProtoMessage() {} +func (*DeleteNodePolicyRequest) ProtoMessage() {} -func (x *ListNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[227] +func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[249] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18672,90 +21910,52 @@ func (x *ListNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} +// Deprecated: Use DeleteNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{249} } -func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *DeleteNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Targets - } - return nil -} - -type UpdateNodePolicyTargetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` -} - -func (x *UpdateNodePolicyTargetRequest) Reset() { - *x = UpdateNodePolicyTargetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[228] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateNodePolicyTargetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} - -func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[228] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.TeamId } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} + return "" } -func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { +func (x *DeleteNodePolicyRequest) GetPolicyId() string { if x != nil { - return x.Target + return x.PolicyId } - return nil + return "" } -type UpdateNodePolicyTargetResponse struct { +type DeleteNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + // Number of NodePolicyTargets that were cascade-deleted along with the policy. + DeletedTargetCount int32 `protobuf:"varint,2,opt,name=deleted_target_count,json=deletedTargetCount,proto3" json:"deleted_target_count,omitempty"` } -func (x *UpdateNodePolicyTargetResponse) Reset() { - *x = UpdateNodePolicyTargetResponse{} +func (x *DeleteNodePolicyResponse) Reset() { + *x = DeleteNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[229] + mi := &file_api_v1_recommendation_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyTargetResponse) String() string { +func (x *DeleteNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} +func (*DeleteNodePolicyResponse) ProtoMessage() {} -func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[229] +func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[250] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18766,58 +21966,126 @@ func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{229} +// Deprecated: Use DeleteNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} } -func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { +func (x *DeleteNodePolicyResponse) GetSuccess() bool { if x != nil { - return x.Target + return x.Success } - return nil + return false } -type NodePolicyTarget struct { +func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { + if x != nil { + return x.DeletedTargetCount + } + return 0 +} + +type NodePolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Invariant: at most 1 entry. Server rejects >1. Will be narrowed to a scalar once all clients migrate. - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // uuid[] - PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` - // Runtime status conditions read from the compiled Karpenter NodePool in the - // target cluster (e.g. ZonalShiftReady / ZonalShiftActive). Populated by - // ListNodePolicyTargets via a join against k8s_karpenter_resources. Empty - // when no conditions are observed for this target. - Status *NodePolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` + // Cross-cloud core + InstanceCategories *LabelSelector `protobuf:"bytes,10,opt,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` // abstract, per-cloud mapping; UI: Family; e.g., D (Azure), m (AWS) + InstanceFamilies *LabelSelector `protobuf:"bytes,11,opt,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` // abstract, per-cloud mapping (c5, m5d, r4, etc) + InstanceCpus *LabelSelector `protobuf:"bytes,12,opt,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` // cpu count in cores (4, 8, 1, 2, etc) + InstanceHypervisors *LabelSelector `protobuf:"bytes,13,opt,name=instance_hypervisors,json=instanceHypervisors,proto3" json:"instance_hypervisors,omitempty"` // self explanatory + InstanceGenerations *LabelSelector `protobuf:"bytes,14,opt,name=instance_generations,json=instanceGenerations,proto3" json:"instance_generations,omitempty"` // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) + InstanceSizes *LabelSelector `protobuf:"bytes,15,opt,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` // UI: Size; eg: Standard_D4s (Azure), large (AWS) + InstanceShapes *LabelSelector `protobuf:"bytes,116,opt,name=instance_shapes,json=instanceShapes,proto3" json:"instance_shapes,omitempty"` // GCP-only: standard/highcpu/highmem shape token + InstanceTypes *LabelSelector `protobuf:"bytes,16,opt,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) + // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per + // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this + // field is silently dropped on the compile path for those providers. + InstanceLocalNvme *LabelSelector `protobuf:"bytes,113,opt,name=instance_local_nvme,json=instanceLocalNvme,proto3" json:"instance_local_nvme,omitempty"` + InstanceCategoriesTip *string `protobuf:"bytes,26,opt,name=instance_categories_tip,json=instanceCategoriesTip,proto3,oneof" json:"instance_categories_tip,omitempty"` + InstanceFamiliesTip *string `protobuf:"bytes,27,opt,name=instance_families_tip,json=instanceFamiliesTip,proto3,oneof" json:"instance_families_tip,omitempty"` + InstanceCpusTip *string `protobuf:"bytes,28,opt,name=instance_cpus_tip,json=instanceCpusTip,proto3,oneof" json:"instance_cpus_tip,omitempty"` + InstanceHypervisorsTip *string `protobuf:"bytes,29,opt,name=instance_hypervisors_tip,json=instanceHypervisorsTip,proto3,oneof" json:"instance_hypervisors_tip,omitempty"` + InstanceGenerationsTip *string `protobuf:"bytes,30,opt,name=instance_generations_tip,json=instanceGenerationsTip,proto3,oneof" json:"instance_generations_tip,omitempty"` + InstanceSizesTip *string `protobuf:"bytes,31,opt,name=instance_sizes_tip,json=instanceSizesTip,proto3,oneof" json:"instance_sizes_tip,omitempty"` + InstanceShapesTip *string `protobuf:"bytes,117,opt,name=instance_shapes_tip,json=instanceShapesTip,proto3,oneof" json:"instance_shapes_tip,omitempty"` + InstanceLocalNvmeTip *string `protobuf:"bytes,114,opt,name=instance_local_nvme_tip,json=instanceLocalNvmeTip,proto3,oneof" json:"instance_local_nvme_tip,omitempty"` + Zones *LabelSelector `protobuf:"bytes,36,opt,name=zones,proto3" json:"zones,omitempty"` // abstract, per-cloud mapping + Architectures *LabelSelector `protobuf:"bytes,37,opt,name=architectures,proto3" json:"architectures,omitempty"` // amd64, arm64 + CapacityTypes *LabelSelector `protobuf:"bytes,38,opt,name=capacity_types,json=capacityTypes,proto3" json:"capacity_types,omitempty"` // spot, on-demand, reserved + OperatingSystems *LabelSelector `protobuf:"bytes,39,opt,name=operating_systems,json=operatingSystems,proto3" json:"operating_systems,omitempty"` // linux, windows + Weight int32 `protobuf:"varint,40,opt,name=weight,proto3" json:"weight,omitempty"` + ZonesTip *string `protobuf:"bytes,45,opt,name=zones_tip,json=zonesTip,proto3,oneof" json:"zones_tip,omitempty"` + ArchitecturesTip *string `protobuf:"bytes,46,opt,name=architectures_tip,json=architecturesTip,proto3,oneof" json:"architectures_tip,omitempty"` + CapacityTypeTip *string `protobuf:"bytes,47,opt,name=capacity_type_tip,json=capacityTypeTip,proto3,oneof" json:"capacity_type_tip,omitempty"` + OperatingSystemsTip *string `protobuf:"bytes,48,opt,name=operating_systems_tip,json=operatingSystemsTip,proto3,oneof" json:"operating_systems_tip,omitempty"` + Labels map[string]string `protobuf:"bytes,51,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Taints []*Taint `protobuf:"bytes,52,rep,name=taints,proto3" json:"taints,omitempty"` + Disruption *DisruptionPolicy `protobuf:"bytes,53,opt,name=disruption,proto3" json:"disruption,omitempty"` + Limits *ResourceLimits `protobuf:"bytes,54,opt,name=limits,proto3" json:"limits,omitempty"` + StartupTaints []*Taint `protobuf:"bytes,55,rep,name=startup_taints,json=startupTaints,proto3" json:"startup_taints,omitempty"` + TaintsTip *string `protobuf:"bytes,57,opt,name=taints_tip,json=taintsTip,proto3,oneof" json:"taints_tip,omitempty"` + DisruptionsTip *string `protobuf:"bytes,58,opt,name=disruptions_tip,json=disruptionsTip,proto3,oneof" json:"disruptions_tip,omitempty"` + LimitsTip *string `protobuf:"bytes,59,opt,name=limits_tip,json=limitsTip,proto3,oneof" json:"limits_tip,omitempty"` + StartupTaintsTip *string `protobuf:"bytes,60,opt,name=startup_taints_tip,json=startupTaintsTip,proto3,oneof" json:"startup_taints_tip,omitempty"` + MasterOverrideRoleName string `protobuf:"bytes,61,opt,name=master_override_role_name,json=masterOverrideRoleName,proto3" json:"master_override_role_name,omitempty"` + NodePoolName string `protobuf:"bytes,71,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + NodeClassName string `protobuf:"bytes,72,opt,name=node_class_name,json=nodeClassName,proto3" json:"node_class_name,omitempty"` + // Provider-specific overrides + Aws *AWSNodeClassSpec `protobuf:"bytes,81,opt,name=aws,proto3" json:"aws,omitempty"` + Gcp *GCPNodeClassSpec `protobuf:"bytes,82,opt,name=gcp,proto3" json:"gcp,omitempty"` + Azure *AzureNodeClassSpec `protobuf:"bytes,83,opt,name=azure,proto3" json:"azure,omitempty"` + Oci *OCINodeClassSpec `protobuf:"bytes,84,opt,name=oci,proto3" json:"oci,omitempty"` + CloudProviderId *int64 `protobuf:"varint,85,opt,name=cloud_provider_id,json=cloudProviderId,proto3,oneof" json:"cloud_provider_id,omitempty"` + CloudProvider *CloudProvider `protobuf:"bytes,86,opt,name=cloud_provider,json=cloudProvider,proto3" json:"cloud_provider,omitempty"` + // Cloud-agnostic opt-in for AZ outage handling (AWS ARC zonal shift today; + // analogous GCP behavior planned). The compile step translates this to + // provider-specific annotations on the Karpenter NodePool. + ZonalShift *ZonalShiftConfig `protobuf:"bytes,90,opt,name=zonal_shift,json=zonalShift,proto3" json:"zonal_shift,omitempty"` + // Raw escape hatch for node pool + Raw []*RawKarpenterSpec `protobuf:"bytes,100,rep,name=raw,proto3" json:"raw,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // "dakr" (user-authored, pushed to cluster) or "cluster" (read-only, + // computed from Karpenter CRDs NOT labeled devzero.io/managed-by=dakr — i.e. + // anything dakr does not own; see repositories.scopeNotDakrManaged). + Source string `protobuf:"bytes,115,opt,name=source,proto3" json:"source,omitempty"` + // For source == "cluster" only: the cluster whose Karpenter NodePool this + // policy mirrors. A cluster-managed policy belongs to exactly one cluster and + // has no NodePolicyTargets, so this is the frontend's only way to scope it + // (e.g. for suggestions). Empty for dakr-authored policies. + SourceClusterId string `protobuf:"bytes,118,opt,name=source_cluster_id,json=sourceClusterId,proto3" json:"source_cluster_id,omitempty"` + // For source == "cluster" only: NodePool requirement keys on the mirrored CRD + // that this message has no field for (Azure/GCP SKU keys, custom label + // requirements). Computed per request like source and source_cluster_id, never + // stored, and empty for dakr-authored policies — which are authoritative by + // construction, since dakr compiled the NodePool from them. + UnrepresentedRequirementKeys []string `protobuf:"bytes,119,rep,name=unrepresented_requirement_keys,json=unrepresentedRequirementKeys,proto3" json:"unrepresented_requirement_keys,omitempty"` } -func (x *NodePolicyTarget) Reset() { - *x = NodePolicyTarget{} +func (x *NodePolicy) Reset() { + *x = NodePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[230] + mi := &file_api_v1_recommendation_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyTarget) String() string { +func (x *NodePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyTarget) ProtoMessage() {} +func (*NodePolicy) ProtoMessage() {} -func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[230] +func (x *NodePolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[251] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18828,456 +22096,431 @@ func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyTarget.ProtoReflect.Descriptor instead. -func (*NodePolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} +// Deprecated: Use NodePolicy.ProtoReflect.Descriptor instead. +func (*NodePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{251} } -func (x *NodePolicyTarget) GetTargetId() string { +func (x *NodePolicy) GetId() string { if x != nil { - return x.TargetId + return x.Id } return "" } -func (x *NodePolicyTarget) GetName() string { +func (x *NodePolicy) GetName() string { if x != nil { return x.Name } return "" } -func (x *NodePolicyTarget) GetDescription() string { +func (x *NodePolicy) GetDescription() string { if x != nil { return x.Description } return "" } -func (x *NodePolicyTarget) GetTeamId() string { +func (x *NodePolicy) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *NodePolicyTarget) GetClusterIds() []string { +func (x *NodePolicy) GetInstanceCategories() *LabelSelector { if x != nil { - return x.ClusterIds + return x.InstanceCategories } return nil } -func (x *NodePolicyTarget) GetPolicyId() string { +func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { if x != nil { - return x.PolicyId + return x.InstanceFamilies } - return "" + return nil } -func (x *NodePolicyTarget) GetEnabled() bool { +func (x *NodePolicy) GetInstanceCpus() *LabelSelector { if x != nil { - return x.Enabled + return x.InstanceCpus } - return false + return nil } -func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { +func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { if x != nil { - return x.CreatedAt + return x.InstanceHypervisors } return nil } -func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { +func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { if x != nil { - return x.UpdatedAt + return x.InstanceGenerations } return nil } -func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { +func (x *NodePolicy) GetInstanceSizes() *LabelSelector { if x != nil { - return x.DeletedAt + return x.InstanceSizes } return nil } -func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { +func (x *NodePolicy) GetInstanceShapes() *LabelSelector { if x != nil { - return x.Status + return x.InstanceShapes } return nil } -type NodePolicyCondition struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // e.g. "ZonalShiftReady", "ZonalShiftActive" - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // "True" | "False" | "Unknown" - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - // Machine-readable reason code (e.g. "Ready", "ZonePinned", "NoFallbackZones", - // "NoActiveShift", "AwayFrom", "ZoneConstraintConflict"). - Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` - // Human-readable detail (e.g. impacted zone names). - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` - LastTransitionTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` +func (x *NodePolicy) GetInstanceTypes() *LabelSelector { + if x != nil { + return x.InstanceTypes + } + return nil } -func (x *NodePolicyCondition) Reset() { - *x = NodePolicyCondition{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[231] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { + if x != nil { + return x.InstanceLocalNvme } + return nil } -func (x *NodePolicyCondition) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetInstanceCategoriesTip() string { + if x != nil && x.InstanceCategoriesTip != nil { + return *x.InstanceCategoriesTip + } + return "" } -func (*NodePolicyCondition) ProtoMessage() {} +func (x *NodePolicy) GetInstanceFamiliesTip() string { + if x != nil && x.InstanceFamiliesTip != nil { + return *x.InstanceFamiliesTip + } + return "" +} -func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[231] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetInstanceCpusTip() string { + if x != nil && x.InstanceCpusTip != nil { + return *x.InstanceCpusTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. -func (*NodePolicyCondition) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} +func (x *NodePolicy) GetInstanceHypervisorsTip() string { + if x != nil && x.InstanceHypervisorsTip != nil { + return *x.InstanceHypervisorsTip + } + return "" } -func (x *NodePolicyCondition) GetType() string { - if x != nil { - return x.Type +func (x *NodePolicy) GetInstanceGenerationsTip() string { + if x != nil && x.InstanceGenerationsTip != nil { + return *x.InstanceGenerationsTip } return "" } -func (x *NodePolicyCondition) GetStatus() string { - if x != nil { - return x.Status +func (x *NodePolicy) GetInstanceSizesTip() string { + if x != nil && x.InstanceSizesTip != nil { + return *x.InstanceSizesTip } return "" } -func (x *NodePolicyCondition) GetReason() string { - if x != nil { - return x.Reason +func (x *NodePolicy) GetInstanceShapesTip() string { + if x != nil && x.InstanceShapesTip != nil { + return *x.InstanceShapesTip } return "" } -func (x *NodePolicyCondition) GetMessage() string { - if x != nil { - return x.Message +func (x *NodePolicy) GetInstanceLocalNvmeTip() string { + if x != nil && x.InstanceLocalNvmeTip != nil { + return *x.InstanceLocalNvmeTip } return "" } -func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { +func (x *NodePolicy) GetZones() *LabelSelector { if x != nil { - return x.LastTransitionTime + return x.Zones } return nil } -type NodePolicyTargetStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` -} - -func (x *NodePolicyTargetStatus) Reset() { - *x = NodePolicyTargetStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[232] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetArchitectures() *LabelSelector { + if x != nil { + return x.Architectures } + return nil } -func (x *NodePolicyTargetStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NodePolicyTargetStatus) ProtoMessage() {} - -func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[232] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetCapacityTypes() *LabelSelector { + if x != nil { + return x.CapacityTypes } - return mi.MessageOf(x) -} - -// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. -func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} + return nil } -func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { +func (x *NodePolicy) GetOperatingSystems() *LabelSelector { if x != nil { - return x.Conditions + return x.OperatingSystems } return nil } -// Cloud-agnostic config for how a node policy should react to AZ outage -// signals from the cloud provider (AWS ARC zonal shift today; GCP analogue -// planned). The compile step maps these intents to provider-specific -// annotations on the resulting Karpenter NodePool. -type ZonalShiftConfig struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Master opt-in. When false the other two fields are ignored. - RespectZonalShift bool `protobuf:"varint,1,opt,name=respect_zonal_shift,json=respectZonalShift,proto3" json:"respect_zonal_shift,omitempty"` - // Also terminate existing nodes in the impacted zone, forcing reschedule. - // Respects pod disruption budgets. Only meaningful when respect_zonal_shift is true. - EvictImpactedNodes bool `protobuf:"varint,2,opt,name=evict_impacted_nodes,json=evictImpactedNodes,proto3" json:"evict_impacted_nodes,omitempty"` - // If the policy is pinned to a single zone and that zone is impacted, expand - // to other zones available on the node class. Only meaningful when - // respect_zonal_shift is true. - AllowZoneFallback bool `protobuf:"varint,3,opt,name=allow_zone_fallback,json=allowZoneFallback,proto3" json:"allow_zone_fallback,omitempty"` +func (x *NodePolicy) GetWeight() int32 { + if x != nil { + return x.Weight + } + return 0 } -func (x *ZonalShiftConfig) Reset() { - *x = ZonalShiftConfig{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[233] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetZonesTip() string { + if x != nil && x.ZonesTip != nil { + return *x.ZonesTip } + return "" } -func (x *ZonalShiftConfig) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetArchitecturesTip() string { + if x != nil && x.ArchitecturesTip != nil { + return *x.ArchitecturesTip + } + return "" } -func (*ZonalShiftConfig) ProtoMessage() {} - -func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[233] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetCapacityTypeTip() string { + if x != nil && x.CapacityTypeTip != nil { + return *x.CapacityTypeTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. -func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{233} +func (x *NodePolicy) GetOperatingSystemsTip() string { + if x != nil && x.OperatingSystemsTip != nil { + return *x.OperatingSystemsTip + } + return "" } -func (x *ZonalShiftConfig) GetRespectZonalShift() bool { +func (x *NodePolicy) GetLabels() map[string]string { if x != nil { - return x.RespectZonalShift + return x.Labels } - return false + return nil } -func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { +func (x *NodePolicy) GetTaints() []*Taint { if x != nil { - return x.EvictImpactedNodes + return x.Taints } - return false + return nil } -func (x *ZonalShiftConfig) GetAllowZoneFallback() bool { +func (x *NodePolicy) GetDisruption() *DisruptionPolicy { if x != nil { - return x.AllowZoneFallback + return x.Disruption } - return false + return nil } -type Taint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetLimits() *ResourceLimits { + if x != nil { + return x.Limits + } + return nil +} - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // NoSchedule, PreferNoSchedule, NoExecute +func (x *NodePolicy) GetStartupTaints() []*Taint { + if x != nil { + return x.StartupTaints + } + return nil } -func (x *Taint) Reset() { - *x = Taint{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[234] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetTaintsTip() string { + if x != nil && x.TaintsTip != nil { + return *x.TaintsTip } + return "" } -func (x *Taint) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetDisruptionsTip() string { + if x != nil && x.DisruptionsTip != nil { + return *x.DisruptionsTip + } + return "" } -func (*Taint) ProtoMessage() {} - -func (x *Taint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[234] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetLimitsTip() string { + if x != nil && x.LimitsTip != nil { + return *x.LimitsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use Taint.ProtoReflect.Descriptor instead. -func (*Taint) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{234} +func (x *NodePolicy) GetStartupTaintsTip() string { + if x != nil && x.StartupTaintsTip != nil { + return *x.StartupTaintsTip + } + return "" } -func (x *Taint) GetKey() string { +func (x *NodePolicy) GetMasterOverrideRoleName() string { if x != nil { - return x.Key + return x.MasterOverrideRoleName } return "" } -func (x *Taint) GetValue() string { +func (x *NodePolicy) GetNodePoolName() string { if x != nil { - return x.Value + return x.NodePoolName } return "" } -func (x *Taint) GetEffect() string { +func (x *NodePolicy) GetNodeClassName() string { if x != nil { - return x.Effect + return x.NodeClassName } return "" } -type DisruptionBudget struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetAws() *AWSNodeClassSpec { + if x != nil { + return x.Aws + } + return nil +} - Reasons []string `protobuf:"bytes,1,rep,name=reasons,proto3" json:"reasons,omitempty"` // e.g. ["Underutilized", "Empty"] - Nodes string `protobuf:"bytes,2,opt,name=nodes,proto3" json:"nodes,omitempty"` // e.g. "10%" or "2" - Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` // optional cron schedule - Duration string `protobuf:"bytes,4,opt,name=duration,proto3" json:"duration,omitempty"` // e.g. "1h30m" +func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { + if x != nil { + return x.Gcp + } + return nil } -func (x *DisruptionBudget) Reset() { - *x = DisruptionBudget{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[235] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { + if x != nil { + return x.Azure + } + return nil +} + +func (x *NodePolicy) GetOci() *OCINodeClassSpec { + if x != nil { + return x.Oci } + return nil } -func (x *DisruptionBudget) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetCloudProviderId() int64 { + if x != nil && x.CloudProviderId != nil { + return *x.CloudProviderId + } + return 0 } -func (*DisruptionBudget) ProtoMessage() {} +func (x *NodePolicy) GetCloudProvider() *CloudProvider { + if x != nil { + return x.CloudProvider + } + return nil +} -func (x *DisruptionBudget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[235] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { + if x != nil { + return x.ZonalShift } - return mi.MessageOf(x) + return nil } -// Deprecated: Use DisruptionBudget.ProtoReflect.Descriptor instead. -func (*DisruptionBudget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{235} +func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { + if x != nil { + return x.Raw + } + return nil } -func (x *DisruptionBudget) GetReasons() []string { +func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Reasons + return x.CreatedAt } return nil } -func (x *DisruptionBudget) GetNodes() string { +func (x *NodePolicy) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.Nodes + return x.UpdatedAt } - return "" + return nil } -func (x *DisruptionBudget) GetSchedule() string { +func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.Schedule + return x.DeletedAt + } + return nil +} + +func (x *NodePolicy) GetSource() string { + if x != nil { + return x.Source } return "" } -func (x *DisruptionBudget) GetDuration() string { +func (x *NodePolicy) GetSourceClusterId() string { if x != nil { - return x.Duration + return x.SourceClusterId } return "" } -type DisruptionPolicy struct { +func (x *NodePolicy) GetUnrepresentedRequirementKeys() []string { + if x != nil { + return x.UnrepresentedRequirementKeys + } + return nil +} + +type PreviewNodeRecommendationConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConsolidateAfter string `protobuf:"bytes,1,opt,name=consolidate_after,json=consolidateAfter,proto3" json:"consolidate_after,omitempty"` // required by Karpenter - ConsolidationPolicy string `protobuf:"bytes,2,opt,name=consolidation_policy,json=consolidationPolicy,proto3" json:"consolidation_policy,omitempty"` // WhenEmpty / WhenEmptyOrUnderutilized - ExpireAfter string `protobuf:"bytes,3,opt,name=expire_after,json=expireAfter,proto3" json:"expire_after,omitempty"` - TtlSecondsAfterEmpty int32 `protobuf:"varint,4,opt,name=ttl_seconds_after_empty,json=ttlSecondsAfterEmpty,proto3" json:"ttl_seconds_after_empty,omitempty"` - TerminationGracePeriodSeconds int32 `protobuf:"varint,5,opt,name=termination_grace_period_seconds,json=terminationGracePeriodSeconds,proto3" json:"termination_grace_period_seconds,omitempty"` - Budgets []*DisruptionBudget `protobuf:"bytes,6,rep,name=budgets,proto3" json:"budgets,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Policies []*NodePolicy `protobuf:"bytes,6,rep,name=policies,proto3" json:"policies,omitempty"` + PolicyIds []string `protobuf:"bytes,11,rep,name=policy_ids,json=policyIds,proto3" json:"policy_ids,omitempty"` // if set, `repeated NodePolicy policies = 6;` is ignored } -func (x *DisruptionPolicy) Reset() { - *x = DisruptionPolicy{} +func (x *PreviewNodeRecommendationConfigRequest) Reset() { + *x = PreviewNodeRecommendationConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[236] + mi := &file_api_v1_recommendation_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DisruptionPolicy) String() string { +func (x *PreviewNodeRecommendationConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DisruptionPolicy) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} -func (x *DisruptionPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[236] +func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[252] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19288,79 +22531,64 @@ func (x *DisruptionPolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. -func (*DisruptionPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} -} - -func (x *DisruptionPolicy) GetConsolidateAfter() string { - if x != nil { - return x.ConsolidateAfter - } - return "" +// Deprecated: Use PreviewNodeRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{252} } -func (x *DisruptionPolicy) GetConsolidationPolicy() string { +func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { if x != nil { - return x.ConsolidationPolicy + return x.TeamId } return "" } -func (x *DisruptionPolicy) GetExpireAfter() string { +func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { if x != nil { - return x.ExpireAfter + return x.ClusterId } return "" } -func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { - if x != nil { - return x.TtlSecondsAfterEmpty - } - return 0 -} - -func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { +func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { if x != nil { - return x.TerminationGracePeriodSeconds + return x.Policies } - return 0 + return nil } -func (x *DisruptionPolicy) GetBudgets() []*DisruptionBudget { +func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { if x != nil { - return x.Budgets + return x.PolicyIds } return nil } -type ResourceLimits struct { +type PreviewNodeRecommendationConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` - Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` + Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` } -func (x *ResourceLimits) Reset() { - *x = ResourceLimits{} +func (x *PreviewNodeRecommendationConfigResponse) Reset() { + *x = PreviewNodeRecommendationConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[237] + mi := &file_api_v1_recommendation_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResourceLimits) String() string { +func (x *PreviewNodeRecommendationConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResourceLimits) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} -func (x *ResourceLimits) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[237] +func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[253] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19371,66 +22599,51 @@ func (x *ResourceLimits) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. -func (*ResourceLimits) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} -} - -func (x *ResourceLimits) GetCpu() string { - if x != nil { - return x.Cpu - } - return "" +// Deprecated: Use PreviewNodeRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{253} } -func (x *ResourceLimits) GetMemory() string { +func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { if x != nil { - return x.Memory + return x.Nrc } - return "" + return nil } -// Provider-specific stubs -type AWSNodeClassSpec struct { +type NodeRecommendationConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SubnetSelectorTerms []*SubnetSelectorTerm `protobuf:"bytes,1,rep,name=subnet_selector_terms,json=subnetSelectorTerms,proto3" json:"subnet_selector_terms,omitempty"` - SecurityGroupSelectorTerms []*SecurityGroupSelectorTerm `protobuf:"bytes,2,rep,name=security_group_selector_terms,json=securityGroupSelectorTerms,proto3" json:"security_group_selector_terms,omitempty"` - CapacityReservationSelectorTerms []*CapacityReservationSelectorTerm `protobuf:"bytes,3,rep,name=capacity_reservation_selector_terms,json=capacityReservationSelectorTerms,proto3" json:"capacity_reservation_selector_terms,omitempty"` - AssociatePublicIpAddress *bool `protobuf:"varint,4,opt,name=associate_public_ip_address,json=associatePublicIpAddress,proto3,oneof" json:"associate_public_ip_address,omitempty"` - AmiSelectorTerms []*AMISelectorTerm `protobuf:"bytes,5,rep,name=ami_selector_terms,json=amiSelectorTerms,proto3" json:"ami_selector_terms,omitempty"` - AmiFamily *string `protobuf:"bytes,6,opt,name=ami_family,json=amiFamily,proto3,oneof" json:"ami_family,omitempty"` - UserData *string `protobuf:"bytes,7,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` - Role *string `protobuf:"bytes,8,opt,name=role,proto3,oneof" json:"role,omitempty"` - InstanceProfile *string `protobuf:"bytes,9,opt,name=instance_profile,json=instanceProfile,proto3,oneof" json:"instance_profile,omitempty"` - Tags map[string]string `protobuf:"bytes,10,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Kubelet *KubeletConfiguration `protobuf:"bytes,11,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` - BlockDeviceMappings []*BlockDeviceMapping `protobuf:"bytes,12,rep,name=block_device_mappings,json=blockDeviceMappings,proto3" json:"block_device_mappings,omitempty"` - InstanceStorePolicy *InstanceStorePolicy `protobuf:"varint,13,opt,name=instance_store_policy,json=instanceStorePolicy,proto3,enum=api.v1.InstanceStorePolicy,oneof" json:"instance_store_policy,omitempty"` - DetailedMonitoring *bool `protobuf:"varint,14,opt,name=detailed_monitoring,json=detailedMonitoring,proto3,oneof" json:"detailed_monitoring,omitempty"` - MetadataOptions *MetadataOptions `protobuf:"bytes,15,opt,name=metadata_options,json=metadataOptions,proto3,oneof" json:"metadata_options,omitempty"` - Context *string `protobuf:"bytes,16,opt,name=context,proto3,oneof" json:"context,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyContainersJson string `protobuf:"bytes,6,opt,name=policy_containers_json,json=policyContainersJson,proto3" json:"policy_containers_json,omitempty"` + PolicyContainersYaml string `protobuf:"bytes,7,opt,name=policy_containers_yaml,json=policyContainersYaml,proto3" json:"policy_containers_yaml,omitempty"` + Status RecommendationStatus `protobuf:"varint,11,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` + Error string `protobuf:"bytes,12,opt,name=error,proto3" json:"error,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,18,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` } -func (x *AWSNodeClassSpec) Reset() { - *x = AWSNodeClassSpec{} +func (x *NodeRecommendationConfig) Reset() { + *x = NodeRecommendationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[238] + mi := &file_api_v1_recommendation_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AWSNodeClassSpec) String() string { +func (x *NodeRecommendationConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AWSNodeClassSpec) ProtoMessage() {} +func (*NodeRecommendationConfig) ProtoMessage() {} -func (x *AWSNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[238] +func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[254] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19441,148 +22654,100 @@ func (x *AWSNodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. -func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{238} -} - -func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { - if x != nil { - return x.SubnetSelectorTerms - } - return nil -} - -func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { - if x != nil { - return x.SecurityGroupSelectorTerms - } - return nil +// Deprecated: Use NodeRecommendationConfig.ProtoReflect.Descriptor instead. +func (*NodeRecommendationConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{254} } -func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { +func (x *NodeRecommendationConfig) GetId() string { if x != nil { - return x.CapacityReservationSelectorTerms - } - return nil -} - -func (x *AWSNodeClassSpec) GetAssociatePublicIpAddress() bool { - if x != nil && x.AssociatePublicIpAddress != nil { - return *x.AssociatePublicIpAddress + return x.Id } - return false + return "" } -func (x *AWSNodeClassSpec) GetAmiSelectorTerms() []*AMISelectorTerm { +func (x *NodeRecommendationConfig) GetClusterId() string { if x != nil { - return x.AmiSelectorTerms - } - return nil -} - -func (x *AWSNodeClassSpec) GetAmiFamily() string { - if x != nil && x.AmiFamily != nil { - return *x.AmiFamily + return x.ClusterId } return "" } -func (x *AWSNodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData +func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { + if x != nil { + return x.PolicyContainersJson } return "" } -func (x *AWSNodeClassSpec) GetRole() string { - if x != nil && x.Role != nil { - return *x.Role +func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { + if x != nil { + return x.PolicyContainersYaml } return "" } -func (x *AWSNodeClassSpec) GetInstanceProfile() string { - if x != nil && x.InstanceProfile != nil { - return *x.InstanceProfile +func (x *NodeRecommendationConfig) GetStatus() RecommendationStatus { + if x != nil { + return x.Status } - return "" + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -func (x *AWSNodeClassSpec) GetTags() map[string]string { +func (x *NodeRecommendationConfig) GetError() string { if x != nil { - return x.Tags + return x.Error } - return nil + return "" } -func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { +func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kubelet + return x.CreatedAt } return nil } -func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { +func (x *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.BlockDeviceMappings + return x.UpdatedAt } return nil } -func (x *AWSNodeClassSpec) GetInstanceStorePolicy() InstanceStorePolicy { - if x != nil && x.InstanceStorePolicy != nil { - return *x.InstanceStorePolicy - } - return InstanceStorePolicy_INSTANCE_STORE_POLICY_RAID0 -} - -func (x *AWSNodeClassSpec) GetDetailedMonitoring() bool { - if x != nil && x.DetailedMonitoring != nil { - return *x.DetailedMonitoring - } - return false -} - -func (x *AWSNodeClassSpec) GetMetadataOptions() *MetadataOptions { +func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.MetadataOptions + return x.DeletedAt } return nil } -func (x *AWSNodeClassSpec) GetContext() string { - if x != nil && x.Context != nil { - return *x.Context - } - return "" -} - -type GetInstanceFamiliesRequest struct { +type SuggestedKarpenterConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetInstanceFamiliesRequest) Reset() { - *x = GetInstanceFamiliesRequest{} +func (x *SuggestedKarpenterConfigRequest) Reset() { + *x = SuggestedKarpenterConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[239] + mi := &file_api_v1_recommendation_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesRequest) String() string { +func (x *SuggestedKarpenterConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesRequest) ProtoMessage() {} +func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} -func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[239] +func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[255] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19593,43 +22758,51 @@ func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceFamiliesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceFamiliesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{239} +// Deprecated: Use SuggestedKarpenterConfigRequest.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{255} } -func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { +func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { if x != nil { - return x.CloudProviders + return x.ClusterId } - return nil + return "" } -type GetInstanceFamiliesResponse struct { +func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +type SuggestedKarpenterConfigResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceFamilies []*InstanceFamily `protobuf:"bytes,1,rep,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` + NgToOriginal map[string]*NodeRecommendationConfig `protobuf:"bytes,1,rep,name=ng_to_original,json=ngToOriginal,proto3" json:"ng_to_original,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NgToSuggested map[string]*NodeRecommendationConfig `protobuf:"bytes,11,rep,name=ng_to_suggested,json=ngToSuggested,proto3" json:"ng_to_suggested,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *GetInstanceFamiliesResponse) Reset() { - *x = GetInstanceFamiliesResponse{} +func (x *SuggestedKarpenterConfigResponse) Reset() { + *x = SuggestedKarpenterConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[240] + mi := &file_api_v1_recommendation_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesResponse) String() string { +func (x *SuggestedKarpenterConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesResponse) ProtoMessage() {} +func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} -func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[240] +func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[256] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19640,43 +22813,61 @@ func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceFamiliesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceFamiliesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{240} +// Deprecated: Use SuggestedKarpenterConfigResponse.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{256} } -func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { +func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { if x != nil { - return x.InstanceFamilies + return x.NgToOriginal } return nil } -type GetInstanceSizesRequest struct { +func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { + if x != nil { + return x.NgToSuggested + } + return nil +} + +type SuggestNodePolicyImprovementsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Required. Suggestions are computed per (policy, cluster) pair: the evidence is the + // cluster's live NodePools/nodes/workloads attributed to this policy. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // Stored policy to evaluate. Takes precedence over `policy`, mirroring + // PreviewNodeRecommendationConfigRequest. + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // Inline draft to evaluate when `policy_id` is empty. Always computed live, never + // persisted. + Policy *NodePolicy `protobuf:"bytes,4,opt,name=policy,proto3" json:"policy,omitempty"` + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + Window ProfileWindow `protobuf:"varint,5,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } -func (x *GetInstanceSizesRequest) Reset() { - *x = GetInstanceSizesRequest{} +func (x *SuggestNodePolicyImprovementsRequest) Reset() { + *x = SuggestNodePolicyImprovementsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[241] + mi := &file_api_v1_recommendation_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceSizesRequest) String() string { +func (x *SuggestNodePolicyImprovementsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceSizesRequest) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsRequest) ProtoMessage() {} -func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[241] +func (x *SuggestNodePolicyImprovementsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[257] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19687,43 +22878,84 @@ func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceSizesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceSizesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{241} +// Deprecated: Use SuggestNodePolicyImprovementsRequest.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{257} } -func (x *GetInstanceSizesRequest) GetCloudProviders() []string { +func (x *SuggestNodePolicyImprovementsRequest) GetTeamId() string { if x != nil { - return x.CloudProviders + return x.TeamId + } + return "" +} + +func (x *SuggestNodePolicyImprovementsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SuggestNodePolicyImprovementsRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SuggestNodePolicyImprovementsRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy } return nil } -type GetInstanceSizesResponse struct { +func (x *SuggestNodePolicyImprovementsRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +type SuggestNodePolicyImprovementsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` + Original *NodePolicy `protobuf:"bytes,1,opt,name=original,proto3" json:"original,omitempty"` + // Deep copy of `original` with every suggestion applied — the "accept all" payload. + Suggested *NodePolicy `protobuf:"bytes,2,opt,name=suggested,proto3" json:"suggested,omitempty"` + Suggestions []*NodePolicySuggestion `protobuf:"bytes,3,rep,name=suggestions,proto3" json:"suggestions,omitempty"` + Context *SuggestionContext `protobuf:"bytes,4,opt,name=context,proto3" json:"context,omitempty"` + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // False when the response was computed synchronously for this request rather than + // served from a precomputed row. + FromCache bool `protobuf:"varint,6,opt,name=from_cache,json=fromCache,proto3" json:"from_cache,omitempty"` + // True when the served row predates the policy's current revision (or an engine + // rule-set change). A background refresh has been enqueued; clients should surface + // the computed_at staleness and may refetch shortly. Large clusters serve stale + // rather than recomputing in the request path. + Stale bool `protobuf:"varint,7,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *GetInstanceSizesResponse) Reset() { - *x = GetInstanceSizesResponse{} +func (x *SuggestNodePolicyImprovementsResponse) Reset() { + *x = SuggestNodePolicyImprovementsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[242] + mi := &file_api_v1_recommendation_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceSizesResponse) String() string { +func (x *SuggestNodePolicyImprovementsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceSizesResponse) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsResponse) ProtoMessage() {} -func (x *GetInstanceSizesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[242] +func (x *SuggestNodePolicyImprovementsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[258] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19734,99 +22966,88 @@ func (x *GetInstanceSizesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} +// Deprecated: Use SuggestNodePolicyImprovementsResponse.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{258} } -func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { +func (x *SuggestNodePolicyImprovementsResponse) GetOriginal() *NodePolicy { if x != nil { - return x.InstanceSizes + return x.Original } return nil } -type InstanceFamily struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` -} - -func (x *InstanceFamily) Reset() { - *x = InstanceFamily{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[243] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *SuggestNodePolicyImprovementsResponse) GetSuggested() *NodePolicy { + if x != nil { + return x.Suggested } + return nil } -func (x *InstanceFamily) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *SuggestNodePolicyImprovementsResponse) GetSuggestions() []*NodePolicySuggestion { + if x != nil { + return x.Suggestions + } + return nil } -func (*InstanceFamily) ProtoMessage() {} - -func (x *InstanceFamily) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[243] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SuggestNodePolicyImprovementsResponse) GetContext() *SuggestionContext { + if x != nil { + return x.Context } - return mi.MessageOf(x) + return nil } -// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. -func (*InstanceFamily) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{243} +func (x *SuggestNodePolicyImprovementsResponse) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil } -func (x *InstanceFamily) GetName() string { +func (x *SuggestNodePolicyImprovementsResponse) GetFromCache() bool { if x != nil { - return x.Name + return x.FromCache } - return "" + return false } -func (x *InstanceFamily) GetProviderName() string { +func (x *SuggestNodePolicyImprovementsResponse) GetStale() bool { if x != nil { - return x.ProviderName + return x.Stale } - return "" + return false } -type InstanceSize struct { +type ListClusterNodePolicySuggestionsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + Window ProfileWindow `protobuf:"varint,3,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` } -func (x *InstanceSize) Reset() { - *x = InstanceSize{} +func (x *ListClusterNodePolicySuggestionsRequest) Reset() { + *x = ListClusterNodePolicySuggestionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[244] + mi := &file_api_v1_recommendation_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceSize) String() string { +func (x *ListClusterNodePolicySuggestionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceSize) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsRequest) ProtoMessage() {} -func (x *InstanceSize) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[244] +func (x *ListClusterNodePolicySuggestionsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[259] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19837,52 +23058,65 @@ func (x *InstanceSize) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceSize.ProtoReflect.Descriptor instead. -func (*InstanceSize) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{244} +// Deprecated: Use ListClusterNodePolicySuggestionsRequest.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{259} } -func (x *InstanceSize) GetName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -func (x *InstanceSize) GetProviderName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetClusterId() string { if x != nil { - return x.ProviderName + return x.ClusterId } return "" } -type InstanceCategory struct { +func (x *ListClusterNodePolicySuggestionsRequest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +type ListClusterNodePolicySuggestionsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // e.g., "c", "D", "n" - Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` // e.g., "Compute Optimized" - ProviderName string `protobuf:"bytes,3,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure", "GCP" + Policies []*NodePolicySuggestionsForPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + // The oldest computed_at among the included policies — the bound a caller can trust + // the whole response by, even though each policy's own row has its own computed_at. + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // True when at least one policy has no row yet, or a row stale enough to recompute. + // A background refresh of the whole cluster has been enqueued; clients should + // surface staleness and may refetch shortly, the same contract as + // SuggestNodePolicyImprovementsResponse.stale. + Stale bool `protobuf:"varint,3,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *InstanceCategory) Reset() { - *x = InstanceCategory{} +func (x *ListClusterNodePolicySuggestionsResponse) Reset() { + *x = ListClusterNodePolicySuggestionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[245] + mi := &file_api_v1_recommendation_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCategory) String() string { +func (x *ListClusterNodePolicySuggestionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCategory) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsResponse) ProtoMessage() {} -func (x *InstanceCategory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[245] +func (x *ListClusterNodePolicySuggestionsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[260] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19893,58 +23127,73 @@ func (x *InstanceCategory) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceCategory.ProtoReflect.Descriptor instead. -func (*InstanceCategory) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} +// Deprecated: Use ListClusterNodePolicySuggestionsResponse.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{260} } -func (x *InstanceCategory) GetKey() string { +func (x *ListClusterNodePolicySuggestionsResponse) GetPolicies() []*NodePolicySuggestionsForPolicy { if x != nil { - return x.Key + return x.Policies } - return "" + return nil } -func (x *InstanceCategory) GetLabel() string { +func (x *ListClusterNodePolicySuggestionsResponse) GetComputedAt() *timestamppb.Timestamp { if x != nil { - return x.Label + return x.ComputedAt } - return "" + return nil } -func (x *InstanceCategory) GetProviderName() string { +func (x *ListClusterNodePolicySuggestionsResponse) GetStale() bool { if x != nil { - return x.ProviderName + return x.Stale } - return "" + return false } -type InstanceCPU struct { +// NodePolicySuggestionsForPolicy is one policy's entry in a cluster-wide suggestions +// list: everything ListClusterNodePolicySuggestions can say about a single policy +// without the original/suggested NodePolicy payload SuggestNodePolicyImprovements +// carries — that RPC is still where accepting a suggestion happens. +type NodePolicySuggestionsForPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Vcpu int32 `protobuf:"varint,1,opt,name=vcpu,proto3" json:"vcpu,omitempty"` // e.g., 2, 4, 8, 16 - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyName string `protobuf:"bytes,2,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` + // "dakr" or "cluster", mirroring NodePolicy.source — cluster-managed mirrors get + // suggestions surfaced here the same as dakr-authored policies, visualization-only: + // accepting one still routes to that mirror's own Karpenter manifest, not this RPC. + PolicySource string `protobuf:"bytes,3,opt,name=policy_source,json=policySource,proto3" json:"policy_source,omitempty"` + Suggestions []*NodePolicySuggestion `protobuf:"bytes,4,rep,name=suggestions,proto3" json:"suggestions,omitempty"` + Context *SuggestionContext `protobuf:"bytes,5,opt,name=context,proto3" json:"context,omitempty"` + ComputedAt *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=computed_at,json=computedAt,proto3" json:"computed_at,omitempty"` + // True when this policy's own row is missing, predates its current revision, or + // predates an engine rule-set change — same definition as + // SuggestNodePolicyImprovementsResponse.stale, just scoped to this one policy. + Stale bool `protobuf:"varint,7,opt,name=stale,proto3" json:"stale,omitempty"` } -func (x *InstanceCPU) Reset() { - *x = InstanceCPU{} +func (x *NodePolicySuggestionsForPolicy) Reset() { + *x = NodePolicySuggestionsForPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[246] + mi := &file_api_v1_recommendation_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCPU) String() string { +func (x *NodePolicySuggestionsForPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCPU) ProtoMessage() {} +func (*NodePolicySuggestionsForPolicy) ProtoMessage() {} -func (x *InstanceCPU) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[246] +func (x *NodePolicySuggestionsForPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[261] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19955,51 +23204,139 @@ func (x *InstanceCPU) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceCPU.ProtoReflect.Descriptor instead. -func (*InstanceCPU) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{246} +// Deprecated: Use NodePolicySuggestionsForPolicy.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestionsForPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{261} } -func (x *InstanceCPU) GetVcpu() int32 { +func (x *NodePolicySuggestionsForPolicy) GetPolicyId() string { if x != nil { - return x.Vcpu + return x.PolicyId } - return 0 + return "" } -func (x *InstanceCPU) GetProviderName() string { +func (x *NodePolicySuggestionsForPolicy) GetPolicyName() string { if x != nil { - return x.ProviderName + return x.PolicyName } return "" } -type InstanceTypeName struct { +func (x *NodePolicySuggestionsForPolicy) GetPolicySource() string { + if x != nil { + return x.PolicySource + } + return "" +} + +func (x *NodePolicySuggestionsForPolicy) GetSuggestions() []*NodePolicySuggestion { + if x != nil { + return x.Suggestions + } + return nil +} + +func (x *NodePolicySuggestionsForPolicy) GetContext() *SuggestionContext { + if x != nil { + return x.Context + } + return nil +} + +func (x *NodePolicySuggestionsForPolicy) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *NodePolicySuggestionsForPolicy) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +type NodePolicySuggestion struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // e.g., "m5.large", "Standard_D4s_v3" - ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" -} - -func (x *InstanceTypeName) Reset() { - *x = InstanceTypeName{} + // Stable rule identifier, e.g. "disruption.consolidation_policy". Stable across + // engine versions so the frontend can special-case rendering per rule. + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Group SuggestionGroup `protobuf:"varint,2,opt,name=group,proto3,enum=api.v1.SuggestionGroup" json:"group,omitempty"` + Flavor SuggestionFlavor `protobuf:"varint,3,opt,name=flavor,proto3,enum=api.v1.SuggestionFlavor" json:"flavor,omitempty"` + Severity SuggestionSeverity `protobuf:"varint,4,opt,name=severity,proto3,enum=api.v1.SuggestionSeverity" json:"severity,omitempty"` + // NodePolicy field the suggestion mutates, as a proto field path relative to + // NodePolicy, e.g. "disruption.consolidate_after", "capacity_types" or "limits.cpu". + // This names the FIRST (or only) field the suggestion changes; additional_field_changes + // below carries the rest for the rare suggestion that changes more than one. Two + // guarantees the per-card accept in the UI depends on, over the union of this path and + // every additional_field_changes[].field_path. First, the paths name exactly what this + // suggestion changes and nothing more: taking `original` and copying only these paths' + // values out of `suggested` yields the same policy as applying this one suggestion, so a + // card can be accepted on its own. Second, at most one suggestion per response claims a + // given path, and no claimed path is an ancestor of another — "limits" and "limits.cpu" + // never both appear — so accepting one card can never carry a neighbouring card's change + // with it. A rule with a finding on fields that do not belong together emits separate + // suggestions instead of naming their parent. + // + // Empty for a SUGGESTION_GROUP_COVERAGE suggestion, the one deliberate exception: it names + // no field because it does not mutate this NodePolicy at all. current_value_yaml and + // suggested_value_yaml are empty for the same reason. + FieldPath string `protobuf:"bytes,5,opt,name=field_path,json=fieldPath,proto3" json:"field_path,omitempty"` + Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"` + // Detailed explanation of why this change is being suggested, written against the + // cited evidence. Rendered as the card body. + Rationale string `protobuf:"bytes,7,opt,name=rationale,proto3" json:"rationale,omitempty"` + // Display-ready YAML renderings of the field's current and suggested values, for + // field_path above. + CurrentValueYaml string `protobuf:"bytes,8,opt,name=current_value_yaml,json=currentValueYaml,proto3" json:"current_value_yaml,omitempty"` + SuggestedValueYaml string `protobuf:"bytes,9,opt,name=suggested_value_yaml,json=suggestedValueYaml,proto3" json:"suggested_value_yaml,omitempty"` + Evidence []*SuggestionEvidence `protobuf:"bytes,10,rep,name=evidence,proto3" json:"evidence,omitempty"` + // A directly attributable, non-overlapping monthly saving: a price delta (spot vs + // on-demand, gp2 vs gp3, a cheaper eligible candidate) applied to a known quantity. Safe + // to sum across every suggestion in a response, including others on the same policy, + // because each rule that sets this draws from its own independent price comparison — + // never from a shared, policy-wide figure two rules could both cite. + EstimatedMonthlySavingsUsd *float64 `protobuf:"fixed64,11,opt,name=estimated_monthly_savings_usd,json=estimatedMonthlySavingsUsd,proto3,oneof" json:"estimated_monthly_savings_usd,omitempty"` + // Additional NodePolicy fields this suggestion mutates together with field_path, when + // loosening several selector fields as one combination fits the population better than + // loosening any single one. Empty for almost every suggestion; see field_path's comment + // for the guarantees that apply across the whole set. + AdditionalFieldChanges []*SuggestionFieldChange `protobuf:"bytes,12,rep,name=additional_field_changes,json=additionalFieldChanges,proto3" json:"additional_field_changes,omitempty"` + // The most this suggestion could save if fully realized, for a rule whose saving is real + // but not directly attributable to this one change: reclaiming a pool's idle capacity + // (disruption.consolidation_policy, disruption.consolidate_after, disruption.budgets, + // requirements.size_mismatch) all draw the same ceiling from that pool's own idle spend, + // since each only widens Karpenter's ability to reclaim it rather than guaranteeing it + // does. Unlike estimated_monthly_savings_usd, this is NOT safe to sum across a policy: + // when more than one suggestion on the same policy sets it, the true ceiling is the + // maximum across them, not their total, because they are bounds on the same underlying + // capacity rather than independent savings. A rule never sets both this and + // estimated_monthly_savings_usd on the same suggestion. + UpperBoundMonthlySavingsUsd *float64 `protobuf:"fixed64,13,opt,name=upper_bound_monthly_savings_usd,json=upperBoundMonthlySavingsUsd,proto3,oneof" json:"upper_bound_monthly_savings_usd,omitempty"` +} + +func (x *NodePolicySuggestion) Reset() { + *x = NodePolicySuggestion{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[247] + mi := &file_api_v1_recommendation_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceTypeName) String() string { +func (x *NodePolicySuggestion) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceTypeName) ProtoMessage() {} +func (*NodePolicySuggestion) ProtoMessage() {} -func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[247] +func (x *NodePolicySuggestion) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[262] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20010,97 +23347,134 @@ func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceTypeName.ProtoReflect.Descriptor instead. -func (*InstanceTypeName) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} +// Deprecated: Use NodePolicySuggestion.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestion) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{262} } -func (x *InstanceTypeName) GetName() string { +func (x *NodePolicySuggestion) GetRuleId() string { if x != nil { - return x.Name + return x.RuleId } return "" } -func (x *InstanceTypeName) GetProviderName() string { +func (x *NodePolicySuggestion) GetGroup() SuggestionGroup { if x != nil { - return x.ProviderName + return x.Group } - return "" + return SuggestionGroup_SUGGESTION_GROUP_UNSPECIFIED } -type GetInstanceCategoriesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicySuggestion) GetFlavor() SuggestionFlavor { + if x != nil { + return x.Flavor + } + return SuggestionFlavor_SUGGESTION_FLAVOR_UNSPECIFIED +} - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` +func (x *NodePolicySuggestion) GetSeverity() SuggestionSeverity { + if x != nil { + return x.Severity + } + return SuggestionSeverity_SUGGESTION_SEVERITY_UNSPECIFIED } -func (x *GetInstanceCategoriesRequest) Reset() { - *x = GetInstanceCategoriesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[248] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicySuggestion) GetFieldPath() string { + if x != nil { + return x.FieldPath } + return "" } -func (x *GetInstanceCategoriesRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicySuggestion) GetTitle() string { + if x != nil { + return x.Title + } + return "" } -func (*GetInstanceCategoriesRequest) ProtoMessage() {} +func (x *NodePolicySuggestion) GetRationale() string { + if x != nil { + return x.Rationale + } + return "" +} -func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[248] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicySuggestion) GetCurrentValueYaml() string { + if x != nil { + return x.CurrentValueYaml } - return mi.MessageOf(x) + return "" } -// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{248} +func (x *NodePolicySuggestion) GetSuggestedValueYaml() string { + if x != nil { + return x.SuggestedValueYaml + } + return "" } -func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { +func (x *NodePolicySuggestion) GetEvidence() []*SuggestionEvidence { if x != nil { - return x.CloudProviders + return x.Evidence } return nil } -type GetInstanceCategoriesResponse struct { +func (x *NodePolicySuggestion) GetEstimatedMonthlySavingsUsd() float64 { + if x != nil && x.EstimatedMonthlySavingsUsd != nil { + return *x.EstimatedMonthlySavingsUsd + } + return 0 +} + +func (x *NodePolicySuggestion) GetAdditionalFieldChanges() []*SuggestionFieldChange { + if x != nil { + return x.AdditionalFieldChanges + } + return nil +} + +func (x *NodePolicySuggestion) GetUpperBoundMonthlySavingsUsd() float64 { + if x != nil && x.UpperBoundMonthlySavingsUsd != nil { + return *x.UpperBoundMonthlySavingsUsd + } + return 0 +} + +// SuggestionFieldChange is one additional NodePolicy field a suggestion mutates, beyond +// field_path/current_value_yaml/suggested_value_yaml on NodePolicySuggestion, which always +// name the first (or only) one. Almost every suggestion touches exactly one field and +// leaves NodePolicySuggestion.additional_field_changes empty; only a combination-search +// suggestion (currently just requirements.overpinned) populates it. +type SuggestionFieldChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` + FieldPath string `protobuf:"bytes,1,opt,name=field_path,json=fieldPath,proto3" json:"field_path,omitempty"` + CurrentValueYaml string `protobuf:"bytes,2,opt,name=current_value_yaml,json=currentValueYaml,proto3" json:"current_value_yaml,omitempty"` + SuggestedValueYaml string `protobuf:"bytes,3,opt,name=suggested_value_yaml,json=suggestedValueYaml,proto3" json:"suggested_value_yaml,omitempty"` } -func (x *GetInstanceCategoriesResponse) Reset() { - *x = GetInstanceCategoriesResponse{} +func (x *SuggestionFieldChange) Reset() { + *x = SuggestionFieldChange{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[249] + mi := &file_api_v1_recommendation_proto_msgTypes[263] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCategoriesResponse) String() string { +func (x *SuggestionFieldChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCategoriesResponse) ProtoMessage() {} +func (*SuggestionFieldChange) ProtoMessage() {} -func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[249] +func (x *SuggestionFieldChange) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[263] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20111,43 +23485,70 @@ func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCategoriesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceCategoriesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{249} +// Deprecated: Use SuggestionFieldChange.ProtoReflect.Descriptor instead. +func (*SuggestionFieldChange) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{263} } -func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { +func (x *SuggestionFieldChange) GetFieldPath() string { if x != nil { - return x.InstanceCategories + return x.FieldPath } - return nil + return "" } -type GetInstanceCPUsRequest struct { +func (x *SuggestionFieldChange) GetCurrentValueYaml() string { + if x != nil { + return x.CurrentValueYaml + } + return "" +} + +func (x *SuggestionFieldChange) GetSuggestedValueYaml() string { + if x != nil { + return x.SuggestedValueYaml + } + return "" +} + +// SuggestionEvidence is one observed data point cited by a suggestion, e.g. +// label="p95 CPU utilization (7d)", value="22%", detail="across 14 nodes managed by +// nodepool workers-a". +type SuggestionEvidence struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` + Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Detail string `protobuf:"bytes,3,opt,name=detail,proto3" json:"detail,omitempty"` + Scope EvidenceScope `protobuf:"varint,4,opt,name=scope,proto3,enum=api.v1.EvidenceScope" json:"scope,omitempty"` + // The workloads this citation names, in the order they appear in `detail` and in + // the rationale. Carries the identity behind the "namespace/name" text so the UI + // can open each one's drawer, which needs the uid and kind that the display + // string drops. Empty for citations about nodes or pricing rather than + // workloads, and for a workload whose metadata read missed it (the display + // string falls back to a bare uid there, and the drawer needs the kind too). + Workloads []*SuggestionWorkloadRef `protobuf:"bytes,5,rep,name=workloads,proto3" json:"workloads,omitempty"` } -func (x *GetInstanceCPUsRequest) Reset() { - *x = GetInstanceCPUsRequest{} +func (x *SuggestionEvidence) Reset() { + *x = SuggestionEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[250] + mi := &file_api_v1_recommendation_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCPUsRequest) String() string { +func (x *SuggestionEvidence) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCPUsRequest) ProtoMessage() {} +func (*SuggestionEvidence) ProtoMessage() {} -func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[250] +func (x *SuggestionEvidence) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[264] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20158,43 +23559,84 @@ func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCPUsRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceCPUsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} +// Deprecated: Use SuggestionEvidence.ProtoReflect.Descriptor instead. +func (*SuggestionEvidence) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{264} } -func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { +func (x *SuggestionEvidence) GetLabel() string { if x != nil { - return x.CloudProviders + return x.Label + } + return "" +} + +func (x *SuggestionEvidence) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *SuggestionEvidence) GetDetail() string { + if x != nil { + return x.Detail + } + return "" +} + +func (x *SuggestionEvidence) GetScope() EvidenceScope { + if x != nil { + return x.Scope + } + return EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED +} + +func (x *SuggestionEvidence) GetWorkloads() []*SuggestionWorkloadRef { + if x != nil { + return x.Workloads } return nil } -type GetInstanceCPUsResponse struct { +// SuggestionWorkloadRef identifies one workload named by a suggestion well enough +// to open its drawer: the panel takes uid, kind and the cluster the suggestion was +// computed for. +type SuggestionWorkloadRef struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` + Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"` + // Kubernetes kind as written on the owner ("Deployment", "StatefulSet"), not the + // K8sObjectKind enum: this is passed straight to GetWorkload, which matches on + // the string. + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // Exactly the text this workload appears as in `detail` and in the rationale, so + // the UI links the same token the sentence was written with instead of + // reassembling one and hoping it matches. + Display string `protobuf:"bytes,5,opt,name=display,proto3" json:"display,omitempty"` } -func (x *GetInstanceCPUsResponse) Reset() { - *x = GetInstanceCPUsResponse{} +func (x *SuggestionWorkloadRef) Reset() { + *x = SuggestionWorkloadRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[251] + mi := &file_api_v1_recommendation_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCPUsResponse) String() string { +func (x *SuggestionWorkloadRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCPUsResponse) ProtoMessage() {} +func (*SuggestionWorkloadRef) ProtoMessage() {} -func (x *GetInstanceCPUsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[251] +func (x *SuggestionWorkloadRef) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[265] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20205,43 +23647,87 @@ func (x *GetInstanceCPUsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{251} +// Deprecated: Use SuggestionWorkloadRef.ProtoReflect.Descriptor instead. +func (*SuggestionWorkloadRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{265} } -func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { +func (x *SuggestionWorkloadRef) GetUid() string { if x != nil { - return x.InstanceCpus + return x.Uid } - return nil + return "" } -type GetInstanceTypeNamesRequest struct { +func (x *SuggestionWorkloadRef) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SuggestionWorkloadRef) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SuggestionWorkloadRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SuggestionWorkloadRef) GetDisplay() string { + if x != nil { + return x.Display + } + return "" +} + +// SuggestionContext describes the evidence population a suggestion run was computed +// against, so the UI can qualify the results ("based on 14 nodes across 2 nodepools, +// last 7d, 23 workload profiles"). +type SuggestionContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + // Live NodePool names attributed to the policy via the dakr.devzero.io/node-policy-id + // annotation. Empty on cold-start. + MatchedNodePools []string `protobuf:"bytes,2,rep,name=matched_node_pools,json=matchedNodePools,proto3" json:"matched_node_pools,omitempty"` + NodeCount int32 `protobuf:"varint,3,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` + EvidenceScope EvidenceScope `protobuf:"varint,4,opt,name=evidence_scope,json=evidenceScope,proto3,enum=api.v1.EvidenceScope" json:"evidence_scope,omitempty"` + // Number of fresh workload profile snapshots that informed the run. + WorkloadProfileCount int32 `protobuf:"varint,5,opt,name=workload_profile_count,json=workloadProfileCount,proto3" json:"workload_profile_count,omitempty"` + // For cluster-managed policies only: NodePool requirement keys present on the + // customer's CRD that this policy view cannot represent (Azure/GCP SKU keys, + // custom label requirements). Non-empty means both the suggestions and the + // compiled preview describe a partial picture of the real NodePool, and the + // UI should say so. Always empty for dakr-authored policies. + UnrepresentedRequirementKeys []string `protobuf:"bytes,6,rep,name=unrepresented_requirement_keys,json=unrepresentedRequirementKeys,proto3" json:"unrepresented_requirement_keys,omitempty"` } -func (x *GetInstanceTypeNamesRequest) Reset() { - *x = GetInstanceTypeNamesRequest{} +func (x *SuggestionContext) Reset() { + *x = SuggestionContext{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[252] + mi := &file_api_v1_recommendation_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceTypeNamesRequest) String() string { +func (x *SuggestionContext) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceTypeNamesRequest) ProtoMessage() {} +func (*SuggestionContext) ProtoMessage() {} -func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[252] +func (x *SuggestionContext) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[266] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20252,91 +23738,80 @@ func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceTypeNamesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceTypeNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{252} +// Deprecated: Use SuggestionContext.ProtoReflect.Descriptor instead. +func (*SuggestionContext) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} } -func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { +func (x *SuggestionContext) GetWindow() ProfileWindow { if x != nil { - return x.CloudProviders + return x.Window } - return nil -} - -type GetInstanceTypeNamesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED } -func (x *GetInstanceTypeNamesResponse) Reset() { - *x = GetInstanceTypeNamesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[253] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *SuggestionContext) GetMatchedNodePools() []string { + if x != nil { + return x.MatchedNodePools } + return nil } -func (x *GetInstanceTypeNamesResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *SuggestionContext) GetNodeCount() int32 { + if x != nil { + return x.NodeCount + } + return 0 } -func (*GetInstanceTypeNamesResponse) ProtoMessage() {} - -func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[253] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SuggestionContext) GetEvidenceScope() EvidenceScope { + if x != nil { + return x.EvidenceScope } - return mi.MessageOf(x) + return EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED } -// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{253} +func (x *SuggestionContext) GetWorkloadProfileCount() int32 { + if x != nil { + return x.WorkloadProfileCount + } + return 0 } -func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { +func (x *SuggestionContext) GetUnrepresentedRequirementKeys() []string { if x != nil { - return x.InstanceTypes + return x.UnrepresentedRequirementKeys } return nil } -type SubnetSelectorTerm struct { +type GetAvailableKindsByTargetingFiltersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + TargetFilters *TargetFilters `protobuf:"bytes,3,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` } -func (x *SubnetSelectorTerm) Reset() { - *x = SubnetSelectorTerm{} +func (x *GetAvailableKindsByTargetingFiltersRequest) Reset() { + *x = GetAvailableKindsByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[254] + mi := &file_api_v1_recommendation_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SubnetSelectorTerm) String() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SubnetSelectorTerm) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} -func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[254] +func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[267] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20347,52 +23822,62 @@ func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SubnetSelectorTerm.ProtoReflect.Descriptor instead. -func (*SubnetSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{254} +// Deprecated: Use GetAvailableKindsByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{267} } -func (x *SubnetSelectorTerm) GetTags() map[string]string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Tags + return x.TeamId + } + return "" +} + +func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } return nil } -func (x *SubnetSelectorTerm) GetId() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.Id + return x.TargetFilters } - return "" + return nil } -type SecurityGroupSelectorTerm struct { +// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria +type SearchResourcesByTargetingFiltersRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` // Unique identifier for the team. + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // Unique identifiers for the clusters. + SearchQuery string `protobuf:"bytes,3,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"` // Search term to match against resources. + TargetFilterType TargetFilterType `protobuf:"varint,4,opt,name=target_filter_type,json=targetFilterType,proto3,enum=api.v1.TargetFilterType" json:"target_filter_type,omitempty"` // Type of filter to apply. + TargetFilters *TargetFilters `protobuf:"bytes,5,opt,name=target_filters,json=targetFilters,proto3" json:"target_filters,omitempty"` } -func (x *SecurityGroupSelectorTerm) Reset() { - *x = SecurityGroupSelectorTerm{} +func (x *SearchResourcesByTargetingFiltersRequest) Reset() { + *x = SearchResourcesByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[255] + mi := &file_api_v1_recommendation_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SecurityGroupSelectorTerm) String() string { +func (x *SearchResourcesByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SecurityGroupSelectorTerm) ProtoMessage() {} +func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} -func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[255] +func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[268] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20403,125 +23888,79 @@ func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. -func (*SecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{255} +// Deprecated: Use SearchResourcesByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{268} } -func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Tags + return x.TeamId } - return nil + return "" } -func (x *SecurityGroupSelectorTerm) GetId() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetClusterIds() []string { if x != nil { - return x.Id + return x.ClusterIds } - return "" + return nil } -func (x *SecurityGroupSelectorTerm) GetName() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetSearchQuery() string { if x != nil { - return x.Name + return x.SearchQuery } return "" } -type CapacityReservationSelectorTerm struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` -} - -func (x *CapacityReservationSelectorTerm) Reset() { - *x = CapacityReservationSelectorTerm{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[256] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CapacityReservationSelectorTerm) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CapacityReservationSelectorTerm) ProtoMessage() {} - -func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[256] - 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 CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. -func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{256} -} - -func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { - if x != nil { - return x.Tags - } - return nil -} - -func (x *CapacityReservationSelectorTerm) GetId() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilterType() TargetFilterType { if x != nil { - return x.Id + return x.TargetFilterType } - return "" + return TargetFilterType_TARGET_FILTER_TYPE_UNSPECIFIED } -func (x *CapacityReservationSelectorTerm) GetOwnerId() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.OwnerId + return x.TargetFilters } - return "" + return nil } -type AMISelectorTerm struct { +type TargetFilters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - SsmParameter string `protobuf:"bytes,6,opt,name=ssm_parameter,json=ssmParameter,proto3" json:"ssm_parameter,omitempty"` + NamespaceNames []string `protobuf:"bytes,1,rep,name=namespace_names,json=namespaceNames,proto3" json:"namespace_names,omitempty"` + // optional LabelSelector namespace_selector = 1; // Target namespaces by labels + // optional LabelSelector annotation_selector = 2; // Target workloads by annotations + WorkloadNames []string `protobuf:"bytes,2,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` + NodeGroupNames []string `protobuf:"bytes,3,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` + Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + KindFilter []K8SObjectKind `protobuf:"varint,5,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` // Target specific workload kinds + NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` // Target workloads by name pattern + NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` // Target namespaces by name pattern } -func (x *AMISelectorTerm) Reset() { - *x = AMISelectorTerm{} +func (x *TargetFilters) Reset() { + *x = TargetFilters{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[257] + mi := &file_api_v1_recommendation_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AMISelectorTerm) String() string { +func (x *TargetFilters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AMISelectorTerm) ProtoMessage() {} +func (*TargetFilters) ProtoMessage() {} -func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[257] +func (x *TargetFilters) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[269] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20532,89 +23971,85 @@ func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AMISelectorTerm.ProtoReflect.Descriptor instead. -func (*AMISelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{257} +// Deprecated: Use TargetFilters.ProtoReflect.Descriptor instead. +func (*TargetFilters) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{269} } -func (x *AMISelectorTerm) GetAlias() string { +func (x *TargetFilters) GetNamespaceNames() []string { if x != nil { - return x.Alias + return x.NamespaceNames } - return "" + return nil } -func (x *AMISelectorTerm) GetTags() map[string]string { +func (x *TargetFilters) GetWorkloadNames() []string { if x != nil { - return x.Tags + return x.WorkloadNames } return nil } -func (x *AMISelectorTerm) GetId() string { +func (x *TargetFilters) GetNodeGroupNames() []string { if x != nil { - return x.Id + return x.NodeGroupNames } - return "" + return nil } -func (x *AMISelectorTerm) GetName() string { +func (x *TargetFilters) GetLabels() []string { if x != nil { - return x.Name + return x.Labels } - return "" + return nil } -func (x *AMISelectorTerm) GetOwner() string { +func (x *TargetFilters) GetKindFilter() []K8SObjectKind { if x != nil { - return x.Owner + return x.KindFilter } - return "" + return nil } -func (x *AMISelectorTerm) GetSsmParameter() string { +func (x *TargetFilters) GetNamePattern() *RegexPattern { if x != nil { - return x.SsmParameter + return x.NamePattern } - return "" + return nil } -type KubeletConfiguration struct { +func (x *TargetFilters) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +type GetAvailableKindsByTargetingFiltersResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterDns []string `protobuf:"bytes,1,rep,name=cluster_dns,json=clusterDns,proto3" json:"cluster_dns,omitempty"` - MaxPods *int32 `protobuf:"varint,2,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` - PodsPerCore *int32 `protobuf:"varint,3,opt,name=pods_per_core,json=podsPerCore,proto3,oneof" json:"pods_per_core,omitempty"` - SystemReserved map[string]string `protobuf:"bytes,4,rep,name=system_reserved,json=systemReserved,proto3" json:"system_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - KubeReserved map[string]string `protobuf:"bytes,5,rep,name=kube_reserved,json=kubeReserved,proto3" json:"kube_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionHard map[string]string `protobuf:"bytes,6,rep,name=eviction_hard,json=evictionHard,proto3" json:"eviction_hard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionSoft map[string]string `protobuf:"bytes,7,rep,name=eviction_soft,json=evictionSoft,proto3" json:"eviction_soft,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionSoftGracePeriod map[string]string `protobuf:"bytes,8,rep,name=eviction_soft_grace_period,json=evictionSoftGracePeriod,proto3" json:"eviction_soft_grace_period,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - EvictionMaxPodGracePeriod *int32 `protobuf:"varint,9,opt,name=eviction_max_pod_grace_period,json=evictionMaxPodGracePeriod,proto3,oneof" json:"eviction_max_pod_grace_period,omitempty"` - ImageGcHighThresholdPercent *int32 `protobuf:"varint,10,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` - ImageGcLowThresholdPercent *int32 `protobuf:"varint,11,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` - CpuCfsQuota *bool `protobuf:"varint,12,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` + Kinds []K8SObjectKind `protobuf:"varint,1,rep,packed,name=kinds,proto3,enum=api.v1.K8SObjectKind" json:"kinds,omitempty"` } -func (x *KubeletConfiguration) Reset() { - *x = KubeletConfiguration{} +func (x *GetAvailableKindsByTargetingFiltersResponse) Reset() { + *x = GetAvailableKindsByTargetingFiltersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[258] + mi := &file_api_v1_recommendation_proto_msgTypes[270] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KubeletConfiguration) String() string { +func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KubeletConfiguration) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} -func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[258] +func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[270] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20625,122 +24060,114 @@ func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KubeletConfiguration.ProtoReflect.Descriptor instead. -func (*KubeletConfiguration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{258} +// Deprecated: Use GetAvailableKindsByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{270} } -func (x *KubeletConfiguration) GetClusterDns() []string { +func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { if x != nil { - return x.ClusterDns + return x.Kinds } return nil } -func (x *KubeletConfiguration) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods - } - return 0 +type SearchResourcesByTargetingFiltersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespaces []*NamespaceSearchResult `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + Workloads []*WorkloadSearchResult `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` + NodeGroups []*NodeGroupSearchResult `protobuf:"bytes,3,rep,name=node_groups,json=nodeGroups,proto3" json:"node_groups,omitempty"` + Labels []*LabelSearchResult `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` } -func (x *KubeletConfiguration) GetPodsPerCore() int32 { - if x != nil && x.PodsPerCore != nil { - return *x.PodsPerCore +func (x *SearchResourcesByTargetingFiltersResponse) Reset() { + *x = SearchResourcesByTargetingFiltersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[271] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *KubeletConfiguration) GetSystemReserved() map[string]string { - if x != nil { - return x.SystemReserved - } - return nil +func (x *SearchResourcesByTargetingFiltersResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *KubeletConfiguration) GetKubeReserved() map[string]string { - if x != nil { - return x.KubeReserved +func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} + +func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[271] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *KubeletConfiguration) GetEvictionHard() map[string]string { - if x != nil { - return x.EvictionHard - } - return nil +// Deprecated: Use SearchResourcesByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{271} } -func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { +func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { if x != nil { - return x.EvictionSoft + return x.Namespaces } return nil } -func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { +func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { if x != nil { - return x.EvictionSoftGracePeriod + return x.Workloads } return nil } -func (x *KubeletConfiguration) GetEvictionMaxPodGracePeriod() int32 { - if x != nil && x.EvictionMaxPodGracePeriod != nil { - return *x.EvictionMaxPodGracePeriod - } - return 0 -} - -func (x *KubeletConfiguration) GetImageGcHighThresholdPercent() int32 { - if x != nil && x.ImageGcHighThresholdPercent != nil { - return *x.ImageGcHighThresholdPercent - } - return 0 -} - -func (x *KubeletConfiguration) GetImageGcLowThresholdPercent() int32 { - if x != nil && x.ImageGcLowThresholdPercent != nil { - return *x.ImageGcLowThresholdPercent +func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { + if x != nil { + return x.NodeGroups } - return 0 + return nil } -func (x *KubeletConfiguration) GetCpuCfsQuota() bool { - if x != nil && x.CpuCfsQuota != nil { - return *x.CpuCfsQuota +func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { + if x != nil { + return x.Labels } - return false + return nil } -type BlockDeviceMapping struct { +type NamespaceSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceName *string `protobuf:"bytes,1,opt,name=device_name,json=deviceName,proto3,oneof" json:"device_name,omitempty"` - Ebs *BlockDevice `protobuf:"bytes,2,opt,name=ebs,proto3,oneof" json:"ebs,omitempty"` - RootVolume *bool `protobuf:"varint,3,opt,name=root_volume,json=rootVolume,proto3,oneof" json:"root_volume,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *BlockDeviceMapping) Reset() { - *x = BlockDeviceMapping{} +func (x *NamespaceSearchResult) Reset() { + *x = NamespaceSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[259] + mi := &file_api_v1_recommendation_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDeviceMapping) String() string { +func (x *NamespaceSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDeviceMapping) ProtoMessage() {} +func (*NamespaceSearchResult) ProtoMessage() {} -func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[259] +func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[272] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20751,65 +24178,44 @@ func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BlockDeviceMapping.ProtoReflect.Descriptor instead. -func (*BlockDeviceMapping) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{259} -} - -func (x *BlockDeviceMapping) GetDeviceName() string { - if x != nil && x.DeviceName != nil { - return *x.DeviceName - } - return "" +// Deprecated: Use NamespaceSearchResult.ProtoReflect.Descriptor instead. +func (*NamespaceSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{272} } -func (x *BlockDeviceMapping) GetEbs() *BlockDevice { +func (x *NamespaceSearchResult) GetName() string { if x != nil { - return x.Ebs - } - return nil -} - -func (x *BlockDeviceMapping) GetRootVolume() bool { - if x != nil && x.RootVolume != nil { - return *x.RootVolume + return x.Name } - return false + return "" } -type BlockDevice struct { +type WorkloadSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeleteOnTermination *bool `protobuf:"varint,1,opt,name=delete_on_termination,json=deleteOnTermination,proto3,oneof" json:"delete_on_termination,omitempty"` - Encrypted *bool `protobuf:"varint,2,opt,name=encrypted,proto3,oneof" json:"encrypted,omitempty"` - Iops *int64 `protobuf:"varint,3,opt,name=iops,proto3,oneof" json:"iops,omitempty"` - KmsKeyId *string `protobuf:"bytes,4,opt,name=kms_key_id,json=kmsKeyId,proto3,oneof" json:"kms_key_id,omitempty"` - SnapshotId *string `protobuf:"bytes,5,opt,name=snapshot_id,json=snapshotId,proto3,oneof" json:"snapshot_id,omitempty"` - Throughput *int64 `protobuf:"varint,6,opt,name=throughput,proto3,oneof" json:"throughput,omitempty"` - VolumeInitializationRate *int32 `protobuf:"varint,7,opt,name=volume_initialization_rate,json=volumeInitializationRate,proto3,oneof" json:"volume_initialization_rate,omitempty"` - VolumeSize *string `protobuf:"bytes,8,opt,name=volume_size,json=volumeSize,proto3,oneof" json:"volume_size,omitempty"` - VolumeType *string `protobuf:"bytes,9,opt,name=volume_type,json=volumeType,proto3,oneof" json:"volume_type,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *BlockDevice) Reset() { - *x = BlockDevice{} +func (x *WorkloadSearchResult) Reset() { + *x = WorkloadSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[260] + mi := &file_api_v1_recommendation_proto_msgTypes[273] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDevice) String() string { +func (x *WorkloadSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDevice) ProtoMessage() {} +func (*WorkloadSearchResult) ProtoMessage() {} -func (x *BlockDevice) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[260] +func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[273] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20820,102 +24226,98 @@ func (x *BlockDevice) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BlockDevice.ProtoReflect.Descriptor instead. -func (*BlockDevice) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{260} +// Deprecated: Use WorkloadSearchResult.ProtoReflect.Descriptor instead. +func (*WorkloadSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{273} } -func (x *BlockDevice) GetDeleteOnTermination() bool { - if x != nil && x.DeleteOnTermination != nil { - return *x.DeleteOnTermination +func (x *WorkloadSearchResult) GetKind() string { + if x != nil { + return x.Kind } - return false + return "" } -func (x *BlockDevice) GetEncrypted() bool { - if x != nil && x.Encrypted != nil { - return *x.Encrypted +func (x *WorkloadSearchResult) GetName() string { + if x != nil { + return x.Name } - return false + return "" } -func (x *BlockDevice) GetIops() int64 { - if x != nil && x.Iops != nil { - return *x.Iops - } - return 0 -} +type NodeGroupSearchResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *BlockDevice) GetKmsKeyId() string { - if x != nil && x.KmsKeyId != nil { - return *x.KmsKeyId - } - return "" + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *BlockDevice) GetSnapshotId() string { - if x != nil && x.SnapshotId != nil { - return *x.SnapshotId +func (x *NodeGroupSearchResult) Reset() { + *x = NodeGroupSearchResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[274] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *BlockDevice) GetThroughput() int64 { - if x != nil && x.Throughput != nil { - return *x.Throughput - } - return 0 +func (x *NodeGroupSearchResult) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *BlockDevice) GetVolumeInitializationRate() int32 { - if x != nil && x.VolumeInitializationRate != nil { - return *x.VolumeInitializationRate +func (*NodeGroupSearchResult) ProtoMessage() {} + +func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[274] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *BlockDevice) GetVolumeSize() string { - if x != nil && x.VolumeSize != nil { - return *x.VolumeSize - } - return "" +// Deprecated: Use NodeGroupSearchResult.ProtoReflect.Descriptor instead. +func (*NodeGroupSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{274} } -func (x *BlockDevice) GetVolumeType() string { - if x != nil && x.VolumeType != nil { - return *x.VolumeType +func (x *NodeGroupSearchResult) GetName() string { + if x != nil { + return x.Name } return "" } -type MetadataOptions struct { +type LabelSearchResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - HttpEndpoint *string `protobuf:"bytes,1,opt,name=http_endpoint,json=httpEndpoint,proto3,oneof" json:"http_endpoint,omitempty"` - HttpProtocolIpv6 *string `protobuf:"bytes,2,opt,name=http_protocol_ipv6,json=httpProtocolIpv6,proto3,oneof" json:"http_protocol_ipv6,omitempty"` - HttpPutResponseHopLimit *int64 `protobuf:"varint,3,opt,name=http_put_response_hop_limit,json=httpPutResponseHopLimit,proto3,oneof" json:"http_put_response_hop_limit,omitempty"` - HttpTokens *string `protobuf:"bytes,4,opt,name=http_tokens,json=httpTokens,proto3,oneof" json:"http_tokens,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (x *MetadataOptions) Reset() { - *x = MetadataOptions{} +func (x *LabelSearchResult) Reset() { + *x = LabelSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[261] + mi := &file_api_v1_recommendation_proto_msgTypes[275] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetadataOptions) String() string { +func (x *LabelSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetadataOptions) ProtoMessage() {} +func (*LabelSearchResult) ProtoMessage() {} -func (x *MetadataOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[261] +func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[275] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20926,71 +24328,50 @@ func (x *MetadataOptions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. -func (*MetadataOptions) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{261} -} - -func (x *MetadataOptions) GetHttpEndpoint() string { - if x != nil && x.HttpEndpoint != nil { - return *x.HttpEndpoint - } - return "" +// Deprecated: Use LabelSearchResult.ProtoReflect.Descriptor instead. +func (*LabelSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{275} } -func (x *MetadataOptions) GetHttpProtocolIpv6() string { - if x != nil && x.HttpProtocolIpv6 != nil { - return *x.HttpProtocolIpv6 +func (x *LabelSearchResult) GetKey() string { + if x != nil { + return x.Key } return "" } -func (x *MetadataOptions) GetHttpPutResponseHopLimit() int64 { - if x != nil && x.HttpPutResponseHopLimit != nil { - return *x.HttpPutResponseHopLimit - } - return 0 -} - -func (x *MetadataOptions) GetHttpTokens() string { - if x != nil && x.HttpTokens != nil { - return *x.HttpTokens +func (x *LabelSearchResult) GetValue() string { + if x != nil { + return x.Value } return "" } -type GCPNodeClassSpec struct { +type CreateNodePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ServiceAccount string `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` - ImageSelectorTerms []*GCPImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector_terms,json=imageSelectorTerms,proto3" json:"image_selector_terms,omitempty"` - ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` - KubeletConfiguration *KubeletConfiguration `protobuf:"bytes,4,opt,name=kubelet_configuration,json=kubeletConfiguration,proto3,oneof" json:"kubelet_configuration,omitempty"` - Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NetworkTags []string `protobuf:"bytes,7,rep,name=network_tags,json=networkTags,proto3" json:"network_tags,omitempty"` - Disks []*GCPDisk `protobuf:"bytes,8,rep,name=disks,proto3" json:"disks,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GCPNodeClassSpec) Reset() { - *x = GCPNodeClassSpec{} +func (x *CreateNodePolicyTargetsRequest) Reset() { + *x = CreateNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[262] + mi := &file_api_v1_recommendation_proto_msgTypes[276] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPNodeClassSpec) String() string { +func (x *CreateNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPNodeClassSpec) ProtoMessage() {} +func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} -func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[262] +func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[276] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21001,93 +24382,90 @@ func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPNodeClassSpec.ProtoReflect.Descriptor instead. -func (*GCPNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{262} +// Deprecated: Use CreateNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{276} } -func (x *GCPNodeClassSpec) GetServiceAccount() string { - if x != nil { - return x.ServiceAccount - } - return "" -} - -func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { +func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { if x != nil { - return x.ImageSelectorTerms + return x.Targets } return nil } -func (x *GCPNodeClassSpec) GetImageFamily() string { - if x != nil && x.ImageFamily != nil { - return *x.ImageFamily - } - return "" +type CreateNodePolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { - if x != nil { - return x.KubeletConfiguration +func (x *CreateNodePolicyTargetsResponse) Reset() { + *x = CreateNodePolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[277] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *GCPNodeClassSpec) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil +func (x *CreateNodePolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *GCPNodeClassSpec) GetMetadata() map[string]string { - if x != nil { - return x.Metadata +func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} + +func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[277] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *GCPNodeClassSpec) GetNetworkTags() []string { - if x != nil { - return x.NetworkTags - } - return nil +// Deprecated: Use CreateNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{277} } -func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { +func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.Disks + return x.Targets } return nil } -type GCPImageSelectorTerm struct { +type ListNodePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GCPImageSelectorTerm) Reset() { - *x = GCPImageSelectorTerm{} +func (x *ListNodePolicyTargetsRequest) Reset() { + *x = ListNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[263] + mi := &file_api_v1_recommendation_proto_msgTypes[278] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPImageSelectorTerm) String() string { +func (x *ListNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPImageSelectorTerm) ProtoMessage() {} +func (*ListNodePolicyTargetsRequest) ProtoMessage() {} -func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[263] +func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[278] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21098,54 +24476,43 @@ func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPImageSelectorTerm.ProtoReflect.Descriptor instead. -func (*GCPImageSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{263} -} - -func (x *GCPImageSelectorTerm) GetAlias() string { - if x != nil { - return x.Alias - } - return "" +// Deprecated: Use ListNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{278} } -func (x *GCPImageSelectorTerm) GetId() string { +func (x *ListNodePolicyTargetsRequest) GetTeamId() string { if x != nil { - return x.Id + return x.TeamId } return "" } -type GCPDisk struct { +type ListNodePolicyTargetsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SizeGib int32 `protobuf:"varint,1,opt,name=size_gib,json=sizeGib,proto3" json:"size_gib,omitempty"` - Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` - Boot bool `protobuf:"varint,3,opt,name=boot,proto3" json:"boot,omitempty"` - SecondaryBootImage string `protobuf:"bytes,4,opt,name=secondary_boot_image,json=secondaryBootImage,proto3" json:"secondary_boot_image,omitempty"` - SecondaryBootMode string `protobuf:"bytes,5,opt,name=secondary_boot_mode,json=secondaryBootMode,proto3" json:"secondary_boot_mode,omitempty"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GCPDisk) Reset() { - *x = GCPDisk{} +func (x *ListNodePolicyTargetsResponse) Reset() { + *x = ListNodePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[264] + mi := &file_api_v1_recommendation_proto_msgTypes[279] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPDisk) String() string { +func (x *ListNodePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPDisk) ProtoMessage() {} +func (*ListNodePolicyTargetsResponse) ProtoMessage() {} -func (x *GCPDisk) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[264] +func (x *ListNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[279] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21156,77 +24523,43 @@ func (x *GCPDisk) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPDisk.ProtoReflect.Descriptor instead. -func (*GCPDisk) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{264} -} - -func (x *GCPDisk) GetSizeGib() int32 { - if x != nil { - return x.SizeGib - } - return 0 -} - -func (x *GCPDisk) GetCategory() string { - if x != nil { - return x.Category - } - return "" -} - -func (x *GCPDisk) GetBoot() bool { - if x != nil { - return x.Boot - } - return false -} - -func (x *GCPDisk) GetSecondaryBootImage() string { - if x != nil { - return x.SecondaryBootImage - } - return "" +// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{279} } -func (x *GCPDisk) GetSecondaryBootMode() string { +func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.SecondaryBootMode + return x.Targets } - return "" + return nil } -type AzureNodeClassSpec struct { +type UpdateNodePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VnetSubnetId *string `protobuf:"bytes,1,opt,name=vnet_subnet_id,json=vnetSubnetId,proto3,oneof" json:"vnet_subnet_id,omitempty"` - OsDiskSizeGb *int32 `protobuf:"varint,2,opt,name=os_disk_size_gb,json=osDiskSizeGb,proto3,oneof" json:"os_disk_size_gb,omitempty"` - ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` // Ubuntu, Ubuntu2204, Ubuntu2404, AzureLinux - FipsMode *string `protobuf:"bytes,4,opt,name=fips_mode,json=fipsMode,proto3,oneof" json:"fips_mode,omitempty"` // FIPS or Disabled - Tags map[string]string `protobuf:"bytes,5,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Kubelet *AzureKubeletConfiguration `protobuf:"bytes,6,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` - MaxPods *int32 `protobuf:"varint,7,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *AzureNodeClassSpec) Reset() { - *x = AzureNodeClassSpec{} +func (x *UpdateNodePolicyTargetRequest) Reset() { + *x = UpdateNodePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[265] + mi := &file_api_v1_recommendation_proto_msgTypes[280] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureNodeClassSpec) String() string { +func (x *UpdateNodePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureNodeClassSpec) ProtoMessage() {} +func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} -func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[265] +func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[280] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21237,94 +24570,105 @@ func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AzureNodeClassSpec.ProtoReflect.Descriptor instead. -func (*AzureNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{265} +// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{280} } -func (x *AzureNodeClassSpec) GetVnetSubnetId() string { - if x != nil && x.VnetSubnetId != nil { - return *x.VnetSubnetId +func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { + if x != nil { + return x.Target } - return "" + return nil } -func (x *AzureNodeClassSpec) GetOsDiskSizeGb() int32 { - if x != nil && x.OsDiskSizeGb != nil { - return *x.OsDiskSizeGb - } - return 0 +type UpdateNodePolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *AzureNodeClassSpec) GetImageFamily() string { - if x != nil && x.ImageFamily != nil { - return *x.ImageFamily +func (x *UpdateNodePolicyTargetResponse) Reset() { + *x = UpdateNodePolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[281] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *AzureNodeClassSpec) GetFipsMode() string { - if x != nil && x.FipsMode != nil { - return *x.FipsMode - } - return "" +func (x *UpdateNodePolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *AzureNodeClassSpec) GetTags() map[string]string { - if x != nil { - return x.Tags +func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} + +func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[281] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { - if x != nil { - return x.Kubelet - } - return nil +// Deprecated: Use UpdateNodePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{281} } -func (x *AzureNodeClassSpec) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods +func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { + if x != nil { + return x.Target } - return 0 + return nil } -type AzureKubeletConfiguration struct { +type NodePolicyTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CpuManagerPolicy *string `protobuf:"bytes,1,opt,name=cpu_manager_policy,json=cpuManagerPolicy,proto3,oneof" json:"cpu_manager_policy,omitempty"` // none, static - CpuCfsQuota *bool `protobuf:"varint,2,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` - CpuCfsQuotaPeriod *string `protobuf:"bytes,3,opt,name=cpu_cfs_quota_period,json=cpuCfsQuotaPeriod,proto3,oneof" json:"cpu_cfs_quota_period,omitempty"` // e.g., "100ms" - ImageGcHighThresholdPercent *int32 `protobuf:"varint,4,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` - ImageGcLowThresholdPercent *int32 `protobuf:"varint,5,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` - TopologyManagerPolicy *string `protobuf:"bytes,6,opt,name=topology_manager_policy,json=topologyManagerPolicy,proto3,oneof" json:"topology_manager_policy,omitempty"` // restricted, best-effort, none, single-numa-node - AllowedUnsafeSysctls []string `protobuf:"bytes,7,rep,name=allowed_unsafe_sysctls,json=allowedUnsafeSysctls,proto3" json:"allowed_unsafe_sysctls,omitempty"` - ContainerLogMaxSize *string `protobuf:"bytes,8,opt,name=container_log_max_size,json=containerLogMaxSize,proto3,oneof" json:"container_log_max_size,omitempty"` // e.g., "50Mi" - ContainerLogMaxFiles *int32 `protobuf:"varint,9,opt,name=container_log_max_files,json=containerLogMaxFiles,proto3,oneof" json:"container_log_max_files,omitempty"` - PodPidsLimit *int64 `protobuf:"varint,10,opt,name=pod_pids_limit,json=podPidsLimit,proto3,oneof" json:"pod_pids_limit,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Invariant: at most 1 entry. Server rejects >1. Will be narrowed to a scalar once all clients migrate. + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // uuid[] + PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,11,opt,name=enabled,proto3" json:"enabled,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,110,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,111,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + DeletedAt *timestamppb.Timestamp `protobuf:"bytes,112,opt,name=deleted_at,json=deletedAt,proto3" json:"deleted_at,omitempty"` + // Runtime status conditions read from the compiled Karpenter NodePool in the + // target cluster (e.g. ZonalShiftReady / ZonalShiftActive). Populated by + // ListNodePolicyTargets via a join against k8s_karpenter_resources. Empty + // when no conditions are observed for this target. + Status *NodePolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` } -func (x *AzureKubeletConfiguration) Reset() { - *x = AzureKubeletConfiguration{} +func (x *NodePolicyTarget) Reset() { + *x = NodePolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[266] + mi := &file_api_v1_recommendation_proto_msgTypes[282] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureKubeletConfiguration) String() string { +func (x *NodePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureKubeletConfiguration) ProtoMessage() {} +func (*NodePolicyTarget) ProtoMessage() {} -func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[266] +func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[282] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21335,108 +24679,122 @@ func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AzureKubeletConfiguration.ProtoReflect.Descriptor instead. -func (*AzureKubeletConfiguration) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} +// Deprecated: Use NodePolicyTarget.ProtoReflect.Descriptor instead. +func (*NodePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{282} } -func (x *AzureKubeletConfiguration) GetCpuManagerPolicy() string { - if x != nil && x.CpuManagerPolicy != nil { - return *x.CpuManagerPolicy +func (x *NodePolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId } return "" } -func (x *AzureKubeletConfiguration) GetCpuCfsQuota() bool { - if x != nil && x.CpuCfsQuota != nil { - return *x.CpuCfsQuota +func (x *NodePolicyTarget) GetName() string { + if x != nil { + return x.Name } - return false + return "" } -func (x *AzureKubeletConfiguration) GetCpuCfsQuotaPeriod() string { - if x != nil && x.CpuCfsQuotaPeriod != nil { - return *x.CpuCfsQuotaPeriod +func (x *NodePolicyTarget) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *AzureKubeletConfiguration) GetImageGcHighThresholdPercent() int32 { - if x != nil && x.ImageGcHighThresholdPercent != nil { - return *x.ImageGcHighThresholdPercent +func (x *NodePolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId } - return 0 + return "" } -func (x *AzureKubeletConfiguration) GetImageGcLowThresholdPercent() int32 { - if x != nil && x.ImageGcLowThresholdPercent != nil { - return *x.ImageGcLowThresholdPercent +func (x *NodePolicyTarget) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } - return 0 + return nil } -func (x *AzureKubeletConfiguration) GetTopologyManagerPolicy() string { - if x != nil && x.TopologyManagerPolicy != nil { - return *x.TopologyManagerPolicy +func (x *NodePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId } return "" } -func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { +func (x *NodePolicyTarget) GetEnabled() bool { if x != nil { - return x.AllowedUnsafeSysctls + return x.Enabled + } + return false +} + +func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } return nil } -func (x *AzureKubeletConfiguration) GetContainerLogMaxSize() string { - if x != nil && x.ContainerLogMaxSize != nil { - return *x.ContainerLogMaxSize +func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt } - return "" + return nil } -func (x *AzureKubeletConfiguration) GetContainerLogMaxFiles() int32 { - if x != nil && x.ContainerLogMaxFiles != nil { - return *x.ContainerLogMaxFiles +func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { + if x != nil { + return x.DeletedAt } - return 0 + return nil } -func (x *AzureKubeletConfiguration) GetPodPidsLimit() int64 { - if x != nil && x.PodPidsLimit != nil { - return *x.PodPidsLimit +func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { + if x != nil { + return x.Status } - return 0 + return nil } -type OCIImageSelectorTerm struct { +type NodePolicyCondition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - CompartmentId string `protobuf:"bytes,3,opt,name=compartment_id,json=compartmentId,proto3" json:"compartment_id,omitempty"` + // e.g. "ZonalShiftReady", "ZonalShiftActive" + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // "True" | "False" | "Unknown" + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + // Machine-readable reason code (e.g. "Ready", "ZonePinned", "NoFallbackZones", + // "NoActiveShift", "AwayFrom", "ZoneConstraintConflict"). + Reason string `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` + // Human-readable detail (e.g. impacted zone names). + Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` + LastTransitionTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_transition_time,json=lastTransitionTime,proto3" json:"last_transition_time,omitempty"` } -func (x *OCIImageSelectorTerm) Reset() { - *x = OCIImageSelectorTerm{} +func (x *NodePolicyCondition) Reset() { + *x = NodePolicyCondition{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[267] + mi := &file_api_v1_recommendation_proto_msgTypes[283] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIImageSelectorTerm) String() string { +func (x *NodePolicyCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIImageSelectorTerm) ProtoMessage() {} +func (*NodePolicyCondition) ProtoMessage() {} -func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[267] +func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[283] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21447,58 +24805,71 @@ func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIImageSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCIImageSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{267} +// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. +func (*NodePolicyCondition) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{283} } -func (x *OCIImageSelectorTerm) GetId() string { +func (x *NodePolicyCondition) GetType() string { if x != nil { - return x.Id + return x.Type } return "" } -func (x *OCIImageSelectorTerm) GetName() string { +func (x *NodePolicyCondition) GetStatus() string { if x != nil { - return x.Name + return x.Status } return "" } -func (x *OCIImageSelectorTerm) GetCompartmentId() string { +func (x *NodePolicyCondition) GetReason() string { if x != nil { - return x.CompartmentId + return x.Reason } return "" } -type OCISubnetSelectorTerm struct { +func (x *NodePolicyCondition) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { + if x != nil { + return x.LastTransitionTime + } + return nil +} + +type NodePolicyTargetStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` } -func (x *OCISubnetSelectorTerm) Reset() { - *x = OCISubnetSelectorTerm{} +func (x *NodePolicyTargetStatus) Reset() { + *x = NodePolicyTargetStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[268] + mi := &file_api_v1_recommendation_proto_msgTypes[284] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISubnetSelectorTerm) String() string { +func (x *NodePolicyTargetStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISubnetSelectorTerm) ProtoMessage() {} +func (*NodePolicyTargetStatus) ProtoMessage() {} -func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[268] +func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[284] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21509,51 +24880,55 @@ func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCISubnetSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCISubnetSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{268} -} - -func (x *OCISubnetSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{284} } -func (x *OCISubnetSelectorTerm) GetName() string { +func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { if x != nil { - return x.Name + return x.Conditions } - return "" + return nil } -type OCISecurityGroupSelectorTerm struct { +// Cloud-agnostic config for how a node policy should react to AZ outage +// signals from the cloud provider (AWS ARC zonal shift today; GCP analogue +// planned). The compile step maps these intents to provider-specific +// annotations on the resulting Karpenter NodePool. +type ZonalShiftConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Master opt-in. When false the other two fields are ignored. + RespectZonalShift bool `protobuf:"varint,1,opt,name=respect_zonal_shift,json=respectZonalShift,proto3" json:"respect_zonal_shift,omitempty"` + // Also terminate existing nodes in the impacted zone, forcing reschedule. + // Respects pod disruption budgets. Only meaningful when respect_zonal_shift is true. + EvictImpactedNodes bool `protobuf:"varint,2,opt,name=evict_impacted_nodes,json=evictImpactedNodes,proto3" json:"evict_impacted_nodes,omitempty"` + // If the policy is pinned to a single zone and that zone is impacted, expand + // to other zones available on the node class. Only meaningful when + // respect_zonal_shift is true. + AllowZoneFallback bool `protobuf:"varint,3,opt,name=allow_zone_fallback,json=allowZoneFallback,proto3" json:"allow_zone_fallback,omitempty"` } -func (x *OCISecurityGroupSelectorTerm) Reset() { - *x = OCISecurityGroupSelectorTerm{} +func (x *ZonalShiftConfig) Reset() { + *x = ZonalShiftConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[269] + mi := &file_api_v1_recommendation_proto_msgTypes[285] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISecurityGroupSelectorTerm) String() string { +func (x *ZonalShiftConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} +func (*ZonalShiftConfig) ProtoMessage() {} -func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[269] +func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[285] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21564,51 +24939,123 @@ func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCISecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. -func (*OCISecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{269} +// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. +func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{285} } -func (x *OCISecurityGroupSelectorTerm) GetId() string { +func (x *ZonalShiftConfig) GetRespectZonalShift() bool { if x != nil { - return x.Id + return x.RespectZonalShift + } + return false +} + +func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { + if x != nil { + return x.EvictImpactedNodes + } + return false +} + +func (x *ZonalShiftConfig) GetAllowZoneFallback() bool { + if x != nil { + return x.AllowZoneFallback + } + return false +} + +type Taint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Effect string `protobuf:"bytes,3,opt,name=effect,proto3" json:"effect,omitempty"` // NoSchedule, PreferNoSchedule, NoExecute +} + +func (x *Taint) Reset() { + *x = Taint{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[286] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Taint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Taint) ProtoMessage() {} + +func (x *Taint) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[286] + 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 Taint.ProtoReflect.Descriptor instead. +func (*Taint) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{286} +} + +func (x *Taint) GetKey() string { + if x != nil { + return x.Key } return "" } -func (x *OCISecurityGroupSelectorTerm) GetName() string { +func (x *Taint) GetValue() string { if x != nil { - return x.Name + return x.Value } return "" } -type OCIBootConfig struct { +func (x *Taint) GetEffect() string { + if x != nil { + return x.Effect + } + return "" +} + +type DisruptionBudget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BootVolumeSizeInGbs int64 `protobuf:"varint,1,opt,name=boot_volume_size_in_gbs,json=bootVolumeSizeInGbs,proto3" json:"boot_volume_size_in_gbs,omitempty"` - BootVolumeVpusPerGb int64 `protobuf:"varint,2,opt,name=boot_volume_vpus_per_gb,json=bootVolumeVpusPerGb,proto3" json:"boot_volume_vpus_per_gb,omitempty"` + Reasons []string `protobuf:"bytes,1,rep,name=reasons,proto3" json:"reasons,omitempty"` // e.g. ["Underutilized", "Empty"] + Nodes string `protobuf:"bytes,2,opt,name=nodes,proto3" json:"nodes,omitempty"` // e.g. "10%" or "2" + Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` // optional cron schedule + Duration string `protobuf:"bytes,4,opt,name=duration,proto3" json:"duration,omitempty"` // e.g. "1h30m" } -func (x *OCIBootConfig) Reset() { - *x = OCIBootConfig{} +func (x *DisruptionBudget) Reset() { + *x = DisruptionBudget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[270] + mi := &file_api_v1_recommendation_proto_msgTypes[287] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIBootConfig) String() string { +func (x *DisruptionBudget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIBootConfig) ProtoMessage() {} +func (*DisruptionBudget) ProtoMessage() {} -func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[270] +func (x *DisruptionBudget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[287] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21619,54 +25066,69 @@ func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIBootConfig.ProtoReflect.Descriptor instead. -func (*OCIBootConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{270} +// Deprecated: Use DisruptionBudget.ProtoReflect.Descriptor instead. +func (*DisruptionBudget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{287} } -func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { +func (x *DisruptionBudget) GetReasons() []string { if x != nil { - return x.BootVolumeSizeInGbs + return x.Reasons } - return 0 + return nil } -func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { +func (x *DisruptionBudget) GetNodes() string { if x != nil { - return x.BootVolumeVpusPerGb + return x.Nodes } - return 0 + return "" } -type OCILaunchOptions struct { +func (x *DisruptionBudget) GetSchedule() string { + if x != nil { + return x.Schedule + } + return "" +} + +func (x *DisruptionBudget) GetDuration() string { + if x != nil { + return x.Duration + } + return "" +} + +type DisruptionPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BootVolumeType *string `protobuf:"bytes,1,opt,name=boot_volume_type,json=bootVolumeType,proto3,oneof" json:"boot_volume_type,omitempty"` - Firmware *string `protobuf:"bytes,2,opt,name=firmware,proto3,oneof" json:"firmware,omitempty"` - NetworkType *string `protobuf:"bytes,3,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"` - RemoteDataVolumeType *string `protobuf:"bytes,4,opt,name=remote_data_volume_type,json=remoteDataVolumeType,proto3,oneof" json:"remote_data_volume_type,omitempty"` - IsConsistentVolumeNamingEnabled *bool `protobuf:"varint,5,opt,name=is_consistent_volume_naming_enabled,json=isConsistentVolumeNamingEnabled,proto3,oneof" json:"is_consistent_volume_naming_enabled,omitempty"` + ConsolidateAfter string `protobuf:"bytes,1,opt,name=consolidate_after,json=consolidateAfter,proto3" json:"consolidate_after,omitempty"` // required by Karpenter + ConsolidationPolicy string `protobuf:"bytes,2,opt,name=consolidation_policy,json=consolidationPolicy,proto3" json:"consolidation_policy,omitempty"` // WhenEmpty / WhenEmptyOrUnderutilized + ExpireAfter string `protobuf:"bytes,3,opt,name=expire_after,json=expireAfter,proto3" json:"expire_after,omitempty"` + TtlSecondsAfterEmpty int32 `protobuf:"varint,4,opt,name=ttl_seconds_after_empty,json=ttlSecondsAfterEmpty,proto3" json:"ttl_seconds_after_empty,omitempty"` + TerminationGracePeriodSeconds int32 `protobuf:"varint,5,opt,name=termination_grace_period_seconds,json=terminationGracePeriodSeconds,proto3" json:"termination_grace_period_seconds,omitempty"` + Budgets []*DisruptionBudget `protobuf:"bytes,6,rep,name=budgets,proto3" json:"budgets,omitempty"` } -func (x *OCILaunchOptions) Reset() { - *x = OCILaunchOptions{} +func (x *DisruptionPolicy) Reset() { + *x = DisruptionPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[271] + mi := &file_api_v1_recommendation_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCILaunchOptions) String() string { +func (x *DisruptionPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCILaunchOptions) ProtoMessage() {} +func (*DisruptionPolicy) ProtoMessage() {} -func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[271] +func (x *DisruptionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[288] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21677,72 +25139,79 @@ func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCILaunchOptions.ProtoReflect.Descriptor instead. -func (*OCILaunchOptions) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{271} +// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. +func (*DisruptionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{288} } -func (x *OCILaunchOptions) GetBootVolumeType() string { - if x != nil && x.BootVolumeType != nil { - return *x.BootVolumeType +func (x *DisruptionPolicy) GetConsolidateAfter() string { + if x != nil { + return x.ConsolidateAfter } return "" } -func (x *OCILaunchOptions) GetFirmware() string { - if x != nil && x.Firmware != nil { - return *x.Firmware +func (x *DisruptionPolicy) GetConsolidationPolicy() string { + if x != nil { + return x.ConsolidationPolicy } return "" } -func (x *OCILaunchOptions) GetNetworkType() string { - if x != nil && x.NetworkType != nil { - return *x.NetworkType +func (x *DisruptionPolicy) GetExpireAfter() string { + if x != nil { + return x.ExpireAfter } return "" } -func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { - if x != nil && x.RemoteDataVolumeType != nil { - return *x.RemoteDataVolumeType +func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { + if x != nil { + return x.TtlSecondsAfterEmpty } - return "" + return 0 } -func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { - if x != nil && x.IsConsistentVolumeNamingEnabled != nil { - return *x.IsConsistentVolumeNamingEnabled +func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { + if x != nil { + return x.TerminationGracePeriodSeconds } - return false + return 0 } -type OCIVolumeAttributes struct { +func (x *DisruptionPolicy) GetBudgets() []*DisruptionBudget { + if x != nil { + return x.Budgets + } + return nil +} + +type ResourceLimits struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - SizeInGbs int64 `protobuf:"varint,1,opt,name=size_in_gbs,json=sizeInGbs,proto3" json:"size_in_gbs,omitempty"` - VpusPerGb int64 `protobuf:"varint,2,opt,name=vpus_per_gb,json=vpusPerGb,proto3" json:"vpus_per_gb,omitempty"` + Cpu string `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"` + Memory string `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"` } -func (x *OCIVolumeAttributes) Reset() { - *x = OCIVolumeAttributes{} +func (x *ResourceLimits) Reset() { + *x = ResourceLimits{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[272] + mi := &file_api_v1_recommendation_proto_msgTypes[289] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIVolumeAttributes) String() string { +func (x *ResourceLimits) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIVolumeAttributes) ProtoMessage() {} +func (*ResourceLimits) ProtoMessage() {} -func (x *OCIVolumeAttributes) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[272] +func (x *ResourceLimits) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[289] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21753,63 +25222,66 @@ func (x *OCIVolumeAttributes) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. -func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{272} +// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. +func (*ResourceLimits) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{289} } -func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { +func (x *ResourceLimits) GetCpu() string { if x != nil { - return x.SizeInGbs + return x.Cpu } - return 0 + return "" } -func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { +func (x *ResourceLimits) GetMemory() string { if x != nil { - return x.VpusPerGb + return x.Memory } - return 0 + return "" } -type OCINodeClassSpec struct { +// Provider-specific stubs +type AWSNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - VcnId string `protobuf:"bytes,1,opt,name=vcn_id,json=vcnId,proto3" json:"vcn_id,omitempty"` - ImageSelector []*OCIImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector,json=imageSelector,proto3" json:"image_selector,omitempty"` - SubnetSelector []*OCISubnetSelectorTerm `protobuf:"bytes,3,rep,name=subnet_selector,json=subnetSelector,proto3" json:"subnet_selector,omitempty"` - SecurityGroupSelector []*OCISecurityGroupSelectorTerm `protobuf:"bytes,4,rep,name=security_group_selector,json=securityGroupSelector,proto3" json:"security_group_selector,omitempty"` - UserData *string `protobuf:"bytes,5,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` - PreInstallScript *string `protobuf:"bytes,6,opt,name=pre_install_script,json=preInstallScript,proto3,oneof" json:"pre_install_script,omitempty"` - MetaData map[string]string `protobuf:"bytes,7,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ImageFamily string `protobuf:"bytes,8,opt,name=image_family,json=imageFamily,proto3" json:"image_family,omitempty"` - Tags map[string]string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - FreeFormTags map[string]string `protobuf:"bytes,10,rep,name=free_form_tags,json=freeFormTags,proto3" json:"free_form_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - BootConfig *OCIBootConfig `protobuf:"bytes,11,opt,name=boot_config,json=bootConfig,proto3" json:"boot_config,omitempty"` - LaunchOptions *OCILaunchOptions `protobuf:"bytes,12,opt,name=launch_options,json=launchOptions,proto3" json:"launch_options,omitempty"` - BlockDevices []*OCIVolumeAttributes `protobuf:"bytes,13,rep,name=block_devices,json=blockDevices,proto3" json:"block_devices,omitempty"` - AgentList []string `protobuf:"bytes,14,rep,name=agent_list,json=agentList,proto3" json:"agent_list,omitempty"` + SubnetSelectorTerms []*SubnetSelectorTerm `protobuf:"bytes,1,rep,name=subnet_selector_terms,json=subnetSelectorTerms,proto3" json:"subnet_selector_terms,omitempty"` + SecurityGroupSelectorTerms []*SecurityGroupSelectorTerm `protobuf:"bytes,2,rep,name=security_group_selector_terms,json=securityGroupSelectorTerms,proto3" json:"security_group_selector_terms,omitempty"` + CapacityReservationSelectorTerms []*CapacityReservationSelectorTerm `protobuf:"bytes,3,rep,name=capacity_reservation_selector_terms,json=capacityReservationSelectorTerms,proto3" json:"capacity_reservation_selector_terms,omitempty"` + AssociatePublicIpAddress *bool `protobuf:"varint,4,opt,name=associate_public_ip_address,json=associatePublicIpAddress,proto3,oneof" json:"associate_public_ip_address,omitempty"` + AmiSelectorTerms []*AMISelectorTerm `protobuf:"bytes,5,rep,name=ami_selector_terms,json=amiSelectorTerms,proto3" json:"ami_selector_terms,omitempty"` + AmiFamily *string `protobuf:"bytes,6,opt,name=ami_family,json=amiFamily,proto3,oneof" json:"ami_family,omitempty"` + UserData *string `protobuf:"bytes,7,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` + Role *string `protobuf:"bytes,8,opt,name=role,proto3,oneof" json:"role,omitempty"` + InstanceProfile *string `protobuf:"bytes,9,opt,name=instance_profile,json=instanceProfile,proto3,oneof" json:"instance_profile,omitempty"` + Tags map[string]string `protobuf:"bytes,10,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Kubelet *KubeletConfiguration `protobuf:"bytes,11,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` + BlockDeviceMappings []*BlockDeviceMapping `protobuf:"bytes,12,rep,name=block_device_mappings,json=blockDeviceMappings,proto3" json:"block_device_mappings,omitempty"` + InstanceStorePolicy *InstanceStorePolicy `protobuf:"varint,13,opt,name=instance_store_policy,json=instanceStorePolicy,proto3,enum=api.v1.InstanceStorePolicy,oneof" json:"instance_store_policy,omitempty"` + DetailedMonitoring *bool `protobuf:"varint,14,opt,name=detailed_monitoring,json=detailedMonitoring,proto3,oneof" json:"detailed_monitoring,omitempty"` + MetadataOptions *MetadataOptions `protobuf:"bytes,15,opt,name=metadata_options,json=metadataOptions,proto3,oneof" json:"metadata_options,omitempty"` + Context *string `protobuf:"bytes,16,opt,name=context,proto3,oneof" json:"context,omitempty"` } -func (x *OCINodeClassSpec) Reset() { - *x = OCINodeClassSpec{} +func (x *AWSNodeClassSpec) Reset() { + *x = AWSNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[273] + mi := &file_api_v1_recommendation_proto_msgTypes[290] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCINodeClassSpec) String() string { +func (x *AWSNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClassSpec) ProtoMessage() {} +func (*AWSNodeClassSpec) ProtoMessage() {} -func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[273] +func (x *AWSNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[290] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21820,136 +25292,148 @@ func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCINodeClassSpec.ProtoReflect.Descriptor instead. -func (*OCINodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{273} +// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} } -func (x *OCINodeClassSpec) GetVcnId() string { +func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { if x != nil { - return x.VcnId + return x.SubnetSelectorTerms } - return "" + return nil } -func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { +func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { if x != nil { - return x.ImageSelector + return x.SecurityGroupSelectorTerms } return nil } -func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { +func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { if x != nil { - return x.SubnetSelector + return x.CapacityReservationSelectorTerms } return nil } -func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { +func (x *AWSNodeClassSpec) GetAssociatePublicIpAddress() bool { + if x != nil && x.AssociatePublicIpAddress != nil { + return *x.AssociatePublicIpAddress + } + return false +} + +func (x *AWSNodeClassSpec) GetAmiSelectorTerms() []*AMISelectorTerm { if x != nil { - return x.SecurityGroupSelector + return x.AmiSelectorTerms } return nil } -func (x *OCINodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData +func (x *AWSNodeClassSpec) GetAmiFamily() string { + if x != nil && x.AmiFamily != nil { + return *x.AmiFamily } return "" } -func (x *OCINodeClassSpec) GetPreInstallScript() string { - if x != nil && x.PreInstallScript != nil { - return *x.PreInstallScript +func (x *AWSNodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData } return "" } -func (x *OCINodeClassSpec) GetMetaData() map[string]string { - if x != nil { - return x.MetaData +func (x *AWSNodeClassSpec) GetRole() string { + if x != nil && x.Role != nil { + return *x.Role } - return nil + return "" } -func (x *OCINodeClassSpec) GetImageFamily() string { - if x != nil { - return x.ImageFamily +func (x *AWSNodeClassSpec) GetInstanceProfile() string { + if x != nil && x.InstanceProfile != nil { + return *x.InstanceProfile } return "" } -func (x *OCINodeClassSpec) GetTags() map[string]string { +func (x *AWSNodeClassSpec) GetTags() map[string]string { if x != nil { return x.Tags } return nil } -func (x *OCINodeClassSpec) GetFreeFormTags() map[string]string { +func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { if x != nil { - return x.FreeFormTags + return x.Kubelet } return nil } -func (x *OCINodeClassSpec) GetBootConfig() *OCIBootConfig { +func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { if x != nil { - return x.BootConfig + return x.BlockDeviceMappings } return nil } -func (x *OCINodeClassSpec) GetLaunchOptions() *OCILaunchOptions { - if x != nil { - return x.LaunchOptions +func (x *AWSNodeClassSpec) GetInstanceStorePolicy() InstanceStorePolicy { + if x != nil && x.InstanceStorePolicy != nil { + return *x.InstanceStorePolicy } - return nil + return InstanceStorePolicy_INSTANCE_STORE_POLICY_RAID0 } -func (x *OCINodeClassSpec) GetBlockDevices() []*OCIVolumeAttributes { - if x != nil { - return x.BlockDevices +func (x *AWSNodeClassSpec) GetDetailedMonitoring() bool { + if x != nil && x.DetailedMonitoring != nil { + return *x.DetailedMonitoring } - return nil + return false } -func (x *OCINodeClassSpec) GetAgentList() []string { +func (x *AWSNodeClassSpec) GetMetadataOptions() *MetadataOptions { if x != nil { - return x.AgentList + return x.MetadataOptions } return nil } -type KarpenterSettingsRecommendation struct { +func (x *AWSNodeClassSpec) GetContext() string { + if x != nil && x.Context != nil { + return *x.Context + } + return "" +} + +type GetInstanceFamiliesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // contents is the full KarpenterSettings YAML (devzero.karpenter.sh/v1alpha1, name "default"). - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` - RecommendationId string `protobuf:"bytes,2,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *KarpenterSettingsRecommendation) Reset() { - *x = KarpenterSettingsRecommendation{} +func (x *GetInstanceFamiliesRequest) Reset() { + *x = GetInstanceFamiliesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[274] + mi := &file_api_v1_recommendation_proto_msgTypes[291] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterSettingsRecommendation) String() string { +func (x *GetInstanceFamiliesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterSettingsRecommendation) ProtoMessage() {} +func (*GetInstanceFamiliesRequest) ProtoMessage() {} -func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[274] +func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[291] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21960,51 +25444,43 @@ func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KarpenterSettingsRecommendation.ProtoReflect.Descriptor instead. -func (*KarpenterSettingsRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{274} +// Deprecated: Use GetInstanceFamiliesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{291} } -func (x *KarpenterSettingsRecommendation) GetContents() []byte { +func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { if x != nil { - return x.Contents + return x.CloudProviders } return nil } -func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { - if x != nil { - return x.RecommendationId - } - return "" -} - -type RawKarpenterSpec struct { +type GetInstanceFamiliesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodepoolYaml string `protobuf:"bytes,1,opt,name=nodepool_yaml,json=nodepoolYaml,proto3" json:"nodepool_yaml,omitempty"` - NodeclassYaml string `protobuf:"bytes,2,opt,name=nodeclass_yaml,json=nodeclassYaml,proto3" json:"nodeclass_yaml,omitempty"` + InstanceFamilies []*InstanceFamily `protobuf:"bytes,1,rep,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` } -func (x *RawKarpenterSpec) Reset() { - *x = RawKarpenterSpec{} +func (x *GetInstanceFamiliesResponse) Reset() { + *x = GetInstanceFamiliesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[275] + mi := &file_api_v1_recommendation_proto_msgTypes[292] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RawKarpenterSpec) String() string { +func (x *GetInstanceFamiliesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RawKarpenterSpec) ProtoMessage() {} +func (*GetInstanceFamiliesResponse) ProtoMessage() {} -func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[275] +func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[292] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22015,54 +25491,43 @@ func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RawKarpenterSpec.ProtoReflect.Descriptor instead. -func (*RawKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{275} -} - -func (x *RawKarpenterSpec) GetNodepoolYaml() string { - if x != nil { - return x.NodepoolYaml - } - return "" +// Deprecated: Use GetInstanceFamiliesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{292} } -func (x *RawKarpenterSpec) GetNodeclassYaml() string { +func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { if x != nil { - return x.NodeclassYaml + return x.InstanceFamilies } - return "" + return nil } -type NodeRecommendation struct { +type GetInstanceSizesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Aws *AWSKarpenterSpec `protobuf:"bytes,1,opt,name=aws,proto3" json:"aws,omitempty"` - Aks *AKSKarpenterSpec `protobuf:"bytes,2,opt,name=aks,proto3" json:"aks,omitempty"` - Gcp *GCPKarpenterSpec `protobuf:"bytes,3,opt,name=gcp,proto3" json:"gcp,omitempty"` - Oci *OCIKarpenterSpec `protobuf:"bytes,4,opt,name=oci,proto3" json:"oci,omitempty"` - NodeRecCfgId string `protobuf:"bytes,41,opt,name=node_rec_cfg_id,json=nodeRecCfgId,proto3" json:"node_rec_cfg_id,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *NodeRecommendation) Reset() { - *x = NodeRecommendation{} +func (x *GetInstanceSizesRequest) Reset() { + *x = GetInstanceSizesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[276] + mi := &file_api_v1_recommendation_proto_msgTypes[293] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeRecommendation) String() string { +func (x *GetInstanceSizesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendation) ProtoMessage() {} +func (*GetInstanceSizesRequest) ProtoMessage() {} -func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[276] +func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[293] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22073,72 +25538,90 @@ func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeRecommendation.ProtoReflect.Descriptor instead. -func (*NodeRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{276} +// Deprecated: Use GetInstanceSizesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{293} } -func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { +func (x *GetInstanceSizesRequest) GetCloudProviders() []string { if x != nil { - return x.Aws + return x.CloudProviders } return nil } -func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { - if x != nil { - return x.Aks - } - return nil -} +type GetInstanceSizesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { - if x != nil { - return x.Gcp + InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` +} + +func (x *GetInstanceSizesResponse) Reset() { + *x = GetInstanceSizesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[294] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodeRecommendation) GetOci() *OCIKarpenterSpec { - if x != nil { - return x.Oci +func (x *GetInstanceSizesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetInstanceSizesResponse) ProtoMessage() {} + +func (x *GetInstanceSizesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[294] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodeRecommendation) GetNodeRecCfgId() string { +// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} +} + +func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { if x != nil { - return x.NodeRecCfgId + return x.InstanceSizes } - return "" + return nil } -type AWSKarpenterSpec struct { +type GetInstanceShapesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - Ec2Nc []*EC2NodeClass `protobuf:"bytes,6,rep,name=ec2nc,proto3" json:"ec2nc,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` // Cloud provider names (e.g., "aws", "azure", "gcp") } -func (x *AWSKarpenterSpec) Reset() { - *x = AWSKarpenterSpec{} +func (x *GetInstanceShapesRequest) Reset() { + *x = GetInstanceShapesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[277] + mi := &file_api_v1_recommendation_proto_msgTypes[295] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AWSKarpenterSpec) String() string { +func (x *GetInstanceShapesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AWSKarpenterSpec) ProtoMessage() {} +func (*GetInstanceShapesRequest) ProtoMessage() {} -func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[277] +func (x *GetInstanceShapesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[295] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22149,51 +25632,43 @@ func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AWSKarpenterSpec.ProtoReflect.Descriptor instead. -func (*AWSKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{277} -} - -func (x *AWSKarpenterSpec) GetNp() []*NodePool { - if x != nil { - return x.Np - } - return nil +// Deprecated: Use GetInstanceShapesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceShapesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{295} } -func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { +func (x *GetInstanceShapesRequest) GetCloudProviders() []string { if x != nil { - return x.Ec2Nc + return x.CloudProviders } return nil } -type AKSKarpenterSpec struct { +type GetInstanceShapesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - Aksnc []*AKSNodeClass `protobuf:"bytes,6,rep,name=aksnc,proto3" json:"aksnc,omitempty"` + InstanceShapes []*InstanceShape `protobuf:"bytes,1,rep,name=instance_shapes,json=instanceShapes,proto3" json:"instance_shapes,omitempty"` } -func (x *AKSKarpenterSpec) Reset() { - *x = AKSKarpenterSpec{} +func (x *GetInstanceShapesResponse) Reset() { + *x = GetInstanceShapesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[278] + mi := &file_api_v1_recommendation_proto_msgTypes[296] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AKSKarpenterSpec) String() string { +func (x *GetInstanceShapesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSKarpenterSpec) ProtoMessage() {} +func (*GetInstanceShapesResponse) ProtoMessage() {} -func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[278] +func (x *GetInstanceShapesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[296] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22204,50 +25679,44 @@ func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AKSKarpenterSpec.ProtoReflect.Descriptor instead. -func (*AKSKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{278} -} - -func (x *AKSKarpenterSpec) GetNp() []*NodePool { - if x != nil { - return x.Np - } - return nil +// Deprecated: Use GetInstanceShapesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceShapesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{296} } -func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { +func (x *GetInstanceShapesResponse) GetInstanceShapes() []*InstanceShape { if x != nil { - return x.Aksnc + return x.InstanceShapes } return nil } -type NodePool struct { +type InstanceFamily struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into sigs.k8s.io/karpenter/pkg/apis/v1.NodePool + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *NodePool) Reset() { - *x = NodePool{} +func (x *InstanceFamily) Reset() { + *x = InstanceFamily{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[279] + mi := &file_api_v1_recommendation_proto_msgTypes[297] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePool) String() string { +func (x *InstanceFamily) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePool) ProtoMessage() {} +func (*InstanceFamily) ProtoMessage() {} -func (x *NodePool) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[279] +func (x *InstanceFamily) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[297] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22258,43 +25727,51 @@ func (x *NodePool) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePool.ProtoReflect.Descriptor instead. -func (*NodePool) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{279} +// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. +func (*InstanceFamily) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} } -func (x *NodePool) GetContents() []byte { +func (x *InstanceFamily) GetName() string { if x != nil { - return x.Contents + return x.Name } - return nil + return "" } -type EC2NodeClass struct { +func (x *InstanceFamily) GetProviderName() string { + if x != nil { + return x.ProviderName + } + return "" +} + +type InstanceShape struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/aws/karpenter-provider-aws/pkg/apis/v1.EC2NodeClass + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *EC2NodeClass) Reset() { - *x = EC2NodeClass{} +func (x *InstanceShape) Reset() { + *x = InstanceShape{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[280] + mi := &file_api_v1_recommendation_proto_msgTypes[298] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EC2NodeClass) String() string { +func (x *InstanceShape) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EC2NodeClass) ProtoMessage() {} +func (*InstanceShape) ProtoMessage() {} -func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[280] +func (x *InstanceShape) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[298] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22305,43 +25782,51 @@ func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EC2NodeClass.ProtoReflect.Descriptor instead. -func (*EC2NodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{280} +// Deprecated: Use InstanceShape.ProtoReflect.Descriptor instead. +func (*InstanceShape) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{298} } -func (x *EC2NodeClass) GetContents() []byte { +func (x *InstanceShape) GetName() string { if x != nil { - return x.Contents + return x.Name } - return nil + return "" } -type AKSNodeClass struct { +func (x *InstanceShape) GetProviderName() string { + if x != nil { + return x.ProviderName + } + return "" +} + +type InstanceSize struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/Azure/karpenter-provider-azure/pkg/apis/v1beta1.AKSNodeClass + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` } -func (x *AKSNodeClass) Reset() { - *x = AKSNodeClass{} +func (x *InstanceSize) Reset() { + *x = InstanceSize{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[281] + mi := &file_api_v1_recommendation_proto_msgTypes[299] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AKSNodeClass) String() string { +func (x *InstanceSize) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSNodeClass) ProtoMessage() {} +func (*InstanceSize) ProtoMessage() {} -func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[281] +func (x *InstanceSize) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[299] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22352,44 +25837,52 @@ func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AKSNodeClass.ProtoReflect.Descriptor instead. -func (*AKSNodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{281} +// Deprecated: Use InstanceSize.ProtoReflect.Descriptor instead. +func (*InstanceSize) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{299} } -func (x *AKSNodeClass) GetContents() []byte { +func (x *InstanceSize) GetName() string { if x != nil { - return x.Contents + return x.Name } - return nil + return "" } -type GCPKarpenterSpec struct { +func (x *InstanceSize) GetProviderName() string { + if x != nil { + return x.ProviderName + } + return "" +} + +type InstanceCategory struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - NodeClasses []*GCENodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // e.g., "c", "D", "n" + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` // e.g., "Compute Optimized" + ProviderName string `protobuf:"bytes,3,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure", "GCP" } -func (x *GCPKarpenterSpec) Reset() { - *x = GCPKarpenterSpec{} +func (x *InstanceCategory) Reset() { + *x = InstanceCategory{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[282] + mi := &file_api_v1_recommendation_proto_msgTypes[300] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPKarpenterSpec) String() string { +func (x *InstanceCategory) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPKarpenterSpec) ProtoMessage() {} +func (*InstanceCategory) ProtoMessage() {} -func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[282] +func (x *InstanceCategory) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[300] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22400,50 +25893,58 @@ func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCPKarpenterSpec.ProtoReflect.Descriptor instead. -func (*GCPKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{282} +// Deprecated: Use InstanceCategory.ProtoReflect.Descriptor instead. +func (*InstanceCategory) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{300} } -func (x *GCPKarpenterSpec) GetNp() []*NodePool { +func (x *InstanceCategory) GetKey() string { if x != nil { - return x.Np + return x.Key } - return nil + return "" } -func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { +func (x *InstanceCategory) GetLabel() string { if x != nil { - return x.NodeClasses + return x.Label } - return nil + return "" } -type GCENodeClass struct { +func (x *InstanceCategory) GetProviderName() string { + if x != nil { + return x.ProviderName + } + return "" +} + +type InstanceCPU struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/cloudpilot-ai/karpenter-provider-gcp/pkg/apis/v1alpha1.GCENodeClass + Vcpu int32 `protobuf:"varint,1,opt,name=vcpu,proto3" json:"vcpu,omitempty"` // e.g., 2, 4, 8, 16 + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" } -func (x *GCENodeClass) Reset() { - *x = GCENodeClass{} +func (x *InstanceCPU) Reset() { + *x = InstanceCPU{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[283] + mi := &file_api_v1_recommendation_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCENodeClass) String() string { +func (x *InstanceCPU) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCENodeClass) ProtoMessage() {} +func (*InstanceCPU) ProtoMessage() {} -func (x *GCENodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[283] +func (x *InstanceCPU) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[301] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22454,44 +25955,51 @@ func (x *GCENodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GCENodeClass.ProtoReflect.Descriptor instead. -func (*GCENodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{283} +// Deprecated: Use InstanceCPU.ProtoReflect.Descriptor instead. +func (*InstanceCPU) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{301} } -func (x *GCENodeClass) GetContents() []byte { +func (x *InstanceCPU) GetVcpu() int32 { if x != nil { - return x.Contents + return x.Vcpu } - return nil + return 0 } -type OCIKarpenterSpec struct { +func (x *InstanceCPU) GetProviderName() string { + if x != nil { + return x.ProviderName + } + return "" +} + +type InstanceTypeName struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` - NodeClasses []*OCINodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // e.g., "m5.large", "Standard_D4s_v3" + ProviderName string `protobuf:"bytes,2,opt,name=provider_name,json=providerName,proto3" json:"provider_name,omitempty"` // e.g., "AWS", "Azure" } -func (x *OCIKarpenterSpec) Reset() { - *x = OCIKarpenterSpec{} +func (x *InstanceTypeName) Reset() { + *x = InstanceTypeName{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[284] + mi := &file_api_v1_recommendation_proto_msgTypes[302] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIKarpenterSpec) String() string { +func (x *InstanceTypeName) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIKarpenterSpec) ProtoMessage() {} +func (*InstanceTypeName) ProtoMessage() {} -func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[284] +func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[302] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22502,50 +26010,50 @@ func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCIKarpenterSpec.ProtoReflect.Descriptor instead. -func (*OCIKarpenterSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{284} +// Deprecated: Use InstanceTypeName.ProtoReflect.Descriptor instead. +func (*InstanceTypeName) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} } -func (x *OCIKarpenterSpec) GetNp() []*NodePool { +func (x *InstanceTypeName) GetName() string { if x != nil { - return x.Np + return x.Name } - return nil + return "" } -func (x *OCIKarpenterSpec) GetNodeClasses() []*OCINodeClass { +func (x *InstanceTypeName) GetProviderName() string { if x != nil { - return x.NodeClasses + return x.ProviderName } - return nil + return "" } -type OCINodeClass struct { +type GetInstanceCategoriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/zoom/karpenter-oci/pkg/apis/v1alpha1.OciNodeClass + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *OCINodeClass) Reset() { - *x = OCINodeClass{} +func (x *GetInstanceCategoriesRequest) Reset() { + *x = GetInstanceCategoriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[285] + mi := &file_api_v1_recommendation_proto_msgTypes[303] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCINodeClass) String() string { +func (x *GetInstanceCategoriesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClass) ProtoMessage() {} +func (*GetInstanceCategoriesRequest) ProtoMessage() {} -func (x *OCINodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[285] +func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[303] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22556,65 +26064,43 @@ func (x *OCINodeClass) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use OCINodeClass.ProtoReflect.Descriptor instead. -func (*OCINodeClass) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{285} +// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{303} } -func (x *OCINodeClass) GetContents() []byte { +func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { if x != nil { - return x.Contents + return x.CloudProviders } return nil } -// StorageRecommendationPolicy represents a policy for PVC/storage optimization -type StorageRecommendationPolicy struct { +type GetInstanceCategoriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - ActionTrigger ActionTrigger `protobuf:"varint,5,opt,name=action_trigger,json=actionTrigger,proto3,enum=api.v1.ActionTrigger" json:"action_trigger,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,7,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,8,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - // Storage-specific parameters - TargetUtilizationPercent *float32 `protobuf:"fixed32,10,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,11,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,12,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,13,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - // New storage policy fields - CriticalDaysToFull *int32 `protobuf:"varint,14,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,15,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,16,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,17,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,18,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` - IsDefaultPolicy bool `protobuf:"varint,50,opt,name=is_default_policy,json=isDefaultPolicy,proto3" json:"is_default_policy,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` } -func (x *StorageRecommendationPolicy) Reset() { - *x = StorageRecommendationPolicy{} +func (x *GetInstanceCategoriesResponse) Reset() { + *x = GetInstanceCategoriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[286] + mi := &file_api_v1_recommendation_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StorageRecommendationPolicy) String() string { +func (x *GetInstanceCategoriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StorageRecommendationPolicy) ProtoMessage() {} +func (*GetInstanceCategoriesResponse) ProtoMessage() {} -func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[286] +func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[304] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22625,190 +26111,137 @@ func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StorageRecommendationPolicy.ProtoReflect.Descriptor instead. -func (*StorageRecommendationPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{286} +// Deprecated: Use GetInstanceCategoriesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{304} } -func (x *StorageRecommendationPolicy) GetPolicyId() string { +func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { if x != nil { - return x.PolicyId + return x.InstanceCategories } - return "" + return nil } -func (x *StorageRecommendationPolicy) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +type GetInstanceCPUsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *StorageRecommendationPolicy) GetName() string { - if x != nil { - return x.Name +func (x *GetInstanceCPUsRequest) Reset() { + *x = GetInstanceCPUsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[305] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *StorageRecommendationPolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" +func (x *GetInstanceCPUsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { - if x != nil { - return x.ActionTrigger +func (*GetInstanceCPUsRequest) ProtoMessage() {} + +func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[305] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { +// Deprecated: Use GetInstanceCPUsRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{305} +} + +func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { if x != nil { - return x.ActionTriggers + return x.CloudProviders } return nil } -func (x *StorageRecommendationPolicy) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" +type GetInstanceCPUsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` } -func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds +func (x *GetInstanceCPUsResponse) Reset() { + *x = GetInstanceCPUsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[306] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 +func (x *GetInstanceCPUsResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull +func (*GetInstanceCPUsResponse) ProtoMessage() {} + +func (x *GetInstanceCPUsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[306] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction - } - return 0 +// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{306} } -func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints +func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { + if x != nil { + return x.InstanceCpus } - return 0 + return nil } -func (x *StorageRecommendationPolicy) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull - } - return 0 -} - -func (x *StorageRecommendationPolicy) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 -} - -func (x *StorageRecommendationPolicy) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib - } - return 0 -} - -func (x *StorageRecommendationPolicy) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd - } - return 0 -} - -func (x *StorageRecommendationPolicy) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds - } - return 0 -} - -func (x *StorageRecommendationPolicy) GetIsDefaultPolicy() bool { - if x != nil { - return x.IsDefaultPolicy - } - return false -} - -func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -type CreateStorageRecommendationPolicyRequest struct { +type GetInstanceTypeNamesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,4,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,5,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,6,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - TargetUtilizationPercent *float32 `protobuf:"fixed32,7,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,8,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,9,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,10,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - CriticalDaysToFull *int32 `protobuf:"varint,11,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,12,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,13,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,14,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,15,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *CreateStorageRecommendationPolicyRequest) Reset() { - *x = CreateStorageRecommendationPolicyRequest{} +func (x *GetInstanceTypeNamesRequest) Reset() { + *x = GetInstanceTypeNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[287] + mi := &file_api_v1_recommendation_proto_msgTypes[307] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyRequest) String() string { +func (x *GetInstanceTypeNamesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*GetInstanceTypeNamesRequest) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[287] +func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[307] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22819,141 +26252,43 @@ func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use CreateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*CreateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{287} -} - -func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *CreateStorageRecommendationPolicyRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CreateStorageRecommendationPolicyRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use GetInstanceTypeNamesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{307} } -func (x *CreateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { +func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { if x != nil { - return x.ActionTriggers + return x.CloudProviders } return nil } -func (x *CreateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" -} - -func (x *CreateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd - } - return 0 -} - -func (x *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds - } - return 0 -} - -type CreateStorageRecommendationPolicyResponse struct { +type GetInstanceTypeNamesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` } -func (x *CreateStorageRecommendationPolicyResponse) Reset() { - *x = CreateStorageRecommendationPolicyResponse{} +func (x *GetInstanceTypeNamesResponse) Reset() { + *x = GetInstanceTypeNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[288] + mi := &file_api_v1_recommendation_proto_msgTypes[308] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyResponse) String() string { +func (x *GetInstanceTypeNamesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*GetInstanceTypeNamesResponse) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[288] +func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[308] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22964,43 +26299,44 @@ func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use CreateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*CreateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{288} +// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{308} } -func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { if x != nil { - return x.Policy + return x.InstanceTypes } return nil } -type GetStorageRecommendationPolicyRequest struct { +type SubnetSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (x *GetStorageRecommendationPolicyRequest) Reset() { - *x = GetStorageRecommendationPolicyRequest{} +func (x *SubnetSelectorTerm) Reset() { + *x = SubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[289] + mi := &file_api_v1_recommendation_proto_msgTypes[309] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyRequest) String() string { +func (x *SubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*SubnetSelectorTerm) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[289] +func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[309] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23011,43 +26347,52 @@ func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{289} +// Deprecated: Use SubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*SubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{309} } -func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *SubnetSelectorTerm) GetTags() map[string]string { if x != nil { - return x.PolicyId + return x.Tags + } + return nil +} + +func (x *SubnetSelectorTerm) GetId() string { + if x != nil { + return x.Id } return "" } -type GetStorageRecommendationPolicyResponse struct { +type SecurityGroupSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` } -func (x *GetStorageRecommendationPolicyResponse) Reset() { - *x = GetStorageRecommendationPolicyResponse{} +func (x *SecurityGroupSelectorTerm) Reset() { + *x = SecurityGroupSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[290] + mi := &file_api_v1_recommendation_proto_msgTypes[310] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyResponse) String() string { +func (x *SecurityGroupSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*SecurityGroupSelectorTerm) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[290] +func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[310] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23058,43 +26403,59 @@ func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} +// Deprecated: Use SecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*SecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{310} } -func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { if x != nil { - return x.Policy + return x.Tags } return nil } -type ListStorageRecommendationPoliciesRequest struct { +func (x *SecurityGroupSelectorTerm) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SecurityGroupSelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type CapacityReservationSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Tags map[string]string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` } -func (x *ListStorageRecommendationPoliciesRequest) Reset() { - *x = ListStorageRecommendationPoliciesRequest{} +func (x *CapacityReservationSelectorTerm) Reset() { + *x = CapacityReservationSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[291] + mi := &file_api_v1_recommendation_proto_msgTypes[311] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesRequest) String() string { +func (x *CapacityReservationSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} +func (*CapacityReservationSelectorTerm) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[291] +func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[311] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23105,43 +26466,62 @@ func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListStorageRecommendationPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListStorageRecommendationPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{291} +// Deprecated: Use CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. +func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{311} } -func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { +func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { if x != nil { - return x.TeamId + return x.Tags + } + return nil +} + +func (x *CapacityReservationSelectorTerm) GetId() string { + if x != nil { + return x.Id } return "" } -type ListStorageRecommendationPoliciesResponse struct { +func (x *CapacityReservationSelectorTerm) GetOwnerId() string { + if x != nil { + return x.OwnerId + } + return "" +} + +type AMISelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + Tags map[string]string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Owner string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + SsmParameter string `protobuf:"bytes,6,opt,name=ssm_parameter,json=ssmParameter,proto3" json:"ssm_parameter,omitempty"` } -func (x *ListStorageRecommendationPoliciesResponse) Reset() { - *x = ListStorageRecommendationPoliciesResponse{} +func (x *AMISelectorTerm) Reset() { + *x = AMISelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[292] + mi := &file_api_v1_recommendation_proto_msgTypes[312] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesResponse) String() string { +func (x *AMISelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} +func (*AMISelectorTerm) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[292] +func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[312] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23152,58 +26532,89 @@ func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use ListStorageRecommendationPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListStorageRecommendationPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{292} +// Deprecated: Use AMISelectorTerm.ProtoReflect.Descriptor instead. +func (*AMISelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{312} } -func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { +func (x *AMISelectorTerm) GetAlias() string { if x != nil { - return x.Policies + return x.Alias + } + return "" +} + +func (x *AMISelectorTerm) GetTags() map[string]string { + if x != nil { + return x.Tags } return nil } -type UpdateStorageRecommendationPolicyRequest struct { +func (x *AMISelectorTerm) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AMISelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AMISelectorTerm) GetOwner() string { + if x != nil { + return x.Owner + } + return "" +} + +func (x *AMISelectorTerm) GetSsmParameter() string { + if x != nil { + return x.SsmParameter + } + return "" +} + +type KubeletConfiguration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,5,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,6,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - LookbackPeriodSeconds *int32 `protobuf:"varint,7,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` - TargetUtilizationPercent *float32 `protobuf:"fixed32,8,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` - WarnDaysToFull *int32 `protobuf:"varint,9,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` - MaxExpansionPerAction *float32 `protobuf:"fixed32,10,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` - MinDataPoints *int32 `protobuf:"varint,11,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` - CriticalDaysToFull *int32 `protobuf:"varint,12,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` - HeadroomDays *int32 `protobuf:"varint,13,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` - MinResizeIncrementGib *int32 `protobuf:"varint,14,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` - MaxMonthlyCostUsd *float32 `protobuf:"fixed32,15,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` - CooldownWindowSeconds *int32 `protobuf:"varint,16,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + ClusterDns []string `protobuf:"bytes,1,rep,name=cluster_dns,json=clusterDns,proto3" json:"cluster_dns,omitempty"` + MaxPods *int32 `protobuf:"varint,2,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + PodsPerCore *int32 `protobuf:"varint,3,opt,name=pods_per_core,json=podsPerCore,proto3,oneof" json:"pods_per_core,omitempty"` + SystemReserved map[string]string `protobuf:"bytes,4,rep,name=system_reserved,json=systemReserved,proto3" json:"system_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + KubeReserved map[string]string `protobuf:"bytes,5,rep,name=kube_reserved,json=kubeReserved,proto3" json:"kube_reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionHard map[string]string `protobuf:"bytes,6,rep,name=eviction_hard,json=evictionHard,proto3" json:"eviction_hard,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionSoft map[string]string `protobuf:"bytes,7,rep,name=eviction_soft,json=evictionSoft,proto3" json:"eviction_soft,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionSoftGracePeriod map[string]string `protobuf:"bytes,8,rep,name=eviction_soft_grace_period,json=evictionSoftGracePeriod,proto3" json:"eviction_soft_grace_period,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + EvictionMaxPodGracePeriod *int32 `protobuf:"varint,9,opt,name=eviction_max_pod_grace_period,json=evictionMaxPodGracePeriod,proto3,oneof" json:"eviction_max_pod_grace_period,omitempty"` + ImageGcHighThresholdPercent *int32 `protobuf:"varint,10,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` + ImageGcLowThresholdPercent *int32 `protobuf:"varint,11,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` + CpuCfsQuota *bool `protobuf:"varint,12,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` } -func (x *UpdateStorageRecommendationPolicyRequest) Reset() { - *x = UpdateStorageRecommendationPolicyRequest{} +func (x *KubeletConfiguration) Reset() { + *x = KubeletConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[293] + mi := &file_api_v1_recommendation_proto_msgTypes[313] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyRequest) String() string { +func (x *KubeletConfiguration) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*KubeletConfiguration) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[293] +func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[313] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23214,148 +26625,122 @@ func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use UpdateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{293} +// Deprecated: Use KubeletConfiguration.ProtoReflect.Descriptor instead. +func (*KubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} } -func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *KubeletConfiguration) GetClusterDns() []string { if x != nil { - return x.PolicyId + return x.ClusterDns } - return "" + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *KubeletConfiguration) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods } - return "" + return 0 } -func (x *UpdateStorageRecommendationPolicyRequest) GetName() string { - if x != nil { - return x.Name +func (x *KubeletConfiguration) GetPodsPerCore() int32 { + if x != nil && x.PodsPerCore != nil { + return *x.PodsPerCore } - return "" + return 0 } -func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { +func (x *KubeletConfiguration) GetSystemReserved() map[string]string { if x != nil { - return x.Description + return x.SystemReserved } - return "" + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { +func (x *KubeletConfiguration) GetKubeReserved() map[string]string { if x != nil { - return x.ActionTriggers + return x.KubeReserved } return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *KubeletConfiguration) GetEvictionHard() map[string]string { + if x != nil { + return x.EvictionHard } - return "" + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds +func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { + if x != nil { + return x.EvictionSoft } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction - } - return 0 -} - -func (x *UpdateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { + if x != nil { + return x.EvictionSoftGracePeriod } - return 0 + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays +func (x *KubeletConfiguration) GetEvictionMaxPodGracePeriod() int32 { + if x != nil && x.EvictionMaxPodGracePeriod != nil { + return *x.EvictionMaxPodGracePeriod } return 0 } -func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib +func (x *KubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent } return 0 } -func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd +func (x *KubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent } return 0 } -func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *KubeletConfiguration) GetCpuCfsQuota() bool { + if x != nil && x.CpuCfsQuota != nil { + return *x.CpuCfsQuota } - return 0 + return false } -type UpdateStorageRecommendationPolicyResponse struct { +type BlockDeviceMapping struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + DeviceName *string `protobuf:"bytes,1,opt,name=device_name,json=deviceName,proto3,oneof" json:"device_name,omitempty"` + Ebs *BlockDevice `protobuf:"bytes,2,opt,name=ebs,proto3,oneof" json:"ebs,omitempty"` + RootVolume *bool `protobuf:"varint,3,opt,name=root_volume,json=rootVolume,proto3,oneof" json:"root_volume,omitempty"` } -func (x *UpdateStorageRecommendationPolicyResponse) Reset() { - *x = UpdateStorageRecommendationPolicyResponse{} +func (x *BlockDeviceMapping) Reset() { + *x = BlockDeviceMapping{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[294] + mi := &file_api_v1_recommendation_proto_msgTypes[314] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyResponse) String() string { +func (x *BlockDeviceMapping) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*BlockDeviceMapping) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[294] +func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[314] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23366,44 +26751,65 @@ func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use UpdateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} +// Deprecated: Use BlockDeviceMapping.ProtoReflect.Descriptor instead. +func (*BlockDeviceMapping) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{314} } -func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *BlockDeviceMapping) GetDeviceName() string { + if x != nil && x.DeviceName != nil { + return *x.DeviceName + } + return "" +} + +func (x *BlockDeviceMapping) GetEbs() *BlockDevice { if x != nil { - return x.Policy + return x.Ebs } return nil } -type DeleteStorageRecommendationPolicyRequest struct { +func (x *BlockDeviceMapping) GetRootVolume() bool { + if x != nil && x.RootVolume != nil { + return *x.RootVolume + } + return false +} + +type BlockDevice struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + DeleteOnTermination *bool `protobuf:"varint,1,opt,name=delete_on_termination,json=deleteOnTermination,proto3,oneof" json:"delete_on_termination,omitempty"` + Encrypted *bool `protobuf:"varint,2,opt,name=encrypted,proto3,oneof" json:"encrypted,omitempty"` + Iops *int64 `protobuf:"varint,3,opt,name=iops,proto3,oneof" json:"iops,omitempty"` + KmsKeyId *string `protobuf:"bytes,4,opt,name=kms_key_id,json=kmsKeyId,proto3,oneof" json:"kms_key_id,omitempty"` + SnapshotId *string `protobuf:"bytes,5,opt,name=snapshot_id,json=snapshotId,proto3,oneof" json:"snapshot_id,omitempty"` + Throughput *int64 `protobuf:"varint,6,opt,name=throughput,proto3,oneof" json:"throughput,omitempty"` + VolumeInitializationRate *int32 `protobuf:"varint,7,opt,name=volume_initialization_rate,json=volumeInitializationRate,proto3,oneof" json:"volume_initialization_rate,omitempty"` + VolumeSize *string `protobuf:"bytes,8,opt,name=volume_size,json=volumeSize,proto3,oneof" json:"volume_size,omitempty"` + VolumeType *string `protobuf:"bytes,9,opt,name=volume_type,json=volumeType,proto3,oneof" json:"volume_type,omitempty"` } -func (x *DeleteStorageRecommendationPolicyRequest) Reset() { - *x = DeleteStorageRecommendationPolicyRequest{} +func (x *BlockDevice) Reset() { + *x = BlockDevice{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[295] + mi := &file_api_v1_recommendation_proto_msgTypes[315] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStorageRecommendationPolicyRequest) String() string { +func (x *BlockDevice) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*BlockDevice) ProtoMessage() {} -func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[295] +func (x *BlockDevice) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[315] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23414,109 +26820,102 @@ func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use DeleteStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{295} +// Deprecated: Use BlockDevice.ProtoReflect.Descriptor instead. +func (*BlockDevice) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{315} } -func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *BlockDevice) GetDeleteOnTermination() bool { + if x != nil && x.DeleteOnTermination != nil { + return *x.DeleteOnTermination } - return "" + return false } -func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *BlockDevice) GetEncrypted() bool { + if x != nil && x.Encrypted != nil { + return *x.Encrypted } - return "" + return false } -type DeleteStorageRecommendationPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +func (x *BlockDevice) GetIops() int64 { + if x != nil && x.Iops != nil { + return *x.Iops + } + return 0 } -func (x *DeleteStorageRecommendationPolicyResponse) Reset() { - *x = DeleteStorageRecommendationPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[296] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *BlockDevice) GetKmsKeyId() string { + if x != nil && x.KmsKeyId != nil { + return *x.KmsKeyId } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *BlockDevice) GetSnapshotId() string { + if x != nil && x.SnapshotId != nil { + return *x.SnapshotId + } + return "" } -func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} +func (x *BlockDevice) GetThroughput() int64 { + if x != nil && x.Throughput != nil { + return *x.Throughput + } + return 0 +} -func (x *DeleteStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[296] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *BlockDevice) GetVolumeInitializationRate() int32 { + if x != nil && x.VolumeInitializationRate != nil { + return *x.VolumeInitializationRate } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{296} +func (x *BlockDevice) GetVolumeSize() string { + if x != nil && x.VolumeSize != nil { + return *x.VolumeSize + } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { - if x != nil { - return x.Success +func (x *BlockDevice) GetVolumeType() string { + if x != nil && x.VolumeType != nil { + return *x.VolumeType } - return false + return "" } -// StoragePolicyTarget maps a storage policy to clusters with targeting filters -type StoragePolicyTarget struct { +type MetadataOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` - // Targeting filters - NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels - StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` // Target specific storage classes - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + HttpEndpoint *string `protobuf:"bytes,1,opt,name=http_endpoint,json=httpEndpoint,proto3,oneof" json:"http_endpoint,omitempty"` + HttpProtocolIpv6 *string `protobuf:"bytes,2,opt,name=http_protocol_ipv6,json=httpProtocolIpv6,proto3,oneof" json:"http_protocol_ipv6,omitempty"` + HttpPutResponseHopLimit *int64 `protobuf:"varint,3,opt,name=http_put_response_hop_limit,json=httpPutResponseHopLimit,proto3,oneof" json:"http_put_response_hop_limit,omitempty"` + HttpTokens *string `protobuf:"bytes,4,opt,name=http_tokens,json=httpTokens,proto3,oneof" json:"http_tokens,omitempty"` } -func (x *StoragePolicyTarget) Reset() { - *x = StoragePolicyTarget{} +func (x *MetadataOptions) Reset() { + *x = MetadataOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[297] + mi := &file_api_v1_recommendation_proto_msgTypes[316] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StoragePolicyTarget) String() string { +func (x *MetadataOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StoragePolicyTarget) ProtoMessage() {} +func (*MetadataOptions) ProtoMessage() {} -func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[297] +func (x *MetadataOptions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[316] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23527,120 +26926,71 @@ func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StoragePolicyTarget.ProtoReflect.Descriptor instead. -func (*StoragePolicyTarget) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} -} - -func (x *StoragePolicyTarget) GetTargetId() string { - if x != nil { - return x.TargetId - } - return "" -} - -func (x *StoragePolicyTarget) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. +func (*MetadataOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{316} } -func (x *StoragePolicyTarget) GetDescription() string { - if x != nil { - return x.Description +func (x *MetadataOptions) GetHttpEndpoint() string { + if x != nil && x.HttpEndpoint != nil { + return *x.HttpEndpoint } return "" } -func (x *StoragePolicyTarget) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *MetadataOptions) GetHttpProtocolIpv6() string { + if x != nil && x.HttpProtocolIpv6 != nil { + return *x.HttpProtocolIpv6 } return "" } -func (x *StoragePolicyTarget) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *MetadataOptions) GetHttpPutResponseHopLimit() int64 { + if x != nil && x.HttpPutResponseHopLimit != nil { + return *x.HttpPutResponseHopLimit } - return nil + return 0 } -func (x *StoragePolicyTarget) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *MetadataOptions) GetHttpTokens() string { + if x != nil && x.HttpTokens != nil { + return *x.HttpTokens } return "" } -func (x *StoragePolicyTarget) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -func (x *StoragePolicyTarget) GetNamespaceSelector() *LabelSelector { - if x != nil { - return x.NamespaceSelector - } - return nil -} - -func (x *StoragePolicyTarget) GetStorageClasses() []string { - if x != nil { - return x.StorageClasses - } - return nil -} - -func (x *StoragePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *StoragePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -type CreateStoragePolicyTargetRequest struct { +type GCPNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterIds []string `protobuf:"bytes,4,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,6,opt,name=enabled,proto3" json:"enabled,omitempty"` - NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` - StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` + ServiceAccount string `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + ImageSelectorTerms []*GCPImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector_terms,json=imageSelectorTerms,proto3" json:"image_selector_terms,omitempty"` + ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` + KubeletConfiguration *KubeletConfiguration `protobuf:"bytes,4,opt,name=kubelet_configuration,json=kubeletConfiguration,proto3,oneof" json:"kubelet_configuration,omitempty"` + Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Metadata map[string]string `protobuf:"bytes,6,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NetworkTags []string `protobuf:"bytes,7,rep,name=network_tags,json=networkTags,proto3" json:"network_tags,omitempty"` + Disks []*GCPDisk `protobuf:"bytes,8,rep,name=disks,proto3" json:"disks,omitempty"` } -func (x *CreateStoragePolicyTargetRequest) Reset() { - *x = CreateStoragePolicyTargetRequest{} +func (x *GCPNodeClassSpec) Reset() { + *x = GCPNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[298] + mi := &file_api_v1_recommendation_proto_msgTypes[317] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetRequest) String() string { +func (x *GCPNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} +func (*GCPNodeClassSpec) ProtoMessage() {} -func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[298] +func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[317] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23651,92 +27001,93 @@ func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*CreateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{298} +// Deprecated: Use GCPNodeClassSpec.ProtoReflect.Descriptor instead. +func (*GCPNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{317} } -func (x *CreateStoragePolicyTargetRequest) GetName() string { +func (x *GCPNodeClassSpec) GetServiceAccount() string { if x != nil { - return x.Name + return x.ServiceAccount } return "" } -func (x *CreateStoragePolicyTargetRequest) GetDescription() string { +func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { if x != nil { - return x.Description + return x.ImageSelectorTerms } - return "" + return nil } -func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *GCPNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily } return "" } -func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { +func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { if x != nil { - return x.ClusterIds + return x.KubeletConfiguration } return nil } -func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { +func (x *GCPNodeClassSpec) GetLabels() map[string]string { if x != nil { - return x.PolicyId + return x.Labels } - return "" + return nil } -func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { +func (x *GCPNodeClassSpec) GetMetadata() map[string]string { if x != nil { - return x.Enabled + return x.Metadata } - return false + return nil } -func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { +func (x *GCPNodeClassSpec) GetNetworkTags() []string { if x != nil { - return x.NamespaceSelector + return x.NetworkTags } return nil } -func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { +func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { if x != nil { - return x.StorageClasses + return x.Disks } return nil } -type CreateStoragePolicyTargetResponse struct { +type GCPImageSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + Alias string `protobuf:"bytes,1,opt,name=alias,proto3" json:"alias,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (x *CreateStoragePolicyTargetResponse) Reset() { - *x = CreateStoragePolicyTargetResponse{} +func (x *GCPImageSelectorTerm) Reset() { + *x = GCPImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[299] + mi := &file_api_v1_recommendation_proto_msgTypes[318] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetResponse) String() string { +func (x *GCPImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} +func (*GCPImageSelectorTerm) ProtoMessage() {} -func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[299] +func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[318] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23747,44 +27098,54 @@ func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use CreateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*CreateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{299} +// Deprecated: Use GCPImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*GCPImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{318} } -func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { +func (x *GCPImageSelectorTerm) GetAlias() string { if x != nil { - return x.Target + return x.Alias } - return nil + return "" } -type ListStoragePolicyTargetsRequest struct { +func (x *GCPImageSelectorTerm) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GCPDisk struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + SizeGib int32 `protobuf:"varint,1,opt,name=size_gib,json=sizeGib,proto3" json:"size_gib,omitempty"` + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + Boot bool `protobuf:"varint,3,opt,name=boot,proto3" json:"boot,omitempty"` + SecondaryBootImage string `protobuf:"bytes,4,opt,name=secondary_boot_image,json=secondaryBootImage,proto3" json:"secondary_boot_image,omitempty"` + SecondaryBootMode string `protobuf:"bytes,5,opt,name=secondary_boot_mode,json=secondaryBootMode,proto3" json:"secondary_boot_mode,omitempty"` } -func (x *ListStoragePolicyTargetsRequest) Reset() { - *x = ListStoragePolicyTargetsRequest{} +func (x *GCPDisk) Reset() { + *x = GCPDisk{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[300] + mi := &file_api_v1_recommendation_proto_msgTypes[319] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStoragePolicyTargetsRequest) String() string { +func (x *GCPDisk) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} +func (*GCPDisk) ProtoMessage() {} -func (x *ListStoragePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[300] +func (x *GCPDisk) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[319] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23795,97 +27156,78 @@ func (x *ListStoragePolicyTargetsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{300} +// Deprecated: Use GCPDisk.ProtoReflect.Descriptor instead. +func (*GCPDisk) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{319} } -func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { +func (x *GCPDisk) GetSizeGib() int32 { if x != nil { - return x.TeamId + return x.SizeGib } - return "" + return 0 } -func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *GCPDisk) GetCategory() string { + if x != nil { + return x.Category } return "" } -type ListStoragePolicyTargetsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` -} - -func (x *ListStoragePolicyTargetsResponse) Reset() { - *x = ListStoragePolicyTargetsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[301] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GCPDisk) GetBoot() bool { + if x != nil { + return x.Boot } + return false } -func (x *ListStoragePolicyTargetsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} - -func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[301] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GCPDisk) GetSecondaryBootImage() string { + if x != nil { + return x.SecondaryBootImage } - return mi.MessageOf(x) -} - -// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{301} + return "" } -func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { +func (x *GCPDisk) GetSecondaryBootMode() string { if x != nil { - return x.Targets + return x.SecondaryBootMode } - return nil + return "" } -type UpdateStoragePolicyTargetRequest struct { +type AzureNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + VnetSubnetId *string `protobuf:"bytes,1,opt,name=vnet_subnet_id,json=vnetSubnetId,proto3,oneof" json:"vnet_subnet_id,omitempty"` + OsDiskSizeGb *int32 `protobuf:"varint,2,opt,name=os_disk_size_gb,json=osDiskSizeGb,proto3,oneof" json:"os_disk_size_gb,omitempty"` + ImageFamily *string `protobuf:"bytes,3,opt,name=image_family,json=imageFamily,proto3,oneof" json:"image_family,omitempty"` // Ubuntu, Ubuntu2204, Ubuntu2404, AzureLinux + FipsMode *string `protobuf:"bytes,4,opt,name=fips_mode,json=fipsMode,proto3,oneof" json:"fips_mode,omitempty"` // FIPS or Disabled + Tags map[string]string `protobuf:"bytes,5,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Kubelet *AzureKubeletConfiguration `protobuf:"bytes,6,opt,name=kubelet,proto3,oneof" json:"kubelet,omitempty"` + MaxPods *int32 `protobuf:"varint,7,opt,name=max_pods,json=maxPods,proto3,oneof" json:"max_pods,omitempty"` + ImageVersion *string `protobuf:"bytes,8,opt,name=image_version,json=imageVersion,proto3,oneof" json:"image_version,omitempty"` } -func (x *UpdateStoragePolicyTargetRequest) Reset() { - *x = UpdateStoragePolicyTargetRequest{} +func (x *AzureNodeClassSpec) Reset() { + *x = AzureNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[302] + mi := &file_api_v1_recommendation_proto_msgTypes[320] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStoragePolicyTargetRequest) String() string { +func (x *AzureNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} +func (*AzureNodeClassSpec) ProtoMessage() {} -func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[302] +func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[320] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23896,43 +27238,101 @@ func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*UpdateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} +// Deprecated: Use AzureNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AzureNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{320} } -func (x *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { +func (x *AzureNodeClassSpec) GetVnetSubnetId() string { + if x != nil && x.VnetSubnetId != nil { + return *x.VnetSubnetId + } + return "" +} + +func (x *AzureNodeClassSpec) GetOsDiskSizeGb() int32 { + if x != nil && x.OsDiskSizeGb != nil { + return *x.OsDiskSizeGb + } + return 0 +} + +func (x *AzureNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily + } + return "" +} + +func (x *AzureNodeClassSpec) GetFipsMode() string { + if x != nil && x.FipsMode != nil { + return *x.FipsMode + } + return "" +} + +func (x *AzureNodeClassSpec) GetTags() map[string]string { if x != nil { - return x.Target + return x.Tags } return nil } -type UpdateStoragePolicyTargetResponse struct { +func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { + if x != nil { + return x.Kubelet + } + return nil +} + +func (x *AzureNodeClassSpec) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods + } + return 0 +} + +func (x *AzureNodeClassSpec) GetImageVersion() string { + if x != nil && x.ImageVersion != nil { + return *x.ImageVersion + } + return "" +} + +type AzureKubeletConfiguration struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` + CpuManagerPolicy *string `protobuf:"bytes,1,opt,name=cpu_manager_policy,json=cpuManagerPolicy,proto3,oneof" json:"cpu_manager_policy,omitempty"` // none, static + CpuCfsQuota *bool `protobuf:"varint,2,opt,name=cpu_cfs_quota,json=cpuCfsQuota,proto3,oneof" json:"cpu_cfs_quota,omitempty"` + CpuCfsQuotaPeriod *string `protobuf:"bytes,3,opt,name=cpu_cfs_quota_period,json=cpuCfsQuotaPeriod,proto3,oneof" json:"cpu_cfs_quota_period,omitempty"` // e.g., "100ms" + ImageGcHighThresholdPercent *int32 `protobuf:"varint,4,opt,name=image_gc_high_threshold_percent,json=imageGcHighThresholdPercent,proto3,oneof" json:"image_gc_high_threshold_percent,omitempty"` + ImageGcLowThresholdPercent *int32 `protobuf:"varint,5,opt,name=image_gc_low_threshold_percent,json=imageGcLowThresholdPercent,proto3,oneof" json:"image_gc_low_threshold_percent,omitempty"` + TopologyManagerPolicy *string `protobuf:"bytes,6,opt,name=topology_manager_policy,json=topologyManagerPolicy,proto3,oneof" json:"topology_manager_policy,omitempty"` // restricted, best-effort, none, single-numa-node + AllowedUnsafeSysctls []string `protobuf:"bytes,7,rep,name=allowed_unsafe_sysctls,json=allowedUnsafeSysctls,proto3" json:"allowed_unsafe_sysctls,omitempty"` + ContainerLogMaxSize *string `protobuf:"bytes,8,opt,name=container_log_max_size,json=containerLogMaxSize,proto3,oneof" json:"container_log_max_size,omitempty"` // e.g., "50Mi" + ContainerLogMaxFiles *int32 `protobuf:"varint,9,opt,name=container_log_max_files,json=containerLogMaxFiles,proto3,oneof" json:"container_log_max_files,omitempty"` + PodPidsLimit *int64 `protobuf:"varint,10,opt,name=pod_pids_limit,json=podPidsLimit,proto3,oneof" json:"pod_pids_limit,omitempty"` } -func (x *UpdateStoragePolicyTargetResponse) Reset() { - *x = UpdateStoragePolicyTargetResponse{} +func (x *AzureKubeletConfiguration) Reset() { + *x = AzureKubeletConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[303] + mi := &file_api_v1_recommendation_proto_msgTypes[321] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStoragePolicyTargetResponse) String() string { +func (x *AzureKubeletConfiguration) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} +func (*AzureKubeletConfiguration) ProtoMessage() {} -func (x *UpdateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[303] +func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[321] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23943,44 +27343,108 @@ func (x *UpdateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{303} +// Deprecated: Use AzureKubeletConfiguration.ProtoReflect.Descriptor instead. +func (*AzureKubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{321} } -func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { +func (x *AzureKubeletConfiguration) GetCpuManagerPolicy() string { + if x != nil && x.CpuManagerPolicy != nil { + return *x.CpuManagerPolicy + } + return "" +} + +func (x *AzureKubeletConfiguration) GetCpuCfsQuota() bool { + if x != nil && x.CpuCfsQuota != nil { + return *x.CpuCfsQuota + } + return false +} + +func (x *AzureKubeletConfiguration) GetCpuCfsQuotaPeriod() string { + if x != nil && x.CpuCfsQuotaPeriod != nil { + return *x.CpuCfsQuotaPeriod + } + return "" +} + +func (x *AzureKubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent + } + return 0 +} + +func (x *AzureKubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent + } + return 0 +} + +func (x *AzureKubeletConfiguration) GetTopologyManagerPolicy() string { + if x != nil && x.TopologyManagerPolicy != nil { + return *x.TopologyManagerPolicy + } + return "" +} + +func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { if x != nil { - return x.Target + return x.AllowedUnsafeSysctls } return nil } -type DeleteStoragePolicyTargetRequest struct { +func (x *AzureKubeletConfiguration) GetContainerLogMaxSize() string { + if x != nil && x.ContainerLogMaxSize != nil { + return *x.ContainerLogMaxSize + } + return "" +} + +func (x *AzureKubeletConfiguration) GetContainerLogMaxFiles() int32 { + if x != nil && x.ContainerLogMaxFiles != nil { + return *x.ContainerLogMaxFiles + } + return 0 +} + +func (x *AzureKubeletConfiguration) GetPodPidsLimit() int64 { + if x != nil && x.PodPidsLimit != nil { + return *x.PodPidsLimit + } + return 0 +} + +type OCIImageSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + CompartmentId string `protobuf:"bytes,3,opt,name=compartment_id,json=compartmentId,proto3" json:"compartment_id,omitempty"` } -func (x *DeleteStoragePolicyTargetRequest) Reset() { - *x = DeleteStoragePolicyTargetRequest{} +func (x *OCIImageSelectorTerm) Reset() { + *x = OCIImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[304] + mi := &file_api_v1_recommendation_proto_msgTypes[322] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetRequest) String() string { +func (x *OCIImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} +func (*OCIImageSelectorTerm) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[304] +func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[322] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23991,50 +27455,58 @@ func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*DeleteStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{304} +// Deprecated: Use OCIImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCIImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{322} } -func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { +func (x *OCIImageSelectorTerm) GetId() string { if x != nil { - return x.TargetId + return x.Id } return "" } -func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { +func (x *OCIImageSelectorTerm) GetName() string { if x != nil { - return x.TeamId + return x.Name } return "" } -type DeleteStoragePolicyTargetResponse struct { +func (x *OCIImageSelectorTerm) GetCompartmentId() string { + if x != nil { + return x.CompartmentId + } + return "" +} + +type OCISubnetSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *DeleteStoragePolicyTargetResponse) Reset() { - *x = DeleteStoragePolicyTargetResponse{} +func (x *OCISubnetSelectorTerm) Reset() { + *x = OCISubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[305] + mi := &file_api_v1_recommendation_proto_msgTypes[323] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetResponse) String() string { +func (x *OCISubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} +func (*OCISubnetSelectorTerm) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[305] +func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[323] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24045,72 +27517,51 @@ func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use DeleteStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*DeleteStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{305} +// Deprecated: Use OCISubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{323} } -func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { +func (x *OCISubnetSelectorTerm) GetId() string { if x != nil { - return x.Success + return x.Id } - return false + return "" } -// PvcStorageRecommendation represents a specific recommendation for a PVC -type PvcStorageRecommendation struct { +func (x *OCISubnetSelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type OCISecurityGroupSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` - PvcUid string `protobuf:"bytes,2,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PvcName string `protobuf:"bytes,3,opt,name=pvc_name,json=pvcName,proto3" json:"pvc_name,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - CurrentCapacityBytes int64 `protobuf:"varint,10,opt,name=current_capacity_bytes,json=currentCapacityBytes,proto3" json:"current_capacity_bytes,omitempty"` - RecommendedCapacityBytes int64 `protobuf:"varint,11,opt,name=recommended_capacity_bytes,json=recommendedCapacityBytes,proto3" json:"recommended_capacity_bytes,omitempty"` - UsedBytesAtTime int64 `protobuf:"varint,12,opt,name=used_bytes_at_time,json=usedBytesAtTime,proto3" json:"used_bytes_at_time,omitempty"` - UtilizationPct float64 `protobuf:"fixed64,13,opt,name=utilization_pct,json=utilizationPct,proto3" json:"utilization_pct,omitempty"` - GrowthRateBytesPerDay float64 `protobuf:"fixed64,14,opt,name=growth_rate_bytes_per_day,json=growthRateBytesPerDay,proto3" json:"growth_rate_bytes_per_day,omitempty"` - DaysToFull float64 `protobuf:"fixed64,15,opt,name=days_to_full,json=daysToFull,proto3" json:"days_to_full,omitempty"` - ConfidenceScore float64 `protobuf:"fixed64,16,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` - PolicyId string `protobuf:"bytes,20,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - PolicyTargetId *string `protobuf:"bytes,21,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` - CostCurrentMonthlyUsd float64 `protobuf:"fixed64,25,opt,name=cost_current_monthly_usd,json=costCurrentMonthlyUsd,proto3" json:"cost_current_monthly_usd,omitempty"` - CostRecommendedMonthlyUsd float64 `protobuf:"fixed64,26,opt,name=cost_recommended_monthly_usd,json=costRecommendedMonthlyUsd,proto3" json:"cost_recommended_monthly_usd,omitempty"` - CostDeltaMonthlyUsd float64 `protobuf:"fixed64,27,opt,name=cost_delta_monthly_usd,json=costDeltaMonthlyUsd,proto3" json:"cost_delta_monthly_usd,omitempty"` - Status RecommendationStatus `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` - Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` - Error *string `protobuf:"bytes,32,opt,name=error,proto3,oneof" json:"error,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,40,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - AppliedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - OperationType PvcOperationType `protobuf:"varint,60,opt,name=operation_type,json=operationType,proto3,enum=api.v1.PvcOperationType" json:"operation_type,omitempty"` - WorkloadKind *string `protobuf:"bytes,61,opt,name=workload_kind,json=workloadKind,proto3,oneof" json:"workload_kind,omitempty"` - WorkloadName *string `protobuf:"bytes,62,opt,name=workload_name,json=workloadName,proto3,oneof" json:"workload_name,omitempty"` - WorkloadUid *string `protobuf:"bytes,63,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` } -func (x *PvcStorageRecommendation) Reset() { - *x = PvcStorageRecommendation{} +func (x *OCISecurityGroupSelectorTerm) Reset() { + *x = OCISecurityGroupSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[306] + mi := &file_api_v1_recommendation_proto_msgTypes[324] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PvcStorageRecommendation) String() string { +func (x *OCISecurityGroupSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PvcStorageRecommendation) ProtoMessage() {} +func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} -func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[306] +func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[324] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24121,239 +27572,252 @@ func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PvcStorageRecommendation.ProtoReflect.Descriptor instead. -func (*PvcStorageRecommendation) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{306} +// Deprecated: Use OCISecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{324} } -func (x *PvcStorageRecommendation) GetRecommendationId() string { +func (x *OCISecurityGroupSelectorTerm) GetId() string { if x != nil { - return x.RecommendationId + return x.Id } return "" } -func (x *PvcStorageRecommendation) GetPvcUid() string { +func (x *OCISecurityGroupSelectorTerm) GetName() string { if x != nil { - return x.PvcUid + return x.Name } return "" } -func (x *PvcStorageRecommendation) GetPvcName() string { - if x != nil { - return x.PvcName - } - return "" -} +type OCIBootConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *PvcStorageRecommendation) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" + BootVolumeSizeInGbs int64 `protobuf:"varint,1,opt,name=boot_volume_size_in_gbs,json=bootVolumeSizeInGbs,proto3" json:"boot_volume_size_in_gbs,omitempty"` + BootVolumeVpusPerGb int64 `protobuf:"varint,2,opt,name=boot_volume_vpus_per_gb,json=bootVolumeVpusPerGb,proto3" json:"boot_volume_vpus_per_gb,omitempty"` } -func (x *PvcStorageRecommendation) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *OCIBootConfig) Reset() { + *x = OCIBootConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[325] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *PvcStorageRecommendation) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +func (x *OCIBootConfig) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { - if x != nil { - return x.CurrentCapacityBytes - } - return 0 -} +func (*OCIBootConfig) ProtoMessage() {} -func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { - if x != nil { - return x.RecommendedCapacityBytes +func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[325] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { - if x != nil { - return x.UsedBytesAtTime - } - return 0 +// Deprecated: Use OCIBootConfig.ProtoReflect.Descriptor instead. +func (*OCIBootConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} } -func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { +func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { if x != nil { - return x.UtilizationPct + return x.BootVolumeSizeInGbs } return 0 } -func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { +func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { if x != nil { - return x.GrowthRateBytesPerDay + return x.BootVolumeVpusPerGb } return 0 } -func (x *PvcStorageRecommendation) GetDaysToFull() float64 { - if x != nil { - return x.DaysToFull - } - return 0 -} +type OCILaunchOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { - if x != nil { - return x.ConfidenceScore - } - return 0 + BootVolumeType *string `protobuf:"bytes,1,opt,name=boot_volume_type,json=bootVolumeType,proto3,oneof" json:"boot_volume_type,omitempty"` + Firmware *string `protobuf:"bytes,2,opt,name=firmware,proto3,oneof" json:"firmware,omitempty"` + NetworkType *string `protobuf:"bytes,3,opt,name=network_type,json=networkType,proto3,oneof" json:"network_type,omitempty"` + RemoteDataVolumeType *string `protobuf:"bytes,4,opt,name=remote_data_volume_type,json=remoteDataVolumeType,proto3,oneof" json:"remote_data_volume_type,omitempty"` + IsConsistentVolumeNamingEnabled *bool `protobuf:"varint,5,opt,name=is_consistent_volume_naming_enabled,json=isConsistentVolumeNamingEnabled,proto3,oneof" json:"is_consistent_volume_naming_enabled,omitempty"` } -func (x *PvcStorageRecommendation) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *OCILaunchOptions) Reset() { + *x = OCILaunchOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[326] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *PvcStorageRecommendation) GetPolicyTargetId() string { - if x != nil && x.PolicyTargetId != nil { - return *x.PolicyTargetId - } - return "" +func (x *OCILaunchOptions) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { - if x != nil { - return x.CostCurrentMonthlyUsd +func (*OCILaunchOptions) ProtoMessage() {} + +func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[326] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *PvcStorageRecommendation) GetCostRecommendedMonthlyUsd() float64 { - if x != nil { - return x.CostRecommendedMonthlyUsd - } - return 0 +// Deprecated: Use OCILaunchOptions.ProtoReflect.Descriptor instead. +func (*OCILaunchOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{326} } -func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { - if x != nil { - return x.CostDeltaMonthlyUsd +func (x *OCILaunchOptions) GetBootVolumeType() string { + if x != nil && x.BootVolumeType != nil { + return *x.BootVolumeType } - return 0 + return "" } -func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { - if x != nil { - return x.Status +func (x *OCILaunchOptions) GetFirmware() string { + if x != nil && x.Firmware != nil { + return *x.Firmware } - return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED + return "" } -func (x *PvcStorageRecommendation) GetReasoning() string { - if x != nil && x.Reasoning != nil { - return *x.Reasoning +func (x *OCILaunchOptions) GetNetworkType() string { + if x != nil && x.NetworkType != nil { + return *x.NetworkType } return "" } -func (x *PvcStorageRecommendation) GetError() string { - if x != nil && x.Error != nil { - return *x.Error +func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { + if x != nil && x.RemoteDataVolumeType != nil { + return *x.RemoteDataVolumeType } return "" } -func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil +func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { + if x != nil && x.IsConsistentVolumeNamingEnabled != nil { + return *x.IsConsistentVolumeNamingEnabled + } + return false } -func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { - if x != nil { - return x.AppliedAt - } - return nil +type OCIVolumeAttributes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SizeInGbs int64 `protobuf:"varint,1,opt,name=size_in_gbs,json=sizeInGbs,proto3" json:"size_in_gbs,omitempty"` + VpusPerGb int64 `protobuf:"varint,2,opt,name=vpus_per_gb,json=vpusPerGb,proto3" json:"vpus_per_gb,omitempty"` } -func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *OCIVolumeAttributes) Reset() { + *x = OCIVolumeAttributes{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[327] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil +func (x *OCIVolumeAttributes) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { - if x != nil { - return x.OperationType +func (*OCIVolumeAttributes) ProtoMessage() {} + +func (x *OCIVolumeAttributes) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[327] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED + return mi.MessageOf(x) } -func (x *PvcStorageRecommendation) GetWorkloadKind() string { - if x != nil && x.WorkloadKind != nil { - return *x.WorkloadKind - } - return "" +// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. +func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{327} } -func (x *PvcStorageRecommendation) GetWorkloadName() string { - if x != nil && x.WorkloadName != nil { - return *x.WorkloadName +func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { + if x != nil { + return x.SizeInGbs } - return "" + return 0 } -func (x *PvcStorageRecommendation) GetWorkloadUid() string { - if x != nil && x.WorkloadUid != nil { - return *x.WorkloadUid +func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { + if x != nil { + return x.VpusPerGb } - return "" + return 0 } -type GetPvcStorageRecommendationRequest struct { +type OCINodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + VcnId string `protobuf:"bytes,1,opt,name=vcn_id,json=vcnId,proto3" json:"vcn_id,omitempty"` + ImageSelector []*OCIImageSelectorTerm `protobuf:"bytes,2,rep,name=image_selector,json=imageSelector,proto3" json:"image_selector,omitempty"` + SubnetSelector []*OCISubnetSelectorTerm `protobuf:"bytes,3,rep,name=subnet_selector,json=subnetSelector,proto3" json:"subnet_selector,omitempty"` + SecurityGroupSelector []*OCISecurityGroupSelectorTerm `protobuf:"bytes,4,rep,name=security_group_selector,json=securityGroupSelector,proto3" json:"security_group_selector,omitempty"` + UserData *string `protobuf:"bytes,5,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` + PreInstallScript *string `protobuf:"bytes,6,opt,name=pre_install_script,json=preInstallScript,proto3,oneof" json:"pre_install_script,omitempty"` + MetaData map[string]string `protobuf:"bytes,7,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ImageFamily string `protobuf:"bytes,8,opt,name=image_family,json=imageFamily,proto3" json:"image_family,omitempty"` + Tags map[string]string `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + FreeFormTags map[string]string `protobuf:"bytes,10,rep,name=free_form_tags,json=freeFormTags,proto3" json:"free_form_tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + BootConfig *OCIBootConfig `protobuf:"bytes,11,opt,name=boot_config,json=bootConfig,proto3" json:"boot_config,omitempty"` + LaunchOptions *OCILaunchOptions `protobuf:"bytes,12,opt,name=launch_options,json=launchOptions,proto3" json:"launch_options,omitempty"` + BlockDevices []*OCIVolumeAttributes `protobuf:"bytes,13,rep,name=block_devices,json=blockDevices,proto3" json:"block_devices,omitempty"` + AgentList []string `protobuf:"bytes,14,rep,name=agent_list,json=agentList,proto3" json:"agent_list,omitempty"` } -func (x *GetPvcStorageRecommendationRequest) Reset() { - *x = GetPvcStorageRecommendationRequest{} +func (x *OCINodeClassSpec) Reset() { + *x = OCINodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[307] + mi := &file_api_v1_recommendation_proto_msgTypes[328] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPvcStorageRecommendationRequest) String() string { +func (x *OCINodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCINodeClassSpec) ProtoMessage() {} -func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[307] +func (x *OCINodeClassSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[328] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24364,92 +27828,136 @@ func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*GetPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{307} +// Deprecated: Use OCINodeClassSpec.ProtoReflect.Descriptor instead. +func (*OCINodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{328} } -func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { +func (x *OCINodeClassSpec) GetVcnId() string { if x != nil { - return x.RecommendationId + return x.VcnId } return "" } -type GetPvcStorageRecommendationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { + if x != nil { + return x.ImageSelector + } + return nil +} - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` +func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { + if x != nil { + return x.SubnetSelector + } + return nil } -func (x *GetPvcStorageRecommendationResponse) Reset() { - *x = GetPvcStorageRecommendationResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[308] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { + if x != nil { + return x.SecurityGroupSelector } + return nil } -func (x *GetPvcStorageRecommendationResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *OCINodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData + } + return "" } -func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} +func (x *OCINodeClassSpec) GetPreInstallScript() string { + if x != nil && x.PreInstallScript != nil { + return *x.PreInstallScript + } + return "" +} -func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[308] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *OCINodeClassSpec) GetMetaData() map[string]string { + if x != nil { + return x.MetaData } - return mi.MessageOf(x) + return nil } -// Deprecated: Use GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{308} +func (x *OCINodeClassSpec) GetImageFamily() string { + if x != nil { + return x.ImageFamily + } + return "" } -func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *OCINodeClassSpec) GetTags() map[string]string { if x != nil { - return x.Recommendation + return x.Tags } return nil } -type ListPvcStorageRecommendationsRequest struct { +func (x *OCINodeClassSpec) GetFreeFormTags() map[string]string { + if x != nil { + return x.FreeFormTags + } + return nil +} + +func (x *OCINodeClassSpec) GetBootConfig() *OCIBootConfig { + if x != nil { + return x.BootConfig + } + return nil +} + +func (x *OCINodeClassSpec) GetLaunchOptions() *OCILaunchOptions { + if x != nil { + return x.LaunchOptions + } + return nil +} + +func (x *OCINodeClassSpec) GetBlockDevices() []*OCIVolumeAttributes { + if x != nil { + return x.BlockDevices + } + return nil +} + +func (x *OCINodeClassSpec) GetAgentList() []string { + if x != nil { + return x.AgentList + } + return nil +} + +type KarpenterSettingsRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` - Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // contents is the full KarpenterSettings YAML (devzero.karpenter.sh/v1alpha1, name "default"). + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` + RecommendationId string `protobuf:"bytes,2,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` } -func (x *ListPvcStorageRecommendationsRequest) Reset() { - *x = ListPvcStorageRecommendationsRequest{} +func (x *KarpenterSettingsRecommendation) Reset() { + *x = KarpenterSettingsRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[309] + mi := &file_api_v1_recommendation_proto_msgTypes[329] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsRequest) String() string { +func (x *KarpenterSettingsRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} +func (*KarpenterSettingsRecommendation) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[309] +func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[329] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24460,58 +27968,51 @@ func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListPvcStorageRecommendationsRequest.ProtoReflect.Descriptor instead. -func (*ListPvcStorageRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{309} +// Deprecated: Use KarpenterSettingsRecommendation.ProtoReflect.Descriptor instead. +func (*KarpenterSettingsRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{329} } -func (x *ListPvcStorageRecommendationsRequest) GetTeamId() string { +func (x *KarpenterSettingsRecommendation) GetContents() []byte { if x != nil { - return x.TeamId - } - return "" -} - -func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId + return x.Contents } - return "" + return nil } -func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { +func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { if x != nil { - return x.Pagination + return x.RecommendationId } - return nil + return "" } -type ListPvcStorageRecommendationsResponse struct { +type RawKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendations []*PvcStorageRecommendation `protobuf:"bytes,1,rep,name=recommendations,proto3" json:"recommendations,omitempty"` - Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + NodepoolYaml string `protobuf:"bytes,1,opt,name=nodepool_yaml,json=nodepoolYaml,proto3" json:"nodepool_yaml,omitempty"` + NodeclassYaml string `protobuf:"bytes,2,opt,name=nodeclass_yaml,json=nodeclassYaml,proto3" json:"nodeclass_yaml,omitempty"` } -func (x *ListPvcStorageRecommendationsResponse) Reset() { - *x = ListPvcStorageRecommendationsResponse{} +func (x *RawKarpenterSpec) Reset() { + *x = RawKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[310] + mi := &file_api_v1_recommendation_proto_msgTypes[330] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsResponse) String() string { +func (x *RawKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} +func (*RawKarpenterSpec) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[310] +func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[330] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24522,53 +28023,58 @@ func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListPvcStorageRecommendationsResponse.ProtoReflect.Descriptor instead. -func (*ListPvcStorageRecommendationsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{310} +// Deprecated: Use RawKarpenterSpec.ProtoReflect.Descriptor instead. +func (*RawKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{330} } -func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { +func (x *RawKarpenterSpec) GetNodepoolYaml() string { if x != nil { - return x.Recommendations + return x.NodepoolYaml } - return nil + return "" } -func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { +func (x *RawKarpenterSpec) GetNodeclassYaml() string { if x != nil { - return x.Pagination + return x.NodeclassYaml } - return nil + return "" } -type GeneratePvcStorageRecommendationRequest struct { +// SnapshotRecommendation delivers one rendered resilience-family config +// (spec §7): the multi-doc criu.org/v1 apply bundle compiled by the render +// worker — anchor ConfigMap first, then CheckpointSchedule / +// CheckpointRestoreOperator CRs sorted by name. tunr applies it verbatim +// under the dz-snapshot-crds prune stream; the config ID is echoed back in +// the apply ACK. +type SnapshotRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + CompiledResourcesYaml []byte `protobuf:"bytes,1,opt,name=compiled_resources_yaml,json=compiledResourcesYaml,proto3" json:"compiled_resources_yaml,omitempty"` + SnapshotCfgId string `protobuf:"bytes,2,opt,name=snapshot_cfg_id,json=snapshotCfgId,proto3" json:"snapshot_cfg_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` } -func (x *GeneratePvcStorageRecommendationRequest) Reset() { - *x = GeneratePvcStorageRecommendationRequest{} +func (x *SnapshotRecommendation) Reset() { + *x = SnapshotRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[311] + mi := &file_api_v1_recommendation_proto_msgTypes[331] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationRequest) String() string { +func (x *SnapshotRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} +func (*SnapshotRecommendation) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[311] +func (x *SnapshotRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[331] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24579,67 +28085,63 @@ func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use GeneratePvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*GeneratePvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{311} -} - -func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use SnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*SnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} } -func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { +func (x *SnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.ClusterId + return x.CompiledResourcesYaml } - return "" + return nil } -func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { +func (x *SnapshotRecommendation) GetSnapshotCfgId() string { if x != nil { - return x.PvcUid + return x.SnapshotCfgId } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { +func (x *SnapshotRecommendation) GetContentHash() string { if x != nil { - return x.PolicyId + return x.ContentHash } return "" } -type GeneratePvcStorageRecommendationResponse struct { +// ForensicSnapshotRecommendation is the forensic-family twin +// (ForensicSnapshotChain CRs, dz-forensic-crds prune stream). Kept separate +// from SnapshotRecommendation so neither family's apply can ever prune the +// other's resources (spec §7). +type ForensicSnapshotRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` - // When no recommendation is generated (e.g., low confidence, no resize needed), - // this field explains why - SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` + CompiledResourcesYaml []byte `protobuf:"bytes,1,opt,name=compiled_resources_yaml,json=compiledResourcesYaml,proto3" json:"compiled_resources_yaml,omitempty"` + ForensicCfgId string `protobuf:"bytes,2,opt,name=forensic_cfg_id,json=forensicCfgId,proto3" json:"forensic_cfg_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` } -func (x *GeneratePvcStorageRecommendationResponse) Reset() { - *x = GeneratePvcStorageRecommendationResponse{} +func (x *ForensicSnapshotRecommendation) Reset() { + *x = ForensicSnapshotRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[312] + mi := &file_api_v1_recommendation_proto_msgTypes[332] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationResponse) String() string { +func (x *ForensicSnapshotRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} +func (*ForensicSnapshotRecommendation) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[312] +func (x *ForensicSnapshotRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[332] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24650,53 +28152,59 @@ func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use GeneratePvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*GeneratePvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{312} +// Deprecated: Use ForensicSnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{332} } -func (x *GeneratePvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *ForensicSnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.Recommendation + return x.CompiledResourcesYaml } return nil } -func (x *GeneratePvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *ForensicSnapshotRecommendation) GetForensicCfgId() string { + if x != nil { + return x.ForensicCfgId } return "" } -type PreviewPvcStorageRecommendationRequest struct { +func (x *ForensicSnapshotRecommendation) GetContentHash() string { + if x != nil { + return x.ContentHash + } + return "" +} + +// SnapshotCRStatusReport carries the current statuses of every dakr-managed +// criu.org CR on the cluster (tunr-side reporter, spec §8). +type SnapshotCRStatusReport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` - PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Resources []*SnapshotCRStatus `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *PreviewPvcStorageRecommendationRequest) Reset() { - *x = PreviewPvcStorageRecommendationRequest{} +func (x *SnapshotCRStatusReport) Reset() { + *x = SnapshotCRStatusReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[313] + mi := &file_api_v1_recommendation_proto_msgTypes[333] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewPvcStorageRecommendationRequest) String() string { +func (x *SnapshotCRStatusReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} +func (*SnapshotCRStatusReport) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[313] +func (x *SnapshotCRStatusReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[333] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24707,65 +28215,51 @@ func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use PreviewPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. -func (*PreviewPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} -} - -func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { - if x != nil { - return x.PvcUid - } - return "" +// Deprecated: Use SnapshotCRStatusReport.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatusReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} } -func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { +func (x *SnapshotCRStatusReport) GetResources() []*SnapshotCRStatus { if x != nil { - return x.PolicyId + return x.Resources } - return "" + return nil } -type PreviewPvcStorageRecommendationResponse struct { +// SnapshotCRStatus is one CR's identity + raw status subtree. Annotations +// carry the dakr.devzero.io policy/target ID keys the compiler stamped; +// status_json is the CR's .status marshaled verbatim (dakr parses). +type SnapshotCRStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` - SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Uid string `protobuf:"bytes,4,opt,name=uid,proto3" json:"uid,omitempty"` + Annotations map[string]string `protobuf:"bytes,5,rep,name=annotations,proto3" json:"annotations,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StatusJson []byte `protobuf:"bytes,6,opt,name=status_json,json=statusJson,proto3" json:"status_json,omitempty"` } -func (x *PreviewPvcStorageRecommendationResponse) Reset() { - *x = PreviewPvcStorageRecommendationResponse{} +func (x *SnapshotCRStatus) Reset() { + *x = SnapshotCRStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[314] + mi := &file_api_v1_recommendation_proto_msgTypes[334] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewPvcStorageRecommendationResponse) String() string { +func (x *SnapshotCRStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} +func (*SnapshotCRStatus) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[314] +func (x *SnapshotCRStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[334] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24776,64 +28270,99 @@ func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use PreviewPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*PreviewPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{314} +// Deprecated: Use SnapshotCRStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} } -func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *SnapshotCRStatus) GetKind() string { if x != nil { - return x.Recommendation + return x.Kind } - return nil + return "" } -func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *SnapshotCRStatus) GetName() string { + if x != nil { + return x.Name } return "" } -type WorkloadRuleOOMEvent struct { +func (x *SnapshotCRStatus) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotCRStatus) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *SnapshotCRStatus) GetAnnotations() map[string]string { + if x != nil { + return x.Annotations + } + return nil +} + +func (x *SnapshotCRStatus) GetStatusJson() []byte { + if x != nil { + return x.StatusJson + } + return nil +} + +// SnapshotCRRuntimeStatus is one CR's ingested runtime state, projected for +// reads. One shape serves both families; family-irrelevant fields are unset. +type SnapshotCRRuntimeStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` - MemoryRequestAt int64 `protobuf:"varint,9,opt,name=memory_request_at,json=memoryRequestAt,proto3" json:"memory_request_at,omitempty"` - MemoryLimitAt int64 `protobuf:"varint,10,opt,name=memory_limit_at,json=memoryLimitAt,proto3" json:"memory_limit_at,omitempty"` - MemoryUsageAt int64 `protobuf:"varint,11,opt,name=memory_usage_at,json=memoryUsageAt,proto3" json:"memory_usage_at,omitempty"` - EmergencyReaction bool `protobuf:"varint,12,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` - NewMemoryAfter *int64 `protobuf:"varint,13,opt,name=new_memory_after,json=newMemoryAfter,proto3,oneof" json:"new_memory_after,omitempty"` - RestartCount *int32 `protobuf:"varint,14,opt,name=restart_count,json=restartCount,proto3,oneof" json:"restart_count,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` -} - -func (x *WorkloadRuleOOMEvent) Reset() { - *x = WorkloadRuleOOMEvent{} + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + // ForensicSnapshotChain only: Pending/Running/Completed/Failed. + Phase string `protobuf:"bytes,11,opt,name=phase,proto3" json:"phase,omitempty"` + SnapshotCount int32 `protobuf:"varint,12,opt,name=snapshot_count,json=snapshotCount,proto3" json:"snapshot_count,omitempty"` + AttemptCount int32 `protobuf:"varint,13,opt,name=attempt_count,json=attemptCount,proto3" json:"attempt_count,omitempty"` + FailureCount int32 `protobuf:"varint,14,opt,name=failure_count,json=failureCount,proto3" json:"failure_count,omitempty"` + // CheckpointSchedule only. INTERVAL-TRIGGER-ONLY counter: checkpoints + // fired by annotation/threshold/event triggers never bump it — label + // this "interval activity", or trigger-only schedules read as dead. + CheckpointsCreated int32 `protobuf:"varint,21,opt,name=checkpoints_created,json=checkpointsCreated,proto3" json:"checkpoints_created,omitempty"` + ErrorMessage string `protobuf:"bytes,31,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` + // lastCheckpointTime (schedules) / lastSnapshotTime (chains). + LastActivityTime *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=last_activity_time,json=lastActivityTime,proto3" json:"last_activity_time,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,42,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + CompletionTime *timestamppb.Timestamp `protobuf:"bytes,43,opt,name=completion_time,json=completionTime,proto3" json:"completion_time,omitempty"` + // When dakr last ingested this CR's status. + ObservedAt *timestamppb.Timestamp `protobuf:"bytes,44,opt,name=observed_at,json=observedAt,proto3" json:"observed_at,omitempty"` +} + +func (x *SnapshotCRRuntimeStatus) Reset() { + *x = SnapshotCRRuntimeStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[315] + mi := &file_api_v1_recommendation_proto_msgTypes[335] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleOOMEvent) String() string { +func (x *SnapshotCRRuntimeStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleOOMEvent) ProtoMessage() {} +func (*SnapshotCRRuntimeStatus) ProtoMessage() {} -func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[315] +func (x *SnapshotCRRuntimeStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[335] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24844,144 +28373,136 @@ func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadRuleOOMEvent.ProtoReflect.Descriptor instead. -func (*WorkloadRuleOOMEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{315} +// Deprecated: Use SnapshotCRRuntimeStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRRuntimeStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{335} } -func (x *WorkloadRuleOOMEvent) GetId() string { +func (x *SnapshotCRRuntimeStatus) GetClusterId() string { if x != nil { - return x.Id + return x.ClusterId } return "" } -func (x *WorkloadRuleOOMEvent) GetRuleId() string { +func (x *SnapshotCRRuntimeStatus) GetKind() string { if x != nil { - return x.RuleId + return x.Kind } return "" } -func (x *WorkloadRuleOOMEvent) GetClusterId() string { +func (x *SnapshotCRRuntimeStatus) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *WorkloadRuleOOMEvent) GetNamespace() string { +func (x *SnapshotCRRuntimeStatus) GetNamespace() string { if x != nil { return x.Namespace } return "" } -func (x *WorkloadRuleOOMEvent) GetWorkloadName() string { +func (x *SnapshotCRRuntimeStatus) GetPhase() string { if x != nil { - return x.WorkloadName + return x.Phase } return "" } -func (x *WorkloadRuleOOMEvent) GetContainerName() string { +func (x *SnapshotCRRuntimeStatus) GetSnapshotCount() int32 { if x != nil { - return x.ContainerName + return x.SnapshotCount } - return "" + return 0 } -func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetAttemptCount() int32 { if x != nil { - return x.Timestamp + return x.AttemptCount } - return nil + return 0 } -func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { +func (x *SnapshotCRRuntimeStatus) GetFailureCount() int32 { if x != nil { - return x.RuleGeneration + return x.FailureCount } return 0 } -func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetCheckpointsCreated() int32 { if x != nil { - return x.MemoryRequestAt + return x.CheckpointsCreated } return 0 } -func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetErrorMessage() string { if x != nil { - return x.MemoryLimitAt + return x.ErrorMessage } - return 0 + return "" } -func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetLastActivityTime() *timestamppb.Timestamp { if x != nil { - return x.MemoryUsageAt + return x.LastActivityTime } - return 0 + return nil } -func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { +func (x *SnapshotCRRuntimeStatus) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.EmergencyReaction - } - return false -} - -func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { - if x != nil && x.NewMemoryAfter != nil { - return *x.NewMemoryAfter + return x.StartTime } - return 0 + return nil } -func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { - if x != nil && x.RestartCount != nil { - return *x.RestartCount +func (x *SnapshotCRRuntimeStatus) GetCompletionTime() *timestamppb.Timestamp { + if x != nil { + return x.CompletionTime } - return 0 + return nil } -func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetObservedAt() *timestamppb.Timestamp { if x != nil { - return x.CreatedAt + return x.ObservedAt } return nil } -type ListWorkloadRuleOOMEventsRequest struct { +// SnapshotPolicyTargetStatus aggregates a target's ingested CR statuses +// (capped; ordered namespace, name). +type SnapshotPolicyTargetStatus struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` - Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Resources []*SnapshotCRRuntimeStatus `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *ListWorkloadRuleOOMEventsRequest) Reset() { - *x = ListWorkloadRuleOOMEventsRequest{} +func (x *SnapshotPolicyTargetStatus) Reset() { + *x = SnapshotPolicyTargetStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[316] + mi := &file_api_v1_recommendation_proto_msgTypes[336] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsRequest) String() string { +func (x *SnapshotPolicyTargetStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} +func (*SnapshotPolicyTargetStatus) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[316] +func (x *SnapshotPolicyTargetStatus) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[336] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24992,65 +28513,51 @@ func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleOOMEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleOOMEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{316} +// Deprecated: Use SnapshotPolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*SnapshotPolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{336} } -func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { +func (x *SnapshotPolicyTargetStatus) GetResources() []*SnapshotCRRuntimeStatus { if x != nil { - return x.RuleId - } - return "" -} - -func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { - if x != nil && x.Generation != nil { - return *x.Generation - } - return 0 -} - -func (x *ListWorkloadRuleOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit - } - return 0 -} - -func (x *ListWorkloadRuleOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset + return x.Resources } - return 0 + return nil } -type ListWorkloadRuleOOMEventsResponse struct { +// SnapshotPrereqs surfaces cluster prerequisites derivable from already- +// ingested state (spec §7). CRIU-on-nodes and container-runtime checkpoint +// support need node-level probing no collector performs yet — deferred; a +// cluster can pass these checks and still fail applies for those reasons +// (surfaced through apply events). +type SnapshotPrereqs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + KubernetesVersion string `protobuf:"bytes,1,opt,name=kubernetes_version,json=kubernetesVersion,proto3" json:"kubernetes_version,omitempty"` + // Kubernetes >= 1.30 (ContainerCheckpoint enabled by default). + KubernetesVersionSupported bool `protobuf:"varint,2,opt,name=kubernetes_version_supported,json=kubernetesVersionSupported,proto3" json:"kubernetes_version_supported,omitempty"` + MetricsServerPresent bool `protobuf:"varint,3,opt,name=metrics_server_present,json=metricsServerPresent,proto3" json:"metrics_server_present,omitempty"` } -func (x *ListWorkloadRuleOOMEventsResponse) Reset() { - *x = ListWorkloadRuleOOMEventsResponse{} +func (x *SnapshotPrereqs) Reset() { + *x = SnapshotPrereqs{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[317] + mi := &file_api_v1_recommendation_proto_msgTypes[337] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsResponse) String() string { +func (x *SnapshotPrereqs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} +func (*SnapshotPrereqs) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[317] +func (x *SnapshotPrereqs) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[337] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25061,54 +28568,61 @@ func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleOOMEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleOOMEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{317} +// Deprecated: Use SnapshotPrereqs.ProtoReflect.Descriptor instead. +func (*SnapshotPrereqs) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{337} } -func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *SnapshotPrereqs) GetKubernetesVersion() string { if x != nil { - return x.Events + return x.KubernetesVersion } - return nil + return "" } -func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { +func (x *SnapshotPrereqs) GetKubernetesVersionSupported() bool { if x != nil { - return x.Total + return x.KubernetesVersionSupported } - return 0 + return false } -type ListWorkloadOOMEventsRequest struct { +func (x *SnapshotPrereqs) GetMetricsServerPresent() bool { + if x != nil { + return x.MetricsServerPresent + } + return false +} + +type NodeRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Aws *AWSKarpenterSpec `protobuf:"bytes,1,opt,name=aws,proto3" json:"aws,omitempty"` + Aks *AKSKarpenterSpec `protobuf:"bytes,2,opt,name=aks,proto3" json:"aks,omitempty"` + Gcp *GCPKarpenterSpec `protobuf:"bytes,3,opt,name=gcp,proto3" json:"gcp,omitempty"` + Oci *OCIKarpenterSpec `protobuf:"bytes,4,opt,name=oci,proto3" json:"oci,omitempty"` + NodeRecCfgId string `protobuf:"bytes,41,opt,name=node_rec_cfg_id,json=nodeRecCfgId,proto3" json:"node_rec_cfg_id,omitempty"` } -func (x *ListWorkloadOOMEventsRequest) Reset() { - *x = ListWorkloadOOMEventsRequest{} +func (x *NodeRecommendation) Reset() { + *x = NodeRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[318] + mi := &file_api_v1_recommendation_proto_msgTypes[338] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOOMEventsRequest) String() string { +func (x *NodeRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} +func (*NodeRecommendation) ProtoMessage() {} -func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[318] +func (x *NodeRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[338] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25119,72 +28633,72 @@ func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOOMEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadOOMEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{318} +// Deprecated: Use NodeRecommendation.ProtoReflect.Descriptor instead. +func (*NodeRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{338} } -func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { +func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { if x != nil { - return x.ClusterId + return x.Aws } - return "" + return nil } -func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { +func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { if x != nil { - return x.Namespace + return x.Aks } - return "" + return nil } -func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { +func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { if x != nil { - return x.WorkloadName + return x.Gcp } - return "" + return nil } -func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit +func (x *NodeRecommendation) GetOci() *OCIKarpenterSpec { + if x != nil { + return x.Oci } - return 0 + return nil } -func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset +func (x *NodeRecommendation) GetNodeRecCfgId() string { + if x != nil { + return x.NodeRecCfgId } - return 0 + return "" } -type ListWorkloadOOMEventsResponse struct { +type AWSKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + Ec2Nc []*EC2NodeClass `protobuf:"bytes,6,rep,name=ec2nc,proto3" json:"ec2nc,omitempty"` } -func (x *ListWorkloadOOMEventsResponse) Reset() { - *x = ListWorkloadOOMEventsResponse{} +func (x *AWSKarpenterSpec) Reset() { + *x = AWSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[319] + mi := &file_api_v1_recommendation_proto_msgTypes[339] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOOMEventsResponse) String() string { +func (x *AWSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} +func (*AWSKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadOOMEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[319] +func (x *AWSKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[339] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25195,64 +28709,51 @@ func (x *ListWorkloadOOMEventsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{319} +// Deprecated: Use AWSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AWSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{339} } -func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *AWSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.Events + return x.Np } return nil } -func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { +func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { if x != nil { - return x.Total + return x.Ec2Nc } - return 0 + return nil } -type WorkloadRuleCPUThrottleEvent struct { +type AKSKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` - CpuRequestAt int64 `protobuf:"varint,9,opt,name=cpu_request_at,json=cpuRequestAt,proto3" json:"cpu_request_at,omitempty"` - CpuLimitAt int64 `protobuf:"varint,10,opt,name=cpu_limit_at,json=cpuLimitAt,proto3" json:"cpu_limit_at,omitempty"` - CpuUsageAt int64 `protobuf:"varint,11,opt,name=cpu_usage_at,json=cpuUsageAt,proto3" json:"cpu_usage_at,omitempty"` - ThrottledFraction float64 `protobuf:"fixed64,12,opt,name=throttled_fraction,json=throttledFraction,proto3" json:"throttled_fraction,omitempty"` - EmergencyReaction bool `protobuf:"varint,13,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` - NewCpuAfter *int64 `protobuf:"varint,14,opt,name=new_cpu_after,json=newCpuAfter,proto3,oneof" json:"new_cpu_after,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + Aksnc []*AKSNodeClass `protobuf:"bytes,6,rep,name=aksnc,proto3" json:"aksnc,omitempty"` } -func (x *WorkloadRuleCPUThrottleEvent) Reset() { - *x = WorkloadRuleCPUThrottleEvent{} +func (x *AKSKarpenterSpec) Reset() { + *x = AKSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[320] + mi := &file_api_v1_recommendation_proto_msgTypes[340] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleCPUThrottleEvent) String() string { +func (x *AKSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} +func (*AKSKarpenterSpec) ProtoMessage() {} -func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[320] +func (x *AKSKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[340] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25263,144 +28764,144 @@ func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadRuleCPUThrottleEvent.ProtoReflect.Descriptor instead. -func (*WorkloadRuleCPUThrottleEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{320} +// Deprecated: Use AKSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AKSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{340} } -func (x *WorkloadRuleCPUThrottleEvent) GetId() string { +func (x *AKSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.Id + return x.Np } - return "" + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleId() string { +func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { if x != nil { - return x.RuleId + return x.Aksnc } - return "" + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} +type NodePool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into sigs.k8s.io/karpenter/pkg/apis/v1.NodePool } -func (x *WorkloadRuleCPUThrottleEvent) GetWorkloadName() string { - if x != nil { - return x.WorkloadName +func (x *NodePool) Reset() { + *x = NodePool{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[341] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetContainerName() string { - if x != nil { - return x.ContainerName - } - return "" +func (x *NodePool) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadRuleCPUThrottleEvent) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp +func (*NodePool) ProtoMessage() {} + +func (x *NodePool) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[341] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { - if x != nil { - return x.RuleGeneration - } - return 0 +// Deprecated: Use NodePool.ProtoReflect.Descriptor instead. +func (*NodePool) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{341} } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuRequestAt() int64 { +func (x *NodePool) GetContents() []byte { if x != nil { - return x.CpuRequestAt + return x.Contents } - return 0 + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuLimitAt() int64 { - if x != nil { - return x.CpuLimitAt - } - return 0 +type EC2NodeClass struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/aws/karpenter-provider-aws/pkg/apis/v1.EC2NodeClass } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuUsageAt() int64 { - if x != nil { - return x.CpuUsageAt +func (x *EC2NodeClass) Reset() { + *x = EC2NodeClass{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[342] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetThrottledFraction() float64 { - if x != nil { - return x.ThrottledFraction - } - return 0 +func (x *EC2NodeClass) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadRuleCPUThrottleEvent) GetEmergencyReaction() bool { - if x != nil { - return x.EmergencyReaction +func (*EC2NodeClass) ProtoMessage() {} + +func (x *EC2NodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[342] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *WorkloadRuleCPUThrottleEvent) GetNewCpuAfter() int64 { - if x != nil && x.NewCpuAfter != nil { - return *x.NewCpuAfter - } - return 0 +// Deprecated: Use EC2NodeClass.ProtoReflect.Descriptor instead. +func (*EC2NodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{342} } -func (x *WorkloadRuleCPUThrottleEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *EC2NodeClass) GetContents() []byte { if x != nil { - return x.CreatedAt + return x.Contents } return nil } -type ListWorkloadRuleCPUThrottleEventsRequest struct { +type AKSNodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` - Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/Azure/karpenter-provider-azure/pkg/apis/v1beta1.AKSNodeClass } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsRequest{} +func (x *AKSNodeClass) Reset() { + *x = AKSNodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[321] + mi := &file_api_v1_recommendation_proto_msgTypes[343] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { +func (x *AKSNodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} +func (*AKSNodeClass) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[321] +func (x *AKSNodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[343] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25411,65 +28912,44 @@ func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{321} +// Deprecated: Use AKSNodeClass.ProtoReflect.Descriptor instead. +func (*AKSNodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { +func (x *AKSNodeClass) GetContents() []byte { if x != nil { - return x.RuleId - } - return "" -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetGeneration() int64 { - if x != nil && x.Generation != nil { - return *x.Generation - } - return 0 -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit - } - return 0 -} - -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset + return x.Contents } - return 0 + return nil } -type ListWorkloadRuleCPUThrottleEventsResponse struct { +type GCPKarpenterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + NodeClasses []*GCENodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsResponse{} +func (x *GCPKarpenterSpec) Reset() { + *x = GCPKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[322] + mi := &file_api_v1_recommendation_proto_msgTypes[344] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) String() string { +func (x *GCPKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsResponse) ProtoMessage() {} +func (*GCPKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[322] +func (x *GCPKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[344] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25480,54 +28960,50 @@ func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect. return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRuleCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRuleCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{322} +// Deprecated: Use GCPKarpenterSpec.ProtoReflect.Descriptor instead. +func (*GCPKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *GCPKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.Events + return x.Np } return nil } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { +func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { if x != nil { - return x.Total + return x.NodeClasses } - return 0 + return nil } -type ListWorkloadCPUThrottleEventsRequest struct { +type GCENodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` - WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` - Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` - Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/cloudpilot-ai/karpenter-provider-gcp/pkg/apis/v1alpha1.GCENodeClass } -func (x *ListWorkloadCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadCPUThrottleEventsRequest{} +func (x *GCENodeClass) Reset() { + *x = GCENodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[323] + mi := &file_api_v1_recommendation_proto_msgTypes[345] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsRequest) String() string { +func (x *GCENodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} +func (*GCENodeClass) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[323] +func (x *GCENodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[345] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25538,72 +29014,98 @@ func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{323} +// Deprecated: Use GCENodeClass.ProtoReflect.Descriptor instead. +func (*GCENodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} } -func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { +func (x *GCENodeClass) GetContents() []byte { if x != nil { - return x.ClusterId + return x.Contents } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} +type OCIKarpenterSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ListWorkloadCPUThrottleEventsRequest) GetWorkloadName() string { - if x != nil { - return x.WorkloadName - } - return "" + Np []*NodePool `protobuf:"bytes,1,rep,name=np,proto3" json:"np,omitempty"` + NodeClasses []*OCINodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,omitempty"` } -func (x *ListWorkloadCPUThrottleEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit +func (x *OCIKarpenterSpec) Reset() { + *x = OCIKarpenterSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[346] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ListWorkloadCPUThrottleEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset +func (x *OCIKarpenterSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OCIKarpenterSpec) ProtoMessage() {} + +func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[346] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -type ListWorkloadCPUThrottleEventsResponse struct { +// Deprecated: Use OCIKarpenterSpec.ProtoReflect.Descriptor instead. +func (*OCIKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{346} +} + +func (x *OCIKarpenterSpec) GetNp() []*NodePool { + if x != nil { + return x.Np + } + return nil +} + +func (x *OCIKarpenterSpec) GetNodeClasses() []*OCINodeClass { + if x != nil { + return x.NodeClasses + } + return nil +} + +type OCINodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Contents []byte `protobuf:"bytes,1,opt,name=contents,proto3" json:"contents,omitempty"` // can be marshaled into github.com/zoom/karpenter-oci/pkg/apis/v1alpha1.OciNodeClass } -func (x *ListWorkloadCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadCPUThrottleEventsResponse{} +func (x *OCINodeClass) Reset() { + *x = OCINodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[324] + mi := &file_api_v1_recommendation_proto_msgTypes[347] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsResponse) String() string { +func (x *OCINodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsResponse) ProtoMessage() {} +func (*OCINodeClass) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[324] +func (x *OCINodeClass) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[347] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25614,72 +29116,65 @@ func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{324} +// Deprecated: Use OCINodeClass.ProtoReflect.Descriptor instead. +func (*OCINodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{347} } -func (x *ListWorkloadCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *OCINodeClass) GetContents() []byte { if x != nil { - return x.Events + return x.Contents } return nil } -func (x *ListWorkloadCPUThrottleEventsResponse) GetTotal() int64 { - if x != nil { - return x.Total - } - return 0 -} - -type WorkloadOptimizationPolicyProto struct { +// StorageRecommendationPolicy represents a policy for PVC/storage optimization +type StorageRecommendationPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled bool `protobuf:"varint,5,opt,name=enabled,proto3" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,7,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,10,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,11,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,12,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,13,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,14,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,15,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,16,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,17,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,18,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - // HPA: when true, WorkloadRules generated from this policy have HPA - // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. - HpaEnabled bool `protobuf:"varint,19,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + ActionTrigger ActionTrigger `protobuf:"varint,5,opt,name=action_trigger,json=actionTrigger,proto3,enum=api.v1.ActionTrigger" json:"action_trigger,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,7,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,8,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Storage-specific parameters + TargetUtilizationPercent *float32 `protobuf:"fixed32,10,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,11,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,12,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,13,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + // New storage policy fields + CriticalDaysToFull *int32 `protobuf:"varint,14,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,15,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,16,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,17,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,18,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` + IsDefaultPolicy bool `protobuf:"varint,50,opt,name=is_default_policy,json=isDefaultPolicy,proto3" json:"is_default_policy,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *WorkloadOptimizationPolicyProto) Reset() { - *x = WorkloadOptimizationPolicyProto{} +func (x *StorageRecommendationPolicy) Reset() { + *x = StorageRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[325] + mi := &file_api_v1_recommendation_proto_msgTypes[348] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadOptimizationPolicyProto) String() string { +func (x *StorageRecommendationPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} +func (*StorageRecommendationPolicy) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[325] +func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[348] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25690,185 +29185,190 @@ func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadOptimizationPolicyProto.ProtoReflect.Descriptor instead. -func (*WorkloadOptimizationPolicyProto) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} +// Deprecated: Use StorageRecommendationPolicy.ProtoReflect.Descriptor instead. +func (*StorageRecommendationPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{348} } -func (x *WorkloadOptimizationPolicyProto) GetId() string { +func (x *StorageRecommendationPolicy) GetPolicyId() string { if x != nil { - return x.Id + return x.PolicyId } return "" } -func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { +func (x *StorageRecommendationPolicy) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *WorkloadOptimizationPolicyProto) GetName() string { +func (x *StorageRecommendationPolicy) GetName() string { if x != nil { return x.Name } return "" } -func (x *WorkloadOptimizationPolicyProto) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description +func (x *StorageRecommendationPolicy) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *WorkloadOptimizationPolicyProto) GetEnabled() bool { +func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { if x != nil { - return x.Enabled + return x.ActionTrigger } - return false + return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED } -func (x *WorkloadOptimizationPolicyProto) GetClusterIds() []string { +func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { if x != nil { - return x.ClusterIds + return x.ActionTriggers } return nil } -func (x *WorkloadOptimizationPolicyProto) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector +func (x *StorageRecommendationPolicy) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule } - return nil + return "" } -func (x *WorkloadOptimizationPolicyProto) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt +func (x *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetClusterNames() map[string]string { - if x != nil { - return x.ClusterNames +func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints } - return "" + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *StorageRecommendationPolicy) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull } return 0 } -func (x *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +func (x *StorageRecommendationPolicy) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *StorageRecommendationPolicy) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib } - return nil + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule +func (x *StorageRecommendationPolicy) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd } - return "" + return 0 } -func (x *WorkloadOptimizationPolicyProto) GetLiveMigrationEnabled() bool { +func (x *StorageRecommendationPolicy) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetIsDefaultPolicy() bool { if x != nil { - return x.LiveMigrationEnabled + return x.IsDefaultPolicy } return false } -func (x *WorkloadOptimizationPolicyProto) GetUseInPlaceVerticalScaling() bool { +func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.UseInPlaceVerticalScaling + return x.CreatedAt } - return false + return nil } -func (x *WorkloadOptimizationPolicyProto) GetHpaEnabled() bool { +func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.HpaEnabled + return x.UpdatedAt } - return false + return nil } -type CreateWorkloadOptimizationPolicyRequest struct { +type CreateStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,6,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,7,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - HpaEnabled bool `protobuf:"varint,15,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,4,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,5,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,6,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + TargetUtilizationPercent *float32 `protobuf:"fixed32,7,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,8,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,9,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,10,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + CriticalDaysToFull *int32 `protobuf:"varint,11,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,12,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,13,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,14,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,15,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` } -func (x *CreateWorkloadOptimizationPolicyRequest) Reset() { - *x = CreateWorkloadOptimizationPolicyRequest{} +func (x *CreateStorageRecommendationPolicyRequest) Reset() { + *x = CreateStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[326] + mi := &file_api_v1_recommendation_proto_msgTypes[349] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyRequest) String() string { +func (x *CreateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[326] +func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[349] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25879,141 +29379,141 @@ func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use CreateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*CreateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{326} +// Deprecated: Use CreateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{349} } -func (x *CreateWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *CreateWorkloadOptimizationPolicyRequest) GetName() string { +func (x *CreateStorageRecommendationPolicyRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description +func (x *CreateStorageRecommendationPolicyRequest) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *CreateWorkloadOptimizationPolicyRequest) GetEnabled() bool { +func (x *CreateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { if x != nil { - return x.Enabled + return x.ActionTriggers } - return false + return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *CreateStorageRecommendationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule } - return nil + return "" } -func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector +func (x *CreateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return nil + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *CreateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent } - return nil + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *CreateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull } - return "" + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *CreateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction } return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +func (x *CreateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints } - return nil + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *CreateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull } - return nil + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule +func (x *CreateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays } - return "" + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled +func (x *CreateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib } - return false + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling +func (x *CreateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd } - return false + return 0 } -func (x *CreateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { - if x != nil { - return x.HpaEnabled +func (x *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds } - return false + return 0 } -type CreateWorkloadOptimizationPolicyResponse struct { +type CreateStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *CreateWorkloadOptimizationPolicyResponse) Reset() { - *x = CreateWorkloadOptimizationPolicyResponse{} +func (x *CreateStorageRecommendationPolicyResponse) Reset() { + *x = CreateStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[327] + mi := &file_api_v1_recommendation_proto_msgTypes[350] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyResponse) String() string { +func (x *CreateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[327] +func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[350] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26024,48 +29524,43 @@ func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use CreateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*CreateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{327} +// Deprecated: Use CreateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{350} } -func (x *CreateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { return x.Policy } return nil } -type ListWorkloadOptimizationPoliciesRequest struct { +type GetStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Optional. When set, restricts the listing to policies that target this - // cluster — either explicitly via cluster_ids, or implicitly via an empty - // cluster_ids array (which means "all clusters" and therefore applies - // to this cluster too). - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *ListWorkloadOptimizationPoliciesRequest) Reset() { - *x = ListWorkloadOptimizationPoliciesRequest{} +func (x *GetStorageRecommendationPolicyRequest) Reset() { + *x = GetStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[328] + mi := &file_api_v1_recommendation_proto_msgTypes[351] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesRequest) String() string { +func (x *GetStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesRequest) ProtoMessage() {} +func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[328] +func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[351] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26076,50 +29571,43 @@ func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOptimizationPoliciesRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadOptimizationPoliciesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{328} -} - -func (x *ListWorkloadOptimizationPoliciesRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use GetStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{351} } -func (x *ListWorkloadOptimizationPoliciesRequest) GetClusterId() string { +func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.ClusterId + return x.PolicyId } return "" } -type ListWorkloadOptimizationPoliciesResponse struct { +type GetStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*WorkloadOptimizationPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *ListWorkloadOptimizationPoliciesResponse) Reset() { - *x = ListWorkloadOptimizationPoliciesResponse{} +func (x *GetStorageRecommendationPolicyResponse) Reset() { + *x = GetStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[329] + mi := &file_api_v1_recommendation_proto_msgTypes[352] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesResponse) String() string { +func (x *GetStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesResponse) ProtoMessage() {} +func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[329] +func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[352] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26130,44 +29618,43 @@ func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadOptimizationPoliciesResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadOptimizationPoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{329} +// Deprecated: Use GetStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} } -func (x *ListWorkloadOptimizationPoliciesResponse) GetPolicies() []*WorkloadOptimizationPolicyProto { +func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { - return x.Policies + return x.Policy } return nil } -type GetWorkloadOptimizationPolicyRequest struct { +type ListStorageRecommendationPoliciesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *GetWorkloadOptimizationPolicyRequest) Reset() { - *x = GetWorkloadOptimizationPolicyRequest{} +func (x *ListStorageRecommendationPoliciesRequest) Reset() { + *x = ListStorageRecommendationPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[330] + mi := &file_api_v1_recommendation_proto_msgTypes[353] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadOptimizationPolicyRequest) String() string { +func (x *ListStorageRecommendationPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} -func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[330] +func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[353] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26178,50 +29665,43 @@ func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{330} +// Deprecated: Use ListStorageRecommendationPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{353} } -func (x *GetWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadOptimizationPolicyRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId - } - return "" -} - -type GetWorkloadOptimizationPolicyResponse struct { +type ListStorageRecommendationPoliciesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetWorkloadOptimizationPolicyResponse) Reset() { - *x = GetWorkloadOptimizationPolicyResponse{} +func (x *ListStorageRecommendationPoliciesResponse) Reset() { + *x = ListStorageRecommendationPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[331] + mi := &file_api_v1_recommendation_proto_msgTypes[354] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadOptimizationPolicyResponse) String() string { +func (x *ListStorageRecommendationPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} -func (x *GetWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[331] +func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[354] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26232,60 +29712,58 @@ func (x *GetWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Mess return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} +// Deprecated: Use ListStorageRecommendationPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} } -func (x *GetWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { if x != nil { - return x.Policy + return x.Policies } return nil } -type UpdateWorkloadOptimizationPolicyRequest struct { +type UpdateStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` - Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` - Enabled *bool `protobuf:"varint,5,opt,name=enabled,proto3,oneof" json:"enabled,omitempty"` - ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` - NamespaceSelector []string `protobuf:"bytes,7,rep,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` - // Scheduling & Triggers - ActionTriggers []ActionTrigger `protobuf:"varint,8,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - CronSchedule *string `protobuf:"bytes,9,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,10,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,11,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - // Scheduler Optimization - SchedulerPlugins []string `protobuf:"bytes,12,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,13,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled *bool `protobuf:"varint,14,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3,oneof" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling *bool `protobuf:"varint,15,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3,oneof" json:"use_in_place_vertical_scaling,omitempty"` - HpaEnabled *bool `protobuf:"varint,16,opt,name=hpa_enabled,json=hpaEnabled,proto3,oneof" json:"hpa_enabled,omitempty"` + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,5,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,6,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + LookbackPeriodSeconds *int32 `protobuf:"varint,7,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + TargetUtilizationPercent *float32 `protobuf:"fixed32,8,opt,name=target_utilization_percent,json=targetUtilizationPercent,proto3,oneof" json:"target_utilization_percent,omitempty"` + WarnDaysToFull *int32 `protobuf:"varint,9,opt,name=warn_days_to_full,json=warnDaysToFull,proto3,oneof" json:"warn_days_to_full,omitempty"` + MaxExpansionPerAction *float32 `protobuf:"fixed32,10,opt,name=max_expansion_per_action,json=maxExpansionPerAction,proto3,oneof" json:"max_expansion_per_action,omitempty"` + MinDataPoints *int32 `protobuf:"varint,11,opt,name=min_data_points,json=minDataPoints,proto3,oneof" json:"min_data_points,omitempty"` + CriticalDaysToFull *int32 `protobuf:"varint,12,opt,name=critical_days_to_full,json=criticalDaysToFull,proto3,oneof" json:"critical_days_to_full,omitempty"` + HeadroomDays *int32 `protobuf:"varint,13,opt,name=headroom_days,json=headroomDays,proto3,oneof" json:"headroom_days,omitempty"` + MinResizeIncrementGib *int32 `protobuf:"varint,14,opt,name=min_resize_increment_gib,json=minResizeIncrementGib,proto3,oneof" json:"min_resize_increment_gib,omitempty"` + MaxMonthlyCostUsd *float32 `protobuf:"fixed32,15,opt,name=max_monthly_cost_usd,json=maxMonthlyCostUsd,proto3,oneof" json:"max_monthly_cost_usd,omitempty"` + CooldownWindowSeconds *int32 `protobuf:"varint,16,opt,name=cooldown_window_seconds,json=cooldownWindowSeconds,proto3,oneof" json:"cooldown_window_seconds,omitempty"` } -func (x *UpdateWorkloadOptimizationPolicyRequest) Reset() { - *x = UpdateWorkloadOptimizationPolicyRequest{} +func (x *UpdateStorageRecommendationPolicyRequest) Reset() { + *x = UpdateStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[332] + mi := &file_api_v1_recommendation_proto_msgTypes[355] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateWorkloadOptimizationPolicyRequest) String() string { +func (x *UpdateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[332] +func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[355] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26296,148 +29774,148 @@ func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use UpdateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*UpdateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{332} +// Deprecated: Use UpdateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{355} } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { - return x.PolicyId + return x.TeamId } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetName() string { - if x != nil && x.Name != nil { - return *x.Name +func (x *UpdateStorageRecommendationPolicyRequest) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description +func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetEnabled() bool { - if x != nil && x.Enabled != nil { - return *x.Enabled +func (x *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers } - return false + return nil } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule } - return nil + return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector +func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *UpdateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *UpdateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull } - return "" + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *UpdateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction } return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +func (x *UpdateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull } - return nil + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule +func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays } - return "" + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { - if x != nil && x.LiveMigrationEnabled != nil { - return *x.LiveMigrationEnabled +func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib } - return false + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { - if x != nil && x.UseInPlaceVerticalScaling != nil { - return *x.UseInPlaceVerticalScaling +func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd } - return false + return 0 } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { - if x != nil && x.HpaEnabled != nil { - return *x.HpaEnabled +func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds } - return false + return 0 } -type UpdateWorkloadOptimizationPolicyResponse struct { +type UpdateStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *UpdateWorkloadOptimizationPolicyResponse) Reset() { - *x = UpdateWorkloadOptimizationPolicyResponse{} +func (x *UpdateStorageRecommendationPolicyResponse) Reset() { + *x = UpdateStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[333] + mi := &file_api_v1_recommendation_proto_msgTypes[356] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateWorkloadOptimizationPolicyResponse) String() string { +func (x *UpdateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[333] +func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[356] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26448,45 +29926,44 @@ func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use UpdateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*UpdateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} +// Deprecated: Use UpdateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{356} } -func (x *UpdateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { return x.Policy } return nil } -type DeleteWorkloadOptimizationPolicyRequest struct { +type DeleteStorageRecommendationPolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - DeleteRules bool `protobuf:"varint,3,opt,name=delete_rules,json=deleteRules,proto3" json:"delete_rules,omitempty"` // if true, delete associated rules; if false, detach (set policy_id=null) + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *DeleteWorkloadOptimizationPolicyRequest) Reset() { - *x = DeleteWorkloadOptimizationPolicyRequest{} +func (x *DeleteStorageRecommendationPolicyRequest) Reset() { + *x = DeleteStorageRecommendationPolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[334] + mi := &file_api_v1_recommendation_proto_msgTypes[357] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadOptimizationPolicyRequest) String() string { +func (x *DeleteStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[334] +func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[357] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26497,55 +29974,50 @@ func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Me return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} -} - -func (x *DeleteWorkloadOptimizationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use DeleteStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{357} } -func (x *DeleteWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { return x.PolicyId } return "" } -func (x *DeleteWorkloadOptimizationPolicyRequest) GetDeleteRules() bool { +func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { - return x.DeleteRules + return x.TeamId } - return false + return "" } -type DeleteWorkloadOptimizationPolicyResponse struct { +type DeleteStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *DeleteWorkloadOptimizationPolicyResponse) Reset() { - *x = DeleteWorkloadOptimizationPolicyResponse{} +func (x *DeleteStorageRecommendationPolicyResponse) Reset() { + *x = DeleteStorageRecommendationPolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[335] + mi := &file_api_v1_recommendation_proto_msgTypes[358] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadOptimizationPolicyResponse) String() string { +func (x *DeleteStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[335] +func (x *DeleteStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[358] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26556,37 +30028,55 @@ func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.M return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{335} +// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{358} } -type GetWorkloadRulesByPolicyRequest struct { +func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// StoragePolicyTarget maps a storage policy to clusters with targeting filters +type StoragePolicyTarget struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,4,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + PolicyId string `protobuf:"bytes,6,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,10,opt,name=enabled,proto3" json:"enabled,omitempty"` + // Targeting filters + NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` // Target namespaces by labels + StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` // Target specific storage classes + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` } -func (x *GetWorkloadRulesByPolicyRequest) Reset() { - *x = GetWorkloadRulesByPolicyRequest{} +func (x *StoragePolicyTarget) Reset() { + *x = StoragePolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[336] + mi := &file_api_v1_recommendation_proto_msgTypes[359] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRulesByPolicyRequest) String() string { +func (x *StoragePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRulesByPolicyRequest) ProtoMessage() {} +func (*StoragePolicyTarget) ProtoMessage() {} -func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[336] +func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[359] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26597,114 +30087,120 @@ func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRulesByPolicyRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRulesByPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{336} +// Deprecated: Use StoragePolicyTarget.ProtoReflect.Descriptor instead. +func (*StoragePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{359} } -func (x *GetWorkloadRulesByPolicyRequest) GetTeamId() string { +func (x *StoragePolicyTarget) GetTargetId() string { if x != nil { - return x.TeamId + return x.TargetId } return "" } -func (x *GetWorkloadRulesByPolicyRequest) GetPolicyId() string { +func (x *StoragePolicyTarget) GetName() string { if x != nil { - return x.PolicyId + return x.Name } return "" } -type GetWorkloadRulesByPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ManagedRules []*WorkloadRule `protobuf:"bytes,1,rep,name=managed_rules,json=managedRules,proto3" json:"managed_rules,omitempty"` - ExcludedRules []*WorkloadRule `protobuf:"bytes,2,rep,name=excluded_rules,json=excludedRules,proto3" json:"excluded_rules,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,3,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +func (x *StoragePolicyTarget) GetDescription() string { + if x != nil { + return x.Description + } + return "" } -func (x *GetWorkloadRulesByPolicyResponse) Reset() { - *x = GetWorkloadRulesByPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[337] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *StoragePolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId } + return "" } -func (x *GetWorkloadRulesByPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *StoragePolicyTarget) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil } -func (*GetWorkloadRulesByPolicyResponse) ProtoMessage() {} +func (x *StoragePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} -func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[337] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *StoragePolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled } - return mi.MessageOf(x) + return false } -// Deprecated: Use GetWorkloadRulesByPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRulesByPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{337} +func (x *StoragePolicyTarget) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil } -func (x *GetWorkloadRulesByPolicyResponse) GetManagedRules() []*WorkloadRule { +func (x *StoragePolicyTarget) GetStorageClasses() []string { if x != nil { - return x.ManagedRules + return x.StorageClasses } return nil } -func (x *GetWorkloadRulesByPolicyResponse) GetExcludedRules() []*WorkloadRule { +func (x *StoragePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.ExcludedRules + return x.CreatedAt } return nil } -func (x *GetWorkloadRulesByPolicyResponse) GetClusterNames() map[string]string { +func (x *StoragePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.ClusterNames + return x.UpdatedAt } return nil } -type ListWorkloadRulesRequest struct { +type CreateStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterIds []string `protobuf:"bytes,4,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,6,opt,name=enabled,proto3" json:"enabled,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,20,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + StorageClasses []string `protobuf:"bytes,21,rep,name=storage_classes,json=storageClasses,proto3" json:"storage_classes,omitempty"` } -func (x *ListWorkloadRulesRequest) Reset() { - *x = ListWorkloadRulesRequest{} +func (x *CreateStoragePolicyTargetRequest) Reset() { + *x = CreateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[338] + mi := &file_api_v1_recommendation_proto_msgTypes[360] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRulesRequest) String() string { +func (x *CreateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRulesRequest) ProtoMessage() {} +func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[338] +func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[360] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26715,170 +30211,92 @@ func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRulesRequest.ProtoReflect.Descriptor instead. -func (*ListWorkloadRulesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{338} +// Deprecated: Use CreateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{360} } -func (x *ListWorkloadRulesRequest) GetTeamId() string { +func (x *CreateStoragePolicyTargetRequest) GetName() string { if x != nil { - return x.TeamId + return x.Name } return "" } -func (x *ListWorkloadRulesRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *CreateStoragePolicyTargetRequest) GetDescription() string { + if x != nil { + return x.Description } return "" } -type ListWorkloadRulesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` - ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name - PolicyNames map[string]string `protobuf:"bytes,3,rep,name=policy_names,json=policyNames,proto3" json:"policy_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // policy_id → policy name +func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" } -func (x *ListWorkloadRulesResponse) Reset() { - *x = ListWorkloadRulesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[339] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } + return nil } -func (x *ListWorkloadRulesResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" } -func (*ListWorkloadRulesResponse) ProtoMessage() {} +func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} -func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[339] - 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 ListWorkloadRulesResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRulesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{339} -} - -func (x *ListWorkloadRulesResponse) GetRules() []*WorkloadRule { - if x != nil { - return x.Rules - } - return nil -} - -func (x *ListWorkloadRulesResponse) GetClusterNames() map[string]string { +func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { if x != nil { - return x.ClusterNames + return x.NamespaceSelector } return nil } -func (x *ListWorkloadRulesResponse) GetPolicyNames() map[string]string { +func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { if x != nil { - return x.PolicyNames + return x.StorageClasses } return nil } -type GetWorkloadRuleByIDRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` -} - -func (x *GetWorkloadRuleByIDRequest) Reset() { - *x = GetWorkloadRuleByIDRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[340] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetWorkloadRuleByIDRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetWorkloadRuleByIDRequest) ProtoMessage() {} - -func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[340] - 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 GetWorkloadRuleByIDRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByIDRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{340} -} - -func (x *GetWorkloadRuleByIDRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" -} - -func (x *GetWorkloadRuleByIDRequest) GetRuleId() string { - if x != nil { - return x.RuleId - } - return "" -} - -type GetWorkloadRuleByIDResponse struct { +type CreateStoragePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id - PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *GetWorkloadRuleByIDResponse) Reset() { - *x = GetWorkloadRuleByIDResponse{} +func (x *CreateStoragePolicyTargetResponse) Reset() { + *x = CreateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[341] + mi := &file_api_v1_recommendation_proto_msgTypes[361] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByIDResponse) String() string { +func (x *CreateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByIDResponse) ProtoMessage() {} +func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[341] +func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[361] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26889,62 +30307,44 @@ func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByIDResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByIDResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{341} +// Deprecated: Use CreateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{361} } -func (x *GetWorkloadRuleByIDResponse) GetRule() *WorkloadRule { +func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.Rule + return x.Target } return nil } -func (x *GetWorkloadRuleByIDResponse) GetClusterName() string { - if x != nil { - return x.ClusterName - } - return "" -} - -func (x *GetWorkloadRuleByIDResponse) GetPolicyName() string { - if x != nil { - return x.PolicyName - } - return "" -} - -// GetWorkloadRuleByWorkloadRequest looks up a single rule by workload coordinates. -type GetWorkloadRuleByWorkloadRequest struct { +type ListStoragePolicyTargetsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` } -func (x *GetWorkloadRuleByWorkloadRequest) Reset() { - *x = GetWorkloadRuleByWorkloadRequest{} +func (x *ListStoragePolicyTargetsRequest) Reset() { + *x = ListStoragePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[342] + mi := &file_api_v1_recommendation_proto_msgTypes[362] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByWorkloadRequest) String() string { +func (x *ListStoragePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadRequest) ProtoMessage() {} +func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[342] +func (x *ListStoragePolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[362] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -26955,77 +30355,50 @@ func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByWorkloadRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByWorkloadRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{342} +// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{362} } -func (x *GetWorkloadRuleByWorkloadRequest) GetTeamId() string { +func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *GetWorkloadRuleByWorkloadRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *GetWorkloadRuleByWorkloadRequest) GetKind() string { - if x != nil { - return x.Kind - } - return "" -} - -func (x *GetWorkloadRuleByWorkloadRequest) GetWorkloadName() string { - if x != nil { - return x.WorkloadName +func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -// GetWorkloadRuleByWorkloadResponse returns the rule for a workload (if any) plus display metadata. -// Returns found = false (with rule unset) when no rule exists for the given coordinates; -// internal errors continue to surface as gRPC error statuses. -type GetWorkloadRuleByWorkloadResponse struct { +type ListStoragePolicyTargetsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id (when found) - PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) - Found bool `protobuf:"varint,4,opt,name=found,proto3" json:"found,omitempty"` // true when a matching rule exists + Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *GetWorkloadRuleByWorkloadResponse) Reset() { - *x = GetWorkloadRuleByWorkloadResponse{} +func (x *ListStoragePolicyTargetsResponse) Reset() { + *x = ListStoragePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[343] + mi := &file_api_v1_recommendation_proto_msgTypes[363] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByWorkloadResponse) String() string { +func (x *ListStoragePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadResponse) ProtoMessage() {} +func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[343] +func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[363] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27036,68 +30409,43 @@ func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByWorkloadResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByWorkloadResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} +// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{363} } -func (x *GetWorkloadRuleByWorkloadResponse) GetRule() *WorkloadRule { +func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { if x != nil { - return x.Rule + return x.Targets } return nil } -func (x *GetWorkloadRuleByWorkloadResponse) GetClusterName() string { - if x != nil { - return x.ClusterName - } - return "" -} - -func (x *GetWorkloadRuleByWorkloadResponse) GetPolicyName() string { - if x != nil { - return x.PolicyName - } - return "" -} - -func (x *GetWorkloadRuleByWorkloadResponse) GetFound() bool { - if x != nil { - return x.Found - } - return false -} - -// GetWorkloadByWorkloadRuleRequest resolves the live workload UID for a rule. -// Lightweight lookup — does not return full workload data, just the uid that -// downstream RPCs (e.g. GetWorkloadProfiles, GetWorkload) require. -type GetWorkloadByWorkloadRuleRequest struct { +type UpdateStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *GetWorkloadByWorkloadRuleRequest) Reset() { - *x = GetWorkloadByWorkloadRuleRequest{} +func (x *UpdateStoragePolicyTargetRequest) Reset() { + *x = UpdateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[344] + mi := &file_api_v1_recommendation_proto_msgTypes[364] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleRequest) String() string { +func (x *UpdateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleRequest) ProtoMessage() {} +func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[344] +func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[364] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27108,50 +30456,43 @@ func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadByWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadByWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} -} - -func (x *GetWorkloadByWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use UpdateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{364} } -func (x *GetWorkloadByWorkloadRuleRequest) GetRuleId() string { +func (x *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { if x != nil { - return x.RuleId + return x.Target } - return "" + return nil } -type GetWorkloadByWorkloadRuleResponse struct { +type UpdateStoragePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadUid string `protobuf:"bytes,1,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // empty when no live workload matches the rule's coordinates + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *GetWorkloadByWorkloadRuleResponse) Reset() { - *x = GetWorkloadByWorkloadRuleResponse{} +func (x *UpdateStoragePolicyTargetResponse) Reset() { + *x = UpdateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[345] + mi := &file_api_v1_recommendation_proto_msgTypes[365] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleResponse) String() string { +func (x *UpdateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleResponse) ProtoMessage() {} +func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[345] +func (x *UpdateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[365] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27162,44 +30503,44 @@ func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadByWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadByWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} +// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{365} } -func (x *GetWorkloadByWorkloadRuleResponse) GetWorkloadUid() string { +func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.WorkloadUid + return x.Target } - return "" + return nil } -type DeleteWorkloadRuleRequest struct { +type DeleteStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *DeleteWorkloadRuleRequest) Reset() { - *x = DeleteWorkloadRuleRequest{} +func (x *DeleteStoragePolicyTargetRequest) Reset() { + *x = DeleteStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[346] + mi := &file_api_v1_recommendation_proto_msgTypes[366] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleRequest) String() string { +func (x *DeleteStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleRequest) ProtoMessage() {} +func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} -func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[346] +func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[366] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27210,48 +30551,50 @@ func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{346} +// Deprecated: Use DeleteStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{366} } -func (x *DeleteWorkloadRuleRequest) GetTeamId() string { +func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { if x != nil { - return x.TeamId + return x.TargetId } return "" } -func (x *DeleteWorkloadRuleRequest) GetRuleId() string { +func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { if x != nil { - return x.RuleId + return x.TeamId } return "" } -type DeleteWorkloadRuleResponse struct { +type DeleteStoragePolicyTargetResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *DeleteWorkloadRuleResponse) Reset() { - *x = DeleteWorkloadRuleResponse{} +func (x *DeleteStoragePolicyTargetResponse) Reset() { + *x = DeleteStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[347] + mi := &file_api_v1_recommendation_proto_msgTypes[367] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleResponse) String() string { +func (x *DeleteStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleResponse) ProtoMessage() {} +func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} -func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[347] +func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[367] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27262,55 +30605,72 @@ func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*DeleteWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{347} +// Deprecated: Use DeleteStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{367} } -// ManualRuleFields carries the user-configurable rule fields shared by the -// Upsert and Preview RPCs. Extracted as its own message so the two request -// messages stay shape-aligned and the Go conversion logic has a single entry -// point. -type ManualRuleFields struct { +func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// PvcStorageRecommendation represents a specific recommendation for a PVC +type PvcStorageRecommendation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` - MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` - GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` - HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` - EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,5,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` - ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` - StartupPeriodSeconds *int64 `protobuf:"varint,7,opt,name=startup_period_seconds,json=startupPeriodSeconds,proto3,oneof" json:"startup_period_seconds,omitempty"` - CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` - CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` - DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` - SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` - DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` - LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` - UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` - // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. - Containers []*ContainerResourceRuleConfig `protobuf:"bytes,15,rep,name=containers,proto3" json:"containers,omitempty"` + RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` + PvcUid string `protobuf:"bytes,2,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PvcName string `protobuf:"bytes,3,opt,name=pvc_name,json=pvcName,proto3" json:"pvc_name,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + ClusterId string `protobuf:"bytes,5,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + TeamId string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + CurrentCapacityBytes int64 `protobuf:"varint,10,opt,name=current_capacity_bytes,json=currentCapacityBytes,proto3" json:"current_capacity_bytes,omitempty"` + RecommendedCapacityBytes int64 `protobuf:"varint,11,opt,name=recommended_capacity_bytes,json=recommendedCapacityBytes,proto3" json:"recommended_capacity_bytes,omitempty"` + UsedBytesAtTime int64 `protobuf:"varint,12,opt,name=used_bytes_at_time,json=usedBytesAtTime,proto3" json:"used_bytes_at_time,omitempty"` + UtilizationPct float64 `protobuf:"fixed64,13,opt,name=utilization_pct,json=utilizationPct,proto3" json:"utilization_pct,omitempty"` + GrowthRateBytesPerDay float64 `protobuf:"fixed64,14,opt,name=growth_rate_bytes_per_day,json=growthRateBytesPerDay,proto3" json:"growth_rate_bytes_per_day,omitempty"` + DaysToFull float64 `protobuf:"fixed64,15,opt,name=days_to_full,json=daysToFull,proto3" json:"days_to_full,omitempty"` + ConfidenceScore float64 `protobuf:"fixed64,16,opt,name=confidence_score,json=confidenceScore,proto3" json:"confidence_score,omitempty"` + PolicyId string `protobuf:"bytes,20,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyTargetId *string `protobuf:"bytes,21,opt,name=policy_target_id,json=policyTargetId,proto3,oneof" json:"policy_target_id,omitempty"` + CostCurrentMonthlyUsd float64 `protobuf:"fixed64,25,opt,name=cost_current_monthly_usd,json=costCurrentMonthlyUsd,proto3" json:"cost_current_monthly_usd,omitempty"` + CostRecommendedMonthlyUsd float64 `protobuf:"fixed64,26,opt,name=cost_recommended_monthly_usd,json=costRecommendedMonthlyUsd,proto3" json:"cost_recommended_monthly_usd,omitempty"` + CostDeltaMonthlyUsd float64 `protobuf:"fixed64,27,opt,name=cost_delta_monthly_usd,json=costDeltaMonthlyUsd,proto3" json:"cost_delta_monthly_usd,omitempty"` + Status RecommendationStatus `protobuf:"varint,30,opt,name=status,proto3,enum=api.v1.RecommendationStatus" json:"status,omitempty"` + Reasoning *string `protobuf:"bytes,31,opt,name=reasoning,proto3,oneof" json:"reasoning,omitempty"` + Error *string `protobuf:"bytes,32,opt,name=error,proto3,oneof" json:"error,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,40,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,41,opt,name=applied_at,json=appliedAt,proto3,oneof" json:"applied_at,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,50,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + OperationType PvcOperationType `protobuf:"varint,60,opt,name=operation_type,json=operationType,proto3,enum=api.v1.PvcOperationType" json:"operation_type,omitempty"` + WorkloadKind *string `protobuf:"bytes,61,opt,name=workload_kind,json=workloadKind,proto3,oneof" json:"workload_kind,omitempty"` + WorkloadName *string `protobuf:"bytes,62,opt,name=workload_name,json=workloadName,proto3,oneof" json:"workload_name,omitempty"` + WorkloadUid *string `protobuf:"bytes,63,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` } -func (x *ManualRuleFields) Reset() { - *x = ManualRuleFields{} +func (x *PvcStorageRecommendation) Reset() { + *x = PvcStorageRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[348] + mi := &file_api_v1_recommendation_proto_msgTypes[368] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ManualRuleFields) String() string { +func (x *PvcStorageRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ManualRuleFields) ProtoMessage() {} +func (*PvcStorageRecommendation) ProtoMessage() {} -func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[348] +func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[368] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27321,249 +30681,239 @@ func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ManualRuleFields.ProtoReflect.Descriptor instead. -func (*ManualRuleFields) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{348} +// Deprecated: Use PvcStorageRecommendation.ProtoReflect.Descriptor instead. +func (*PvcStorageRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{368} } -func (x *ManualRuleFields) GetCpuRule() *ResourceRuleConfig { +func (x *PvcStorageRecommendation) GetRecommendationId() string { if x != nil { - return x.CpuRule + return x.RecommendationId } - return nil + return "" } -func (x *ManualRuleFields) GetMemoryRule() *ResourceRuleConfig { +func (x *PvcStorageRecommendation) GetPvcUid() string { if x != nil { - return x.MemoryRule + return x.PvcUid } - return nil + return "" } -func (x *ManualRuleFields) GetGpuRule() *ResourceRuleConfig { +func (x *PvcStorageRecommendation) GetPvcName() string { if x != nil { - return x.GpuRule + return x.PvcName } - return nil + return "" } -func (x *ManualRuleFields) GetHpaRule() *HPARuleConfig { +func (x *PvcStorageRecommendation) GetNamespace() string { if x != nil { - return x.HpaRule + return x.Namespace } - return nil + return "" } -func (x *ManualRuleFields) GetEmergencyResponse() *EmergencyResponseConfig { +func (x *PvcStorageRecommendation) GetClusterId() string { if x != nil { - return x.EmergencyResponse + return x.ClusterId } - return nil + return "" } -func (x *ManualRuleFields) GetActionTriggers() []ActionTrigger { +func (x *PvcStorageRecommendation) GetTeamId() string { if x != nil { - return x.ActionTriggers + return x.TeamId } - return nil + return "" } -func (x *ManualRuleFields) GetStartupPeriodSeconds() int64 { - if x != nil && x.StartupPeriodSeconds != nil { - return *x.StartupPeriodSeconds +func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { + if x != nil { + return x.CurrentCapacityBytes } return 0 } -func (x *ManualRuleFields) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { + if x != nil { + return x.RecommendedCapacityBytes } - return "" + return 0 } -func (x *ManualRuleFields) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { + if x != nil { + return x.UsedBytesAtTime } return 0 } -func (x *ManualRuleFields) GetDetectionTriggers() []WorkloadDetectionTrigger { +func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { if x != nil { - return x.DetectionTriggers + return x.UtilizationPct } - return nil + return 0 } -func (x *ManualRuleFields) GetSchedulerPlugins() []string { +func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { if x != nil { - return x.SchedulerPlugins + return x.GrowthRateBytesPerDay } - return nil + return 0 } -func (x *ManualRuleFields) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule +func (x *PvcStorageRecommendation) GetDaysToFull() float64 { + if x != nil { + return x.DaysToFull } - return "" + return 0 } -func (x *ManualRuleFields) GetLiveMigrationEnabled() bool { +func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { if x != nil { - return x.LiveMigrationEnabled + return x.ConfidenceScore } - return false + return 0 } -func (x *ManualRuleFields) GetUseInPlaceVerticalScaling() bool { +func (x *PvcStorageRecommendation) GetPolicyId() string { if x != nil { - return x.UseInPlaceVerticalScaling + return x.PolicyId } - return false + return "" } -func (x *ManualRuleFields) GetContainers() []*ContainerResourceRuleConfig { - if x != nil { - return x.Containers +func (x *PvcStorageRecommendation) GetPolicyTargetId() string { + if x != nil && x.PolicyTargetId != nil { + return *x.PolicyTargetId } - return nil + return "" } -type UpsertManualWorkloadRuleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - AutoGenerate bool `protobuf:"varint,6,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` - // Manual fields (only used when auto_generate = false). - Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` - // Optional: identifies which caller is upserting this rule. When unset, - // the server defaults to WORKLOAD_RULE_SOURCE_MANUAL (legacy UI behavior). - // External IaC providers (pulumi, terraform) MUST set this so the rule - // can be attributed in audit and UI surfaces. - Source WorkloadRuleSource `protobuf:"varint,11,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` +func (x *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { + if x != nil { + return x.CostCurrentMonthlyUsd + } + return 0 } -func (x *UpsertManualWorkloadRuleRequest) Reset() { - *x = UpsertManualWorkloadRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[349] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *PvcStorageRecommendation) GetCostRecommendedMonthlyUsd() float64 { + if x != nil { + return x.CostRecommendedMonthlyUsd } + return 0 } -func (x *UpsertManualWorkloadRuleRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { + if x != nil { + return x.CostDeltaMonthlyUsd + } + return 0 } -func (*UpsertManualWorkloadRuleRequest) ProtoMessage() {} - -func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[349] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { + if x != nil { + return x.Status } - return mi.MessageOf(x) + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -// Deprecated: Use UpsertManualWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{349} +func (x *PvcStorageRecommendation) GetReasoning() string { + if x != nil && x.Reasoning != nil { + return *x.Reasoning + } + return "" } -func (x *UpsertManualWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *PvcStorageRecommendation) GetError() string { + if x != nil && x.Error != nil { + return *x.Error } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetClusterId() string { +func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.ClusterId + return x.Timestamp } - return "" + return nil } -func (x *UpsertManualWorkloadRuleRequest) GetNamespace() string { +func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { if x != nil { - return x.Namespace + return x.AppliedAt } - return "" + return nil } -func (x *UpsertManualWorkloadRuleRequest) GetKind() string { +func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kind + return x.CreatedAt } - return "" + return nil } -func (x *UpsertManualWorkloadRuleRequest) GetName() string { +func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.Name + return x.UpdatedAt } - return "" + return nil } -func (x *UpsertManualWorkloadRuleRequest) GetAutoGenerate() bool { +func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { if x != nil { - return x.AutoGenerate + return x.OperationType } - return false + return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED } -func (x *UpsertManualWorkloadRuleRequest) GetFields() *ManualRuleFields { - if x != nil { - return x.Fields +func (x *PvcStorageRecommendation) GetWorkloadKind() string { + if x != nil && x.WorkloadKind != nil { + return *x.WorkloadKind } - return nil + return "" } -func (x *UpsertManualWorkloadRuleRequest) GetSource() WorkloadRuleSource { - if x != nil { - return x.Source +func (x *PvcStorageRecommendation) GetWorkloadName() string { + if x != nil && x.WorkloadName != nil { + return *x.WorkloadName } - return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED + return "" } -type UpsertManualWorkloadRuleResponse struct { +func (x *PvcStorageRecommendation) GetWorkloadUid() string { + if x != nil && x.WorkloadUid != nil { + return *x.WorkloadUid + } + return "" +} + +type GetPvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` } -func (x *UpsertManualWorkloadRuleResponse) Reset() { - *x = UpsertManualWorkloadRuleResponse{} +func (x *GetPvcStorageRecommendationRequest) Reset() { + *x = GetPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[350] + mi := &file_api_v1_recommendation_proto_msgTypes[369] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpsertManualWorkloadRuleResponse) String() string { +func (x *GetPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertManualWorkloadRuleResponse) ProtoMessage() {} +func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *UpsertManualWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[350] +func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[369] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27574,53 +30924,43 @@ func (x *UpsertManualWorkloadRuleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertManualWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{350} +// Deprecated: Use GetPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{369} } -func (x *UpsertManualWorkloadRuleResponse) GetRule() *WorkloadRule { +func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { if x != nil { - return x.Rule + return x.RecommendationId } - return nil + return "" } -// PreviewWorkloadRuleRequest mirrors the upsert request but does not -// persist anything; returns a side-by-side preview instead. -type PreviewWorkloadRuleRequest struct { +type GetPvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // Required so the server can fetch the workload's profile (percentiles, - // behavior). The form already has uid for any existing workload. - WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` - Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` } -func (x *PreviewWorkloadRuleRequest) Reset() { - *x = PreviewWorkloadRuleRequest{} +func (x *GetPvcStorageRecommendationResponse) Reset() { + *x = GetPvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[351] + mi := &file_api_v1_recommendation_proto_msgTypes[370] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewWorkloadRuleRequest) String() string { +func (x *GetPvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewWorkloadRuleRequest) ProtoMessage() {} +func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} -func (x *PreviewWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[351] +func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[370] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27631,101 +30971,107 @@ func (x *PreviewWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PreviewWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*PreviewWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{351} +// Deprecated: Use GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{370} } -func (x *PreviewWorkloadRuleRequest) GetTeamId() string { +func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.TeamId + return x.Recommendation } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +type ListPvcStorageRecommendationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` + Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` } -func (x *PreviewWorkloadRuleRequest) GetNamespace() string { - if x != nil { - return x.Namespace +func (x *ListPvcStorageRecommendationsRequest) Reset() { + *x = ListPvcStorageRecommendationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[371] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *PreviewWorkloadRuleRequest) GetKind() string { - if x != nil { - return x.Kind +func (x *ListPvcStorageRecommendationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} + +func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[371] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *PreviewWorkloadRuleRequest) GetName() string { +// Deprecated: Use ListPvcStorageRecommendationsRequest.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{371} +} + +func (x *ListPvcStorageRecommendationsRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -func (x *PreviewWorkloadRuleRequest) GetWorkloadUid() string { - if x != nil { - return x.WorkloadUid +func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -func (x *PreviewWorkloadRuleRequest) GetFields() *ManualRuleFields { +func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { if x != nil { - return x.Fields + return x.Pagination } return nil } -type PreviewWorkloadRuleResponse struct { +type ListPvcStorageRecommendationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Materialized rule — engine output overlaid with the user's draft as - // constraints (engine's BaseRequest clamped to user's min/max, multipliers - // overridden, etc.). When `fields` is empty/missing, equals engine_projection. - // Same shape as a saved rule. - MaterializedRule *WorkloadRule `protobuf:"bytes,1,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` - // Engine projection — pure-engine recommendation (classification-driven, - // no user constraints). Stable benchmark; same maths Apply uses for auto. - // Empty when profile data is insufficient; see engine_projection_unavailable_reason. - EngineProjection *WorkloadRule `protobuf:"bytes,2,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` - // Observed profile (per-container percentiles, behavior, classification, - // currently configured resources). Same shape as GetWorkloadProfiles - // single-workload result. - Profile *WorkloadProfileResult `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` - // Set when the engine couldn't produce a projection (insufficient data, - // workload not yet emitting metrics, etc.). FE renders the materialized - // draft + observed view without an engine column. - EngineProjectionUnavailableReason string `protobuf:"bytes,4,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` + Recommendations []*PvcStorageRecommendation `protobuf:"bytes,1,rep,name=recommendations,proto3" json:"recommendations,omitempty"` + Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` } -func (x *PreviewWorkloadRuleResponse) Reset() { - *x = PreviewWorkloadRuleResponse{} +func (x *ListPvcStorageRecommendationsResponse) Reset() { + *x = ListPvcStorageRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[352] + mi := &file_api_v1_recommendation_proto_msgTypes[372] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewWorkloadRuleResponse) String() string { +func (x *ListPvcStorageRecommendationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewWorkloadRuleResponse) ProtoMessage() {} +func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} -func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[352] +func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[372] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27736,68 +31082,53 @@ func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PreviewWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*PreviewWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} -} - -func (x *PreviewWorkloadRuleResponse) GetMaterializedRule() *WorkloadRule { - if x != nil { - return x.MaterializedRule - } - return nil +// Deprecated: Use ListPvcStorageRecommendationsResponse.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{372} } -func (x *PreviewWorkloadRuleResponse) GetEngineProjection() *WorkloadRule { +func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { if x != nil { - return x.EngineProjection + return x.Recommendations } return nil } -func (x *PreviewWorkloadRuleResponse) GetProfile() *WorkloadProfileResult { +func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { if x != nil { - return x.Profile + return x.Pagination } return nil } -func (x *PreviewWorkloadRuleResponse) GetEngineProjectionUnavailableReason() string { - if x != nil { - return x.EngineProjectionUnavailableReason - } - return "" -} - -type GetWorkloadContainerNamesRequest struct { +type GeneratePvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *GetWorkloadContainerNamesRequest) Reset() { - *x = GetWorkloadContainerNamesRequest{} +func (x *GeneratePvcStorageRecommendationRequest) Reset() { + *x = GeneratePvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[353] + mi := &file_api_v1_recommendation_proto_msgTypes[373] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesRequest) String() string { +func (x *GeneratePvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesRequest) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} -func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[353] +func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[373] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27808,71 +31139,67 @@ func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerNamesRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerNamesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{353} +// Deprecated: Use GeneratePvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{373} } -func (x *GetWorkloadContainerNamesRequest) GetTeamId() string { +func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadContainerNamesRequest) GetClusterId() string { +func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GetWorkloadContainerNamesRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *GetWorkloadContainerNamesRequest) GetKind() string { +func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Kind + return x.PvcUid } return "" } -func (x *GetWorkloadContainerNamesRequest) GetName() string { +func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { if x != nil { - return x.Name + return x.PolicyId } return "" } -type GetWorkloadContainerNamesResponse struct { +type GeneratePvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ContainerNames []string `protobuf:"bytes,1,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` + // When no recommendation is generated (e.g., low confidence, no resize needed), + // this field explains why + SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` } -func (x *GetWorkloadContainerNamesResponse) Reset() { - *x = GetWorkloadContainerNamesResponse{} +func (x *GeneratePvcStorageRecommendationResponse) Reset() { + *x = GeneratePvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[354] + mi := &file_api_v1_recommendation_proto_msgTypes[374] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesResponse) String() string { +func (x *GeneratePvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesResponse) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} -func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[354] +func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[374] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27883,45 +31210,53 @@ func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadContainerNamesResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadContainerNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} +// Deprecated: Use GeneratePvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{374} } -func (x *GetWorkloadContainerNamesResponse) GetContainerNames() []string { +func (x *GeneratePvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.ContainerNames + return x.Recommendation } return nil } -type BatchAutoOptimizeWorkload struct { +func (x *GeneratePvcStorageRecommendationResponse) GetSkipReason() string { + if x != nil && x.SkipReason != nil { + return *x.SkipReason + } + return "" +} + +type PreviewPvcStorageRecommendationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PvcUid string `protobuf:"bytes,3,opt,name=pvc_uid,json=pvcUid,proto3" json:"pvc_uid,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` } -func (x *BatchAutoOptimizeWorkload) Reset() { - *x = BatchAutoOptimizeWorkload{} +func (x *PreviewPvcStorageRecommendationRequest) Reset() { + *x = PreviewPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[355] + mi := &file_api_v1_recommendation_proto_msgTypes[375] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkload) String() string { +func (x *PreviewPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkload) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[355] +func (x *PreviewPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[375] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27932,59 +31267,65 @@ func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkload.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkload) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{355} +// Deprecated: Use PreviewPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{375} } -func (x *BatchAutoOptimizeWorkload) GetNamespace() string { +func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { if x != nil { - return x.Namespace + return x.TeamId } return "" } -func (x *BatchAutoOptimizeWorkload) GetKind() string { +func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { if x != nil { - return x.Kind + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkload) GetName() string { +func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Name + return x.PvcUid } return "" } -type BatchAutoOptimizeWorkloadsRequest struct { +func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type PreviewPvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Workloads []*BatchAutoOptimizeWorkload `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` + SkipReason *string `protobuf:"bytes,2,opt,name=skip_reason,json=skipReason,proto3,oneof" json:"skip_reason,omitempty"` } -func (x *BatchAutoOptimizeWorkloadsRequest) Reset() { - *x = BatchAutoOptimizeWorkloadsRequest{} +func (x *PreviewPvcStorageRecommendationResponse) Reset() { + *x = PreviewPvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[356] + mi := &file_api_v1_recommendation_proto_msgTypes[376] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadsRequest) String() string { +func (x *PreviewPvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadsRequest) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[356] +func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[376] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -27995,62 +31336,64 @@ func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadsRequest.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{356} +// Deprecated: Use PreviewPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{376} } -func (x *BatchAutoOptimizeWorkloadsRequest) GetTeamId() string { +func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.TeamId + return x.Recommendation } - return "" + return nil } -func (x *BatchAutoOptimizeWorkloadsRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { + if x != nil && x.SkipReason != nil { + return *x.SkipReason } return "" } -func (x *BatchAutoOptimizeWorkloadsRequest) GetWorkloads() []*BatchAutoOptimizeWorkload { - if x != nil { - return x.Workloads - } - return nil -} - -type BatchAutoOptimizeWorkloadResult struct { +type WorkloadRuleOOMEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` - Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` + MemoryRequestAt int64 `protobuf:"varint,9,opt,name=memory_request_at,json=memoryRequestAt,proto3" json:"memory_request_at,omitempty"` + MemoryLimitAt int64 `protobuf:"varint,10,opt,name=memory_limit_at,json=memoryLimitAt,proto3" json:"memory_limit_at,omitempty"` + MemoryUsageAt int64 `protobuf:"varint,11,opt,name=memory_usage_at,json=memoryUsageAt,proto3" json:"memory_usage_at,omitempty"` + EmergencyReaction bool `protobuf:"varint,12,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` + NewMemoryAfter *int64 `protobuf:"varint,13,opt,name=new_memory_after,json=newMemoryAfter,proto3,oneof" json:"new_memory_after,omitempty"` + RestartCount *int32 `protobuf:"varint,14,opt,name=restart_count,json=restartCount,proto3,oneof" json:"restart_count,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } -func (x *BatchAutoOptimizeWorkloadResult) Reset() { - *x = BatchAutoOptimizeWorkloadResult{} +func (x *WorkloadRuleOOMEvent) Reset() { + *x = WorkloadRuleOOMEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[357] + mi := &file_api_v1_recommendation_proto_msgTypes[377] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadResult) String() string { +func (x *WorkloadRuleOOMEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadResult) ProtoMessage() {} +func (*WorkloadRuleOOMEvent) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[357] +func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[377] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28061,137 +31404,144 @@ func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadResult.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadResult) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{357} +// Deprecated: Use WorkloadRuleOOMEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleOOMEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{377} } -func (x *BatchAutoOptimizeWorkloadResult) GetNamespace() string { +func (x *WorkloadRuleOOMEvent) GetId() string { if x != nil { - return x.Namespace + return x.Id } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetKind() string { +func (x *WorkloadRuleOOMEvent) GetRuleId() string { if x != nil { - return x.Kind + return x.RuleId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetName() string { +func (x *WorkloadRuleOOMEvent) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetSuccess() bool { +func (x *WorkloadRuleOOMEvent) GetNamespace() string { if x != nil { - return x.Success + return x.Namespace } - return false + return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetError() string { +func (x *WorkloadRuleOOMEvent) GetWorkloadName() string { if x != nil { - return x.Error + return x.WorkloadName } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetRule() *WorkloadRule { +func (x *WorkloadRuleOOMEvent) GetContainerName() string { if x != nil { - return x.Rule + return x.ContainerName + } + return "" +} + +func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp } return nil } -type BatchAutoOptimizeWorkloadsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { + if x != nil { + return x.RuleGeneration + } + return 0 +} - Results []*BatchAutoOptimizeWorkloadResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { + if x != nil { + return x.MemoryRequestAt + } + return 0 } -func (x *BatchAutoOptimizeWorkloadsResponse) Reset() { - *x = BatchAutoOptimizeWorkloadsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[358] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { + if x != nil { + return x.MemoryLimitAt } + return 0 } -func (x *BatchAutoOptimizeWorkloadsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { + if x != nil { + return x.MemoryUsageAt + } + return 0 } -func (*BatchAutoOptimizeWorkloadsResponse) ProtoMessage() {} +func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { + if x != nil { + return x.EmergencyReaction + } + return false +} -func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[358] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { + if x != nil && x.NewMemoryAfter != nil { + return *x.NewMemoryAfter } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use BatchAutoOptimizeWorkloadsResponse.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{358} +func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { + if x != nil && x.RestartCount != nil { + return *x.RestartCount + } + return 0 } -func (x *BatchAutoOptimizeWorkloadsResponse) GetResults() []*BatchAutoOptimizeWorkloadResult { +func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Results + return x.CreatedAt } return nil } -// WorkloadProfileManifest is the authoritative key set for a single emit cycle -// of profile snapshots for a (cluster, window) pair. The server sends exactly -// one manifest followed by zero or more BatchWorkloadProfiles, all tagged with -// the same emit_id. The operator uses the manifest's keys to GC local -// WorkloadProfile CRs whose workload_uid is absent from `keys` once the emit -// cycle finalizes. -type WorkloadProfileManifest struct { +type ListWorkloadRuleOOMEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` - Keys []*ProfileKey `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` - IssuedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=issued_at,json=issuedAt,proto3" json:"issued_at,omitempty"` - // emit_id is a UUID that identifies this emit cycle. Required. The operator - // buffers batches with a matching emit_id and finalizes the prior cycle - // when a manifest with a new emit_id arrives. - EmitId string `protobuf:"bytes,4,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` + Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *WorkloadProfileManifest) Reset() { - *x = WorkloadProfileManifest{} +func (x *ListWorkloadRuleOOMEventsRequest) Reset() { + *x = ListWorkloadRuleOOMEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[359] + mi := &file_api_v1_recommendation_proto_msgTypes[378] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadProfileManifest) String() string { +func (x *ListWorkloadRuleOOMEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadProfileManifest) ProtoMessage() {} +func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} -func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[359] +func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[378] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28202,71 +31552,65 @@ func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use WorkloadProfileManifest.ProtoReflect.Descriptor instead. -func (*WorkloadProfileManifest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{359} +// Deprecated: Use ListWorkloadRuleOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{378} } -func (x *WorkloadProfileManifest) GetWindow() ProfileWindow { +func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { if x != nil { - return x.Window + return x.RuleId } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED + return "" } -func (x *WorkloadProfileManifest) GetKeys() []*ProfileKey { - if x != nil { - return x.Keys +func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { + if x != nil && x.Generation != nil { + return *x.Generation } - return nil + return 0 } -func (x *WorkloadProfileManifest) GetIssuedAt() *timestamppb.Timestamp { - if x != nil { - return x.IssuedAt +func (x *ListWorkloadRuleOOMEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit } - return nil + return 0 } -func (x *WorkloadProfileManifest) GetEmitId() string { - if x != nil { - return x.EmitId +func (x *ListWorkloadRuleOOMEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset } - return "" + return 0 } -// BatchWorkloadProfiles is a chunk of WorkloadProfileSnapshot values for a -// single emit cycle. Up to 128 profiles per batch. The emit_id MUST match the -// manifest's emit_id for the same cycle; operators discard batches whose -// emit_id does not match the currently-buffered cycle. -type BatchWorkloadProfiles struct { +type ListWorkloadRuleOOMEventsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` - Profiles []*WorkloadProfileSnapshot `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` - // emit_id matches the manifest emit_id for this cycle. Required. - EmitId string `protobuf:"bytes,3,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` + Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` } -func (x *BatchWorkloadProfiles) Reset() { - *x = BatchWorkloadProfiles{} +func (x *ListWorkloadRuleOOMEventsResponse) Reset() { + *x = ListWorkloadRuleOOMEventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[360] + mi := &file_api_v1_recommendation_proto_msgTypes[379] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchWorkloadProfiles) String() string { +func (x *ListWorkloadRuleOOMEventsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchWorkloadProfiles) ProtoMessage() {} +func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} -func (x *BatchWorkloadProfiles) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[360] +func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[379] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28277,61 +31621,54 @@ func (x *BatchWorkloadProfiles) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use BatchWorkloadProfiles.ProtoReflect.Descriptor instead. -func (*BatchWorkloadProfiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{360} -} - -func (x *BatchWorkloadProfiles) GetWindow() ProfileWindow { - if x != nil { - return x.Window - } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +// Deprecated: Use ListWorkloadRuleOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{379} } -func (x *BatchWorkloadProfiles) GetProfiles() []*WorkloadProfileSnapshot { +func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { if x != nil { - return x.Profiles + return x.Events } return nil } -func (x *BatchWorkloadProfiles) GetEmitId() string { +func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { if x != nil { - return x.EmitId + return x.Total } - return "" + return 0 } -type NodeConfigApplyEvent struct { +type ListWorkloadOOMEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - AppliedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *NodeConfigApplyEvent) Reset() { - *x = NodeConfigApplyEvent{} +func (x *ListWorkloadOOMEventsRequest) Reset() { + *x = ListWorkloadOOMEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[361] + mi := &file_api_v1_recommendation_proto_msgTypes[380] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeConfigApplyEvent) String() string { +func (x *ListWorkloadOOMEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeConfigApplyEvent) ProtoMessage() {} +func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} -func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[361] +func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[380] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28342,73 +31679,72 @@ func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeConfigApplyEvent.ProtoReflect.Descriptor instead. -func (*NodeConfigApplyEvent) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{361} +// Deprecated: Use ListWorkloadOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{380} } -func (x *NodeConfigApplyEvent) GetConfigId() string { +func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { if x != nil { - return x.ConfigId + return x.ClusterId } return "" } -func (x *NodeConfigApplyEvent) GetClusterId() string { +func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { if x != nil { - return x.ClusterId + return x.Namespace } return "" } -func (x *NodeConfigApplyEvent) GetStatus() string { +func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { if x != nil { - return x.Status + return x.WorkloadName } return "" } -func (x *NodeConfigApplyEvent) GetError() string { - if x != nil { - return x.Error +func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit } - return "" + return 0 } -func (x *NodeConfigApplyEvent) GetAppliedAt() *timestamppb.Timestamp { - if x != nil { - return x.AppliedAt +func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset } - return nil + return 0 } -type GetNodeRecommendationStatusRequest struct { +type ListWorkloadOOMEventsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - HistoryLimit int32 `protobuf:"varint,3,opt,name=history_limit,json=historyLimit,proto3" json:"history_limit,omitempty"` + Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` } -func (x *GetNodeRecommendationStatusRequest) Reset() { - *x = GetNodeRecommendationStatusRequest{} +func (x *ListWorkloadOOMEventsResponse) Reset() { + *x = ListWorkloadOOMEventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[362] + mi := &file_api_v1_recommendation_proto_msgTypes[381] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusRequest) String() string { +func (x *ListWorkloadOOMEventsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusRequest) ProtoMessage() {} +func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} -func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[362] +func (x *ListWorkloadOOMEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[381] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28419,58 +31755,64 @@ func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetNodeRecommendationStatusRequest.ProtoReflect.Descriptor instead. -func (*GetNodeRecommendationStatusRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{362} -} - -func (x *GetNodeRecommendationStatusRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{381} } -func (x *GetNodeRecommendationStatusRequest) GetClusterId() string { +func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { if x != nil { - return x.ClusterId + return x.Events } - return "" + return nil } -func (x *GetNodeRecommendationStatusRequest) GetHistoryLimit() int32 { +func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { if x != nil { - return x.HistoryLimit + return x.Total } return 0 } -type GetNodeRecommendationStatusResponse struct { +type WorkloadRuleCPUThrottleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CurrentConfig *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3" json:"current_config,omitempty"` - History []*NodeConfigApplyEvent `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + ContainerName string `protobuf:"bytes,6,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + RuleGeneration int64 `protobuf:"varint,8,opt,name=rule_generation,json=ruleGeneration,proto3" json:"rule_generation,omitempty"` + CpuRequestAt int64 `protobuf:"varint,9,opt,name=cpu_request_at,json=cpuRequestAt,proto3" json:"cpu_request_at,omitempty"` + CpuLimitAt int64 `protobuf:"varint,10,opt,name=cpu_limit_at,json=cpuLimitAt,proto3" json:"cpu_limit_at,omitempty"` + CpuUsageAt int64 `protobuf:"varint,11,opt,name=cpu_usage_at,json=cpuUsageAt,proto3" json:"cpu_usage_at,omitempty"` + ThrottledFraction float64 `protobuf:"fixed64,12,opt,name=throttled_fraction,json=throttledFraction,proto3" json:"throttled_fraction,omitempty"` + EmergencyReaction bool `protobuf:"varint,13,opt,name=emergency_reaction,json=emergencyReaction,proto3" json:"emergency_reaction,omitempty"` + NewCpuAfter *int64 `protobuf:"varint,14,opt,name=new_cpu_after,json=newCpuAfter,proto3,oneof" json:"new_cpu_after,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` } -func (x *GetNodeRecommendationStatusResponse) Reset() { - *x = GetNodeRecommendationStatusResponse{} +func (x *WorkloadRuleCPUThrottleEvent) Reset() { + *x = WorkloadRuleCPUThrottleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[363] + mi := &file_api_v1_recommendation_proto_msgTypes[382] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusResponse) String() string { +func (x *WorkloadRuleCPUThrottleEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusResponse) ProtoMessage() {} +func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} -func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[363] +func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[382] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28481,57 +31823,144 @@ func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetNodeRecommendationStatusResponse.ProtoReflect.Descriptor instead. -func (*GetNodeRecommendationStatusResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{363} +// Deprecated: Use WorkloadRuleCPUThrottleEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleCPUThrottleEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{382} } -func (x *GetNodeRecommendationStatusResponse) GetCurrentConfig() *NodeRecommendationConfig { +func (x *WorkloadRuleCPUThrottleEvent) GetId() string { if x != nil { - return x.CurrentConfig + return x.Id + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetContainerName() string { + if x != nil { + return x.ContainerName + } + return "" +} + +func (x *WorkloadRuleCPUThrottleEvent) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp } return nil } -func (x *GetNodeRecommendationStatusResponse) GetHistory() []*NodeConfigApplyEvent { +func (x *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { if x != nil { - return x.History + return x.RuleGeneration + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCpuRequestAt() int64 { + if x != nil { + return x.CpuRequestAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCpuLimitAt() int64 { + if x != nil { + return x.CpuLimitAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCpuUsageAt() int64 { + if x != nil { + return x.CpuUsageAt + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetThrottledFraction() float64 { + if x != nil { + return x.ThrottledFraction + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetEmergencyReaction() bool { + if x != nil { + return x.EmergencyReaction + } + return false +} + +func (x *WorkloadRuleCPUThrottleEvent) GetNewCpuAfter() int64 { + if x != nil && x.NewCpuAfter != nil { + return *x.NewCpuAfter + } + return 0 +} + +func (x *WorkloadRuleCPUThrottleEvent) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } return nil } -// EnableCheckpointForPolicyRequest is the orchestration request for the C/R -// toggle on a node policy. enabled=true sets dakr.devzero.io/checkpoint-node -// on the policy template AND enqueues per-node label patches for all live nodes -// in the policy's matched groups. enabled=false unsets the label and enqueues -// the corresponding unset patches. -type EnableCheckpointForPolicyRequest struct { +type ListWorkloadRuleCPUThrottleEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Generation *int64 `protobuf:"varint,2,opt,name=generation,proto3,oneof" json:"generation,omitempty"` + Limit *int32 `protobuf:"varint,3,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *EnableCheckpointForPolicyRequest) Reset() { - *x = EnableCheckpointForPolicyRequest{} +func (x *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadRuleCPUThrottleEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[364] + mi := &file_api_v1_recommendation_proto_msgTypes[383] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnableCheckpointForPolicyRequest) String() string { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnableCheckpointForPolicyRequest) ProtoMessage() {} +func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} -func (x *EnableCheckpointForPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[364] +func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[383] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28542,68 +31971,123 @@ func (x *EnableCheckpointForPolicyRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use EnableCheckpointForPolicyRequest.ProtoReflect.Descriptor instead. -func (*EnableCheckpointForPolicyRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{364} +// Deprecated: Use ListWorkloadRuleCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{383} } -func (x *EnableCheckpointForPolicyRequest) GetTeamId() string { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { if x != nil { - return x.TeamId + return x.RuleId } return "" } -func (x *EnableCheckpointForPolicyRequest) GetPolicyId() string { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetGeneration() int64 { + if x != nil && x.Generation != nil { + return *x.Generation + } + return 0 +} + +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadRuleCPUThrottleEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) Reset() { + *x = ListWorkloadRuleCPUThrottleEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[384] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRuleCPUThrottleEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[384] + 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 ListWorkloadRuleCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{384} +} + +func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { if x != nil { - return x.PolicyId + return x.Events } - return "" + return nil } -func (x *EnableCheckpointForPolicyRequest) GetEnabled() bool { +func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { if x != nil { - return x.Enabled + return x.Total } - return false + return 0 } -type EnableCheckpointForPolicyResponse struct { +type ListWorkloadCPUThrottleEventsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // UUID grouping the enqueued per-node patches; empty when no live nodes - // needed enqueueing (policy template still got patched). - BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` - EnqueuedNodes uint32 `protobuf:"varint,2,opt,name=enqueued_nodes,json=enqueuedNodes,proto3" json:"enqueued_nodes,omitempty"` - // cluster_ids whose live nodes were NOT enqueued because their dakr - // operator reports a version lower than MinVersionNodeLabelApply (the - // operator release carrying the Node `patch` RBAC verb + the - // dakr.devzero.io/* allowlist for SSA). The policy template was still - // patched for these clusters, so newly-provisioned nodes inherit the - // label via the NodePool template; existing nodes will be picked up the - // next time the user re-runs this action after the operator upgrade. - SkippedClusters []string `protobuf:"bytes,3,rep,name=skipped_clusters,json=skippedClusters,proto3" json:"skipped_clusters,omitempty"` + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + Limit *int32 `protobuf:"varint,4,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + Offset *int32 `protobuf:"varint,5,opt,name=offset,proto3,oneof" json:"offset,omitempty"` } -func (x *EnableCheckpointForPolicyResponse) Reset() { - *x = EnableCheckpointForPolicyResponse{} +func (x *ListWorkloadCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadCPUThrottleEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[365] + mi := &file_api_v1_recommendation_proto_msgTypes[385] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *EnableCheckpointForPolicyResponse) String() string { +func (x *ListWorkloadCPUThrottleEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EnableCheckpointForPolicyResponse) ProtoMessage() {} +func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} -func (x *EnableCheckpointForPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[365] +func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[385] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28614,58 +32098,130 @@ func (x *EnableCheckpointForPolicyResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use EnableCheckpointForPolicyResponse.ProtoReflect.Descriptor instead. -func (*EnableCheckpointForPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{365} +// Deprecated: Use ListWorkloadCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{385} } -func (x *EnableCheckpointForPolicyResponse) GetBatchId() string { +func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { if x != nil { - return x.BatchId + return x.ClusterId } return "" } -func (x *EnableCheckpointForPolicyResponse) GetEnqueuedNodes() uint32 { +func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { if x != nil { - return x.EnqueuedNodes + return x.Namespace + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit } return 0 } -func (x *EnableCheckpointForPolicyResponse) GetSkippedClusters() []string { +func (x *ListWorkloadCPUThrottleEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadCPUThrottleEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*WorkloadRuleCPUThrottleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListWorkloadCPUThrottleEventsResponse) Reset() { + *x = ListWorkloadCPUThrottleEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[386] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadCPUThrottleEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadCPUThrottleEventsResponse) ProtoMessage() {} + +func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[386] + 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 ListWorkloadCPUThrottleEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadCPUThrottleEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{386} +} + +func (x *ListWorkloadCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { if x != nil { - return x.SkippedClusters + return x.Events } return nil } -type GetCheckpointApplyStatusRequest struct { +func (x *ListWorkloadCPUThrottleEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +// StringSetSelector is an include/exclude selector for a set of string values. +// If In is non-empty, the value must match one entry. NotIn entries are always +// excluded. Both empty = match all. +type StringSetSelector struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + In []string `protobuf:"bytes,1,rep,name=in,proto3" json:"in,omitempty"` + NotIn []string `protobuf:"bytes,2,rep,name=not_in,json=notIn,proto3" json:"not_in,omitempty"` } -func (x *GetCheckpointApplyStatusRequest) Reset() { - *x = GetCheckpointApplyStatusRequest{} +func (x *StringSetSelector) Reset() { + *x = StringSetSelector{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[366] + mi := &file_api_v1_recommendation_proto_msgTypes[387] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetCheckpointApplyStatusRequest) String() string { +func (x *StringSetSelector) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetCheckpointApplyStatusRequest) ProtoMessage() {} +func (*StringSetSelector) ProtoMessage() {} -func (x *GetCheckpointApplyStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[366] +func (x *StringSetSelector) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[387] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28676,60 +32232,95 @@ func (x *GetCheckpointApplyStatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetCheckpointApplyStatusRequest.ProtoReflect.Descriptor instead. -func (*GetCheckpointApplyStatusRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{366} +// Deprecated: Use StringSetSelector.ProtoReflect.Descriptor instead. +func (*StringSetSelector) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{387} } -func (x *GetCheckpointApplyStatusRequest) GetTeamId() string { +func (x *StringSetSelector) GetIn() []string { if x != nil { - return x.TeamId + return x.In } - return "" + return nil } -func (x *GetCheckpointApplyStatusRequest) GetPolicyId() string { +func (x *StringSetSelector) GetNotIn() []string { if x != nil { - return x.PolicyId + return x.NotIn } - return "" + return nil } -type GetCheckpointApplyStatusResponse struct { +type WorkloadOptimizationPolicyProto struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // batch_id of the most-recent EnableCheckpointForPolicy batch for the - // supplied policy, or empty when no batch exists yet. - BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` - Pending uint32 `protobuf:"varint,2,opt,name=pending,proto3" json:"pending,omitempty"` - Applied uint32 `protobuf:"varint,3,opt,name=applied,proto3" json:"applied,omitempty"` - Failed uint32 `protobuf:"varint,4,opt,name=failed,proto3" json:"failed,omitempty"` - // rejected lumps every other terminal status (superseded, blocked, ignored, - // and the operator's Rejected) — the UI surfaces them collectively as "did - // not apply". - Rejected uint32 `protobuf:"varint,5,opt,name=rejected,proto3" json:"rejected,omitempty"` - Failures []*NodeApplyFailure `protobuf:"bytes,6,rep,name=failures,proto3" json:"failures,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"` + ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,7,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,10,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,11,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,12,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,13,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,14,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,15,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,16,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,17,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,18,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,32,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + // HPA: when true, WorkloadRules generated from this policy have HPA + // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. + HpaEnabled bool `protobuf:"varint,19,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,20,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,21,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,22,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,23,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // How far back to analyze CPU/memory/GPU usage when generating rules from + // this policy. Unset = 7 days. Clamped to the team's tier cap on write. + LookbackPeriodSeconds *int32 `protobuf:"varint,24,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Generic (workload-level, no-per-container) optimization settings this + // policy applies to every rule it generates — the same shape a manual + // rule's ManualRuleFields carries. Unset sub-fields mean "not configured + // for this axis"; the engine computes it as if this policy had no + // constraint at all. + CpuRule *ResourceRuleConfig `protobuf:"bytes,25,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,26,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,27,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,28,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,29,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,30,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,31,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` } -func (x *GetCheckpointApplyStatusResponse) Reset() { - *x = GetCheckpointApplyStatusResponse{} +func (x *WorkloadOptimizationPolicyProto) Reset() { + *x = WorkloadOptimizationPolicyProto{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[367] + mi := &file_api_v1_recommendation_proto_msgTypes[388] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetCheckpointApplyStatusResponse) String() string { +func (x *WorkloadOptimizationPolicyProto) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetCheckpointApplyStatusResponse) ProtoMessage() {} +func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} -func (x *GetCheckpointApplyStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[367] +func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[388] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28740,79 +32331,275 @@ func (x *GetCheckpointApplyStatusResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetCheckpointApplyStatusResponse.ProtoReflect.Descriptor instead. -func (*GetCheckpointApplyStatusResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{367} +// Deprecated: Use WorkloadOptimizationPolicyProto.ProtoReflect.Descriptor instead. +func (*WorkloadOptimizationPolicyProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{388} } -func (x *GetCheckpointApplyStatusResponse) GetBatchId() string { +func (x *WorkloadOptimizationPolicyProto) GetId() string { if x != nil { - return x.BatchId + return x.Id } return "" } -func (x *GetCheckpointApplyStatusResponse) GetPending() uint32 { +func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { if x != nil { - return x.Pending + return x.TeamId } - return 0 + return "" } -func (x *GetCheckpointApplyStatusResponse) GetApplied() uint32 { +func (x *WorkloadOptimizationPolicyProto) GetName() string { if x != nil { - return x.Applied + return x.Name + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes } return 0 } -func (x *GetCheckpointApplyStatusResponse) GetFailed() uint32 { +func (x *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { if x != nil { - return x.Failed + return x.DetectionTriggers + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetHpaEnabled() bool { + if x != nil { + return x.HpaEnabled + } + return false +} + +func (x *WorkloadOptimizationPolicyProto) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } return 0 } -func (x *GetCheckpointApplyStatusResponse) GetRejected() uint32 { +func (x *WorkloadOptimizationPolicyProto) GetCpuRule() *ResourceRuleConfig { if x != nil { - return x.Rejected + return x.CpuRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *WorkloadOptimizationPolicyProto) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores } return 0 } -func (x *GetCheckpointApplyStatusResponse) GetFailures() []*NodeApplyFailure { +func (x *WorkloadOptimizationPolicyProto) GetEmergencyResponse() *EmergencyResponseConfig { if x != nil { - return x.Failures + return x.EmergencyResponse } return nil } -type NodeApplyFailure struct { +// GenericOptimizationSettings bundles the optional, workload-level (no +// per-container) resource/HPA/JVM/emergency settings a +// WorkloadOptimizationPolicy can apply to every rule it generates. Mirrors +// ManualRuleFields but omits fields that only make sense for a single +// concrete rule (containers, disabled, startup_period_seconds). Sent as a +// single optional block on create/update: omitted entirely means "leave +// every one of these columns unset/unchanged"; present means apply whichever +// sub-fields are themselves set, exactly like ManualRuleFields already does +// for a manual rule. +type GenericOptimizationSettings struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,5,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,6,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,7,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` } -func (x *NodeApplyFailure) Reset() { - *x = NodeApplyFailure{} +func (x *GenericOptimizationSettings) Reset() { + *x = GenericOptimizationSettings{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[368] + mi := &file_api_v1_recommendation_proto_msgTypes[389] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeApplyFailure) String() string { +func (x *GenericOptimizationSettings) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeApplyFailure) ProtoMessage() {} +func (*GenericOptimizationSettings) ProtoMessage() {} -func (x *NodeApplyFailure) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[368] +func (x *GenericOptimizationSettings) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[389] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -28823,353 +32610,12739 @@ func (x *NodeApplyFailure) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodeApplyFailure.ProtoReflect.Descriptor instead. -func (*NodeApplyFailure) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{368} +// Deprecated: Use GenericOptimizationSettings.ProtoReflect.Descriptor instead. +func (*GenericOptimizationSettings) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{389} } -func (x *NodeApplyFailure) GetNodeName() string { +func (x *GenericOptimizationSettings) GetCpuRule() *ResourceRuleConfig { if x != nil { - return x.NodeName + return x.CpuRule } - return "" + return nil } -func (x *NodeApplyFailure) GetError() string { +func (x *GenericOptimizationSettings) GetMemoryRule() *ResourceRuleConfig { if x != nil { - return x.Error + return x.MemoryRule } - return "" + return nil } -var File_api_v1_recommendation_proto protoreflect.FileDescriptor +func (x *GenericOptimizationSettings) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} -var file_api_v1_recommendation_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x38, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfc, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x10, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, - 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x02, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x22, 0x71, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 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, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, - 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x89, 0x03, 0x0a, 0x29, 0x47, 0x65, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 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, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, +func (x *GenericOptimizationSettings) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *GenericOptimizationSettings) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +type CreateWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,4,opt,name=disabled,proto3" json:"disabled,omitempty"` + ClusterIds []string `protobuf:"bytes,5,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,6,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,7,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,31,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + HpaEnabled bool `protobuf:"varint,15,opt,name=hpa_enabled,json=hpaEnabled,proto3" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,16,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,17,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,18,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,19,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // Metrics lookback window in seconds. Unset = 7 days. + LookbackPeriodSeconds *int32 `protobuf:"varint,20,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Optional. Omitted entirely (the field's zero-value nil pointer) means + // every new resource/HPA/JVM/emergency column is left at NULL — the + // policy relies purely on engine auto-computation. When present, only + // the sub-fields actually populated within it are written. + Settings *GenericOptimizationSettings `protobuf:"bytes,30,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *CreateWorkloadOptimizationPolicyRequest) Reset() { + *x = CreateWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[390] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[390] + 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 CreateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{390} +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { + if x != nil { + return x.HpaEnabled + } + return false +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *CreateWorkloadOptimizationPolicyRequest) GetSettings() *GenericOptimizationSettings { + if x != nil { + return x.Settings + } + return nil +} + +type CreateWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *CreateWorkloadOptimizationPolicyResponse) Reset() { + *x = CreateWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[391] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[391] + 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 CreateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{391} +} + +func (x *CreateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ListWorkloadOptimizationPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Optional. When set, restricts the listing to policies that target this + // cluster — either explicitly via cluster_ids, or implicitly via an empty + // cluster_ids array (which means "all clusters" and therefore applies + // to this cluster too). + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *ListWorkloadOptimizationPoliciesRequest) Reset() { + *x = ListWorkloadOptimizationPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[392] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOptimizationPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOptimizationPoliciesRequest) ProtoMessage() {} + +func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[392] + 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 ListWorkloadOptimizationPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadOptimizationPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{392} +} + +func (x *ListWorkloadOptimizationPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListWorkloadOptimizationPoliciesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type ListWorkloadOptimizationPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*WorkloadOptimizationPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *ListWorkloadOptimizationPoliciesResponse) Reset() { + *x = ListWorkloadOptimizationPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[393] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOptimizationPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOptimizationPoliciesResponse) ProtoMessage() {} + +func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[393] + 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 ListWorkloadOptimizationPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadOptimizationPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{393} +} + +func (x *ListWorkloadOptimizationPoliciesResponse) GetPolicies() []*WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +type GetWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyRequest) Reset() { + *x = GetWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[394] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[394] + 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 GetWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{394} +} + +func (x *GetWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyResponse) Reset() { + *x = GetWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[395] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[395] + 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 GetWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{395} +} + +func (x *GetWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +// GetWorkloadOptimizationPolicyByWorkload looks up the optimization policy +// attached to a workload's rule in a single hop. Returns found = false when +// no rule exists for those coordinates or the rule has no policy attached. +type GetWorkloadOptimizationPolicyByWorkloadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) Reset() { + *x = GetWorkloadOptimizationPolicyByWorkloadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[396] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyByWorkloadRequest) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[396] + 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 GetWorkloadOptimizationPolicyByWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyByWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{396} +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +type GetWorkloadOptimizationPolicyByWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) Reset() { + *x = GetWorkloadOptimizationPolicyByWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[397] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadOptimizationPolicyByWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[397] + 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 GetWorkloadOptimizationPolicyByWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadOptimizationPolicyByWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{397} +} + +func (x *GetWorkloadOptimizationPolicyByWorkloadResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + ClusterIds []string `protobuf:"bytes,6,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,7,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + // Scheduling & Triggers + ActionTriggers []ActionTrigger `protobuf:"varint,8,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + CronSchedule *string `protobuf:"bytes,9,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,10,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,11,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + // Scheduler Optimization + SchedulerPlugins []string `protobuf:"bytes,12,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,13,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled *bool `protobuf:"varint,14,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3,oneof" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling *bool `protobuf:"varint,15,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3,oneof" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease *bool `protobuf:"varint,31,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3,oneof" json:"allow_in_place_memory_limit_decrease,omitempty"` + HpaEnabled *bool `protobuf:"varint,16,opt,name=hpa_enabled,json=hpaEnabled,proto3,oneof" json:"hpa_enabled,omitempty"` + // Targeting selectors (MPA v2 extended targeting) + KindSelector *StringSetSelector `protobuf:"bytes,17,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,18,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,19,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,20,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + // Metrics lookback window in seconds. Omitting it leaves the stored window + // alone rather than resetting it. A change reaches the policy's rules on + // their next generation pass. + LookbackPeriodSeconds *int32 `protobuf:"varint,22,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // Optional. Omitted entirely means leave every existing + // resource/HPA/JVM/emergency setting on this policy untouched — the same + // "only update when the client explicitly sends a value" convention + // already used above for cron_schedule/cooldown_minutes/etc. When + // present, each sub-field within it (cpu_rule, hpa_rule, ...) is applied + // independently: a sub-field left unset inside a present `settings` + // block leaves that axis's current value untouched too, exactly + // mirroring how ManualRuleFields already behaves for a manual rule edit. + Settings *GenericOptimizationSettings `protobuf:"bytes,30,opt,name=settings,proto3" json:"settings,omitempty"` +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) Reset() { + *x = UpdateWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[398] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *UpdateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[398] + 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 UpdateWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{398} +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLiveMigrationEnabled() bool { + if x != nil && x.LiveMigrationEnabled != nil { + return *x.LiveMigrationEnabled + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetUseInPlaceVerticalScaling() bool { + if x != nil && x.UseInPlaceVerticalScaling != nil { + return *x.UseInPlaceVerticalScaling + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil && x.AllowInPlaceMemoryLimitDecrease != nil { + return *x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetHpaEnabled() bool { + if x != nil && x.HpaEnabled != nil { + return *x.HpaEnabled + } + return false +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *UpdateWorkloadOptimizationPolicyRequest) GetSettings() *GenericOptimizationSettings { + if x != nil { + return x.Settings + } + return nil +} + +// ToggleWorkloadOptimizationPolicyDisabled is the sole way to change an +// existing policy's disabled state (creation sets the initial value directly +// via CreateWorkloadOptimizationPolicyRequest.disabled). Splitting this out +// from the general update keeps the branchy "what happens to a policy's +// existing rules when it goes disabled" logic in one place, not entangled +// with unrelated field updates. +type ToggleWorkloadOptimizationPolicyDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` + // Only consulted when transitioning enabled -> disabled. Unspecified + // defaults to KEEP (detach) — never a silent hard delete. Ignored when + // enabling, or when the policy is already in the requested state. + RuleAction *WorkloadRuleAction `protobuf:"varint,4,opt,name=rule_action,json=ruleAction,proto3,enum=api.v1.WorkloadRuleAction,oneof" json:"rule_action,omitempty"` +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) Reset() { + *x = ToggleWorkloadOptimizationPolicyDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[399] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadOptimizationPolicyDisabledRequest) ProtoMessage() {} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[399] + 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 ToggleWorkloadOptimizationPolicyDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadOptimizationPolicyDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{399} +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledRequest) GetRuleAction() WorkloadRuleAction { + if x != nil && x.RuleAction != nil { + return *x.RuleAction + } + return WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED +} + +type ToggleWorkloadOptimizationPolicyDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) Reset() { + *x = ToggleWorkloadOptimizationPolicyDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[400] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadOptimizationPolicyDisabledResponse) ProtoMessage() {} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[400] + 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 ToggleWorkloadOptimizationPolicyDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadOptimizationPolicyDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{400} +} + +func (x *ToggleWorkloadOptimizationPolicyDisabledResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) Reset() { + *x = UpdateWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[401] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *UpdateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[401] + 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 UpdateWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{401} +} + +func (x *UpdateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteWorkloadOptimizationPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // Controls what happens to the policy's already-generated rules. + // Unspecified/omitted defaults to KEEP (detach) — never a silent hard + // delete. + RuleAction *WorkloadRuleAction `protobuf:"varint,4,opt,name=rule_action,json=ruleAction,proto3,enum=api.v1.WorkloadRuleAction,oneof" json:"rule_action,omitempty"` +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) Reset() { + *x = DeleteWorkloadOptimizationPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[402] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadOptimizationPolicyRequest) ProtoMessage() {} + +func (x *DeleteWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[402] + 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 DeleteWorkloadOptimizationPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadOptimizationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{402} +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *DeleteWorkloadOptimizationPolicyRequest) GetRuleAction() WorkloadRuleAction { + if x != nil && x.RuleAction != nil { + return *x.RuleAction + } + return WorkloadRuleAction_WORKLOAD_RULE_ACTION_UNSPECIFIED +} + +type DeleteWorkloadOptimizationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteWorkloadOptimizationPolicyResponse) Reset() { + *x = DeleteWorkloadOptimizationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[403] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadOptimizationPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadOptimizationPolicyResponse) ProtoMessage() {} + +func (x *DeleteWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[403] + 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 DeleteWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{403} +} + +// PreviewWorkloadOptimizationPolicyMatches: dry-run targeting preview. Mirrors +// CreateWorkloadOptimizationPolicyRequest's targeting fields exactly (plus +// optional policy_id) — deliberately excludes operational fields (triggers, +// scheduling, HPA/scaling flags) since those don't affect which workloads +// match, only what happens once a rule is generated for them. +type PreviewWorkloadOptimizationPolicyMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Optional. Set in edit mode so matches already owned by this policy can + // be distinguished from matches owned by a different policy. Omit in + // create mode, where there is no "this policy" yet. + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + ClusterIds []string `protobuf:"bytes,3,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + NamespaceSelector *StringSetSelector `protobuf:"bytes,4,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + KindSelector *StringSetSelector `protobuf:"bytes,5,opt,name=kind_selector,json=kindSelector,proto3,oneof" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,6,opt,name=label_selector,json=labelSelector,proto3,oneof" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,7,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,8,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) Reset() { + *x = PreviewWorkloadOptimizationPolicyMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[404] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadOptimizationPolicyMatchesRequest) ProtoMessage() {} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[404] + 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 PreviewWorkloadOptimizationPolicyMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadOptimizationPolicyMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{404} +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesRequest) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +type WorkloadOptimizationPolicyMatch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,5,opt,name=uid,proto3" json:"uid,omitempty"` + Status WorkloadOptimizationPolicyMatchStatus `protobuf:"varint,6,opt,name=status,proto3,enum=api.v1.WorkloadOptimizationPolicyMatchStatus" json:"status,omitempty"` + // Populated only when status = SKIPPED_OWNED_BY_OTHER_POLICY. + OwningPolicyId *string `protobuf:"bytes,7,opt,name=owning_policy_id,json=owningPolicyId,proto3,oneof" json:"owning_policy_id,omitempty"` + OwningPolicyName *string `protobuf:"bytes,8,opt,name=owning_policy_name,json=owningPolicyName,proto3,oneof" json:"owning_policy_name,omitempty"` +} + +func (x *WorkloadOptimizationPolicyMatch) Reset() { + *x = WorkloadOptimizationPolicyMatch{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[405] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadOptimizationPolicyMatch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadOptimizationPolicyMatch) ProtoMessage() {} + +func (x *WorkloadOptimizationPolicyMatch) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[405] + 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 WorkloadOptimizationPolicyMatch.ProtoReflect.Descriptor instead. +func (*WorkloadOptimizationPolicyMatch) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{405} +} + +func (x *WorkloadOptimizationPolicyMatch) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetStatus() WorkloadOptimizationPolicyMatchStatus { + if x != nil { + return x.Status + } + return WorkloadOptimizationPolicyMatchStatus_WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED +} + +func (x *WorkloadOptimizationPolicyMatch) GetOwningPolicyId() string { + if x != nil && x.OwningPolicyId != nil { + return *x.OwningPolicyId + } + return "" +} + +func (x *WorkloadOptimizationPolicyMatch) GetOwningPolicyName() string { + if x != nil && x.OwningPolicyName != nil { + return *x.OwningPolicyName + } + return "" +} + +type PreviewWorkloadOptimizationPolicyMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Capped (see total_matched vs. total_returned below) — ordered by + // cluster, namespace, kind, name. + MatchedWorkloads []*WorkloadOptimizationPolicyMatch `protobuf:"bytes,1,rep,name=matched_workloads,json=matchedWorkloads,proto3" json:"matched_workloads,omitempty"` + // Total workloads that matched the selector across all requested + // clusters, before the cap was applied. + TotalMatched int32 `protobuf:"varint,2,opt,name=total_matched,json=totalMatched,proto3" json:"total_matched,omitempty"` + // How many of total_matched are actually included in matched_workloads. + // total_returned < total_matched means the result was capped — narrow the + // targeting to see the rest. + TotalReturned int32 `protobuf:"varint,3,opt,name=total_returned,json=totalReturned,proto3" json:"total_returned,omitempty"` +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) Reset() { + *x = PreviewWorkloadOptimizationPolicyMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[406] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadOptimizationPolicyMatchesResponse) ProtoMessage() {} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[406] + 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 PreviewWorkloadOptimizationPolicyMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadOptimizationPolicyMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{406} +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetMatchedWorkloads() []*WorkloadOptimizationPolicyMatch { + if x != nil { + return x.MatchedWorkloads + } + return nil +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetTotalMatched() int32 { + if x != nil { + return x.TotalMatched + } + return 0 +} + +func (x *PreviewWorkloadOptimizationPolicyMatchesResponse) GetTotalReturned() int32 { + if x != nil { + return x.TotalReturned + } + return 0 +} + +type SchedulerPolicyTargetProto struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // empty on create; set on update to preserve identity + ClusterIds []string `protobuf:"bytes,2,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` // empty = all team clusters + NamespaceSelector *StringSetSelector `protobuf:"bytes,3,opt,name=namespace_selector,json=namespaceSelector,proto3" json:"namespace_selector,omitempty"` + KindSelector *StringSetSelector `protobuf:"bytes,4,opt,name=kind_selector,json=kindSelector,proto3" json:"kind_selector,omitempty"` + LabelSelector *LabelSelector `protobuf:"bytes,5,opt,name=label_selector,json=labelSelector,proto3" json:"label_selector,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,6,opt,name=name_pattern,json=namePattern,proto3" json:"name_pattern,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,7,opt,name=namespace_pattern,json=namespacePattern,proto3" json:"namespace_pattern,omitempty"` +} + +func (x *SchedulerPolicyTargetProto) Reset() { + *x = SchedulerPolicyTargetProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[407] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyTargetProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyTargetProto) ProtoMessage() {} + +func (x *SchedulerPolicyTargetProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[407] + 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 SchedulerPolicyTargetProto.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyTargetProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{407} +} + +func (x *SchedulerPolicyTargetProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SchedulerPolicyTargetProto) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamespaceSelector() *StringSetSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetKindSelector() *StringSetSelector { + if x != nil { + return x.KindSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetLabelSelector() *LabelSelector { + if x != nil { + return x.LabelSelector + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *SchedulerPolicyTargetProto) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +type SchedulerPolicyProto struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + Disabled bool `protobuf:"varint,5,opt,name=disabled,proto3" json:"disabled,omitempty"` + SchedulerName string `protobuf:"bytes,6,opt,name=scheduler_name,json=schedulerName,proto3" json:"scheduler_name,omitempty"` + OverrideCustomScheduler bool `protobuf:"varint,7,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3" json:"override_custom_scheduler,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,8,rep,name=targets,proto3" json:"targets,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // set while a delete waits for revert acks (spec 4.5) + DeleteRequestedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=delete_requested_at,json=deleteRequestedAt,proto3,oneof" json:"delete_requested_at,omitempty"` + // live enrollment count, filled by List (not persisted) + EnrolledWorkloads int32 `protobuf:"varint,12,opt,name=enrolled_workloads,json=enrolledWorkloads,proto3" json:"enrolled_workloads,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,13,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id -> display name, union of target clusters +} + +func (x *SchedulerPolicyProto) Reset() { + *x = SchedulerPolicyProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[408] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyProto) ProtoMessage() {} + +func (x *SchedulerPolicyProto) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[408] + 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 SchedulerPolicyProto.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{408} +} + +func (x *SchedulerPolicyProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SchedulerPolicyProto) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SchedulerPolicyProto) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SchedulerPolicyProto) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *SchedulerPolicyProto) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +func (x *SchedulerPolicyProto) GetSchedulerName() string { + if x != nil { + return x.SchedulerName + } + return "" +} + +func (x *SchedulerPolicyProto) GetOverrideCustomScheduler() bool { + if x != nil { + return x.OverrideCustomScheduler + } + return false +} + +func (x *SchedulerPolicyProto) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +func (x *SchedulerPolicyProto) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetDeleteRequestedAt() *timestamppb.Timestamp { + if x != nil { + return x.DeleteRequestedAt + } + return nil +} + +func (x *SchedulerPolicyProto) GetEnrolledWorkloads() int32 { + if x != nil { + return x.EnrolledWorkloads + } + return 0 +} + +func (x *SchedulerPolicyProto) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type CreateSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Description *string `protobuf:"bytes,3,opt,name=description,proto3,oneof" json:"description,omitempty"` + OverrideCustomScheduler bool `protobuf:"varint,4,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3" json:"override_custom_scheduler,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,5,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateSchedulerPolicyRequest) Reset() { + *x = CreateSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[409] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchedulerPolicyRequest) ProtoMessage() {} + +func (x *CreateSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[409] + 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 CreateSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{409} +} + +func (x *CreateSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *CreateSchedulerPolicyRequest) GetOverrideCustomScheduler() bool { + if x != nil { + return x.OverrideCustomScheduler + } + return false +} + +func (x *CreateSchedulerPolicyRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type CreateSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *CreateSchedulerPolicyResponse) Reset() { + *x = CreateSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[410] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSchedulerPolicyResponse) ProtoMessage() {} + +func (x *CreateSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[410] + 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 CreateSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{410} +} + +func (x *CreateSchedulerPolicyResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ListSchedulerPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // When set, only policies with at least one live target covering this + // cluster are returned. Omitted (unset) returns every policy for the + // team, unfiltered. + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` +} + +func (x *ListSchedulerPoliciesRequest) Reset() { + *x = ListSchedulerPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[411] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPoliciesRequest) ProtoMessage() {} + +func (x *ListSchedulerPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[411] + 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 ListSchedulerPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListSchedulerPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{411} +} + +func (x *ListSchedulerPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSchedulerPoliciesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListSchedulerPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SchedulerPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *ListSchedulerPoliciesResponse) Reset() { + *x = ListSchedulerPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[412] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPoliciesResponse) ProtoMessage() {} + +func (x *ListSchedulerPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[412] + 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 ListSchedulerPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListSchedulerPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{412} +} + +func (x *ListSchedulerPoliciesResponse) GetPolicies() []*SchedulerPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +type UpdateSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` + OverrideCustomScheduler *bool `protobuf:"varint,5,opt,name=override_custom_scheduler,json=overrideCustomScheduler,proto3,oneof" json:"override_custom_scheduler,omitempty"` + // full replacement of the target set (targets with ids are updated, + // without ids created, missing ones removed) — omitted (empty) list + // means "leave targets unchanged", carried by this flag: + ReplaceTargets bool `protobuf:"varint,6,opt,name=replace_targets,json=replaceTargets,proto3" json:"replace_targets,omitempty"` + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,7,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *UpdateSchedulerPolicyRequest) Reset() { + *x = UpdateSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[413] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSchedulerPolicyRequest) ProtoMessage() {} + +func (x *UpdateSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[413] + 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 UpdateSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{413} +} + +func (x *UpdateSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *UpdateSchedulerPolicyRequest) GetOverrideCustomScheduler() bool { + if x != nil && x.OverrideCustomScheduler != nil { + return *x.OverrideCustomScheduler + } + return false +} + +func (x *UpdateSchedulerPolicyRequest) GetReplaceTargets() bool { + if x != nil { + return x.ReplaceTargets + } + return false +} + +func (x *UpdateSchedulerPolicyRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type UpdateSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSchedulerPolicyResponse) Reset() { + *x = UpdateSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[414] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSchedulerPolicyResponse) ProtoMessage() {} + +func (x *UpdateSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[414] + 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 UpdateSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{414} +} + +func (x *UpdateSchedulerPolicyResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +type ToggleSchedulerPolicyDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` +} + +func (x *ToggleSchedulerPolicyDisabledRequest) Reset() { + *x = ToggleSchedulerPolicyDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[415] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleSchedulerPolicyDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleSchedulerPolicyDisabledRequest) ProtoMessage() {} + +func (x *ToggleSchedulerPolicyDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[415] + 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 ToggleSchedulerPolicyDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleSchedulerPolicyDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{415} +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ToggleSchedulerPolicyDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type ToggleSchedulerPolicyDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SchedulerPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + // active enrollments flipped to pending_revert by disabling + RevertsInitiated int32 `protobuf:"varint,2,opt,name=reverts_initiated,json=revertsInitiated,proto3" json:"reverts_initiated,omitempty"` +} + +func (x *ToggleSchedulerPolicyDisabledResponse) Reset() { + *x = ToggleSchedulerPolicyDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[416] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleSchedulerPolicyDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleSchedulerPolicyDisabledResponse) ProtoMessage() {} + +func (x *ToggleSchedulerPolicyDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[416] + 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 ToggleSchedulerPolicyDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleSchedulerPolicyDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{416} +} + +func (x *ToggleSchedulerPolicyDisabledResponse) GetPolicy() *SchedulerPolicyProto { + if x != nil { + return x.Policy + } + return nil +} + +func (x *ToggleSchedulerPolicyDisabledResponse) GetRevertsInitiated() int32 { + if x != nil { + return x.RevertsInitiated + } + return 0 +} + +type DeleteSchedulerPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // force skips reverts: enrollments are abandoned in place (spec 4.5) + Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` +} + +func (x *DeleteSchedulerPolicyRequest) Reset() { + *x = DeleteSchedulerPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[417] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSchedulerPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSchedulerPolicyRequest) ProtoMessage() {} + +func (x *DeleteSchedulerPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[417] + 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 DeleteSchedulerPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteSchedulerPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{417} +} + +func (x *DeleteSchedulerPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSchedulerPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *DeleteSchedulerPolicyRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + +type DeleteSchedulerPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Outcome DeleteSchedulerPolicyResponse_Outcome `protobuf:"varint,1,opt,name=outcome,proto3,enum=api.v1.DeleteSchedulerPolicyResponse_Outcome" json:"outcome,omitempty"` + RevertsInitiated int32 `protobuf:"varint,2,opt,name=reverts_initiated,json=revertsInitiated,proto3" json:"reverts_initiated,omitempty"` +} + +func (x *DeleteSchedulerPolicyResponse) Reset() { + *x = DeleteSchedulerPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[418] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSchedulerPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSchedulerPolicyResponse) ProtoMessage() {} + +func (x *DeleteSchedulerPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[418] + 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 DeleteSchedulerPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteSchedulerPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{418} +} + +func (x *DeleteSchedulerPolicyResponse) GetOutcome() DeleteSchedulerPolicyResponse_Outcome { + if x != nil { + return x.Outcome + } + return DeleteSchedulerPolicyResponse_OUTCOME_UNSPECIFIED +} + +func (x *DeleteSchedulerPolicyResponse) GetRevertsInitiated() int32 { + if x != nil { + return x.RevertsInitiated + } + return 0 +} + +type PreviewSchedulerPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` // set when editing, for diff classification + Targets []*SchedulerPolicyTargetProto `protobuf:"bytes,3,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *PreviewSchedulerPolicyTargetsRequest) Reset() { + *x = PreviewSchedulerPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[419] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSchedulerPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSchedulerPolicyTargetsRequest) ProtoMessage() {} + +func (x *PreviewSchedulerPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[419] + 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 PreviewSchedulerPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*PreviewSchedulerPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{419} +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *PreviewSchedulerPolicyTargetsRequest) GetTargets() []*SchedulerPolicyTargetProto { + if x != nil { + return x.Targets + } + return nil +} + +type SchedulerPolicyTargetMatch struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Status SchedulerPolicyTargetMatch_Status `protobuf:"varint,5,opt,name=status,proto3,enum=api.v1.SchedulerPolicyTargetMatch_Status" json:"status,omitempty"` + OwningPolicyId *string `protobuf:"bytes,6,opt,name=owning_policy_id,json=owningPolicyId,proto3,oneof" json:"owning_policy_id,omitempty"` + OwningPolicyName *string `protobuf:"bytes,7,opt,name=owning_policy_name,json=owningPolicyName,proto3,oneof" json:"owning_policy_name,omitempty"` + // workload spec's current schedulerName ("" = unset/default) + CurrentScheduler string `protobuf:"bytes,8,opt,name=current_scheduler,json=currentScheduler,proto3" json:"current_scheduler,omitempty"` +} + +func (x *SchedulerPolicyTargetMatch) Reset() { + *x = SchedulerPolicyTargetMatch{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[420] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyTargetMatch) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyTargetMatch) ProtoMessage() {} + +func (x *SchedulerPolicyTargetMatch) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[420] + 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 SchedulerPolicyTargetMatch.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyTargetMatch) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{420} +} + +func (x *SchedulerPolicyTargetMatch) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetStatus() SchedulerPolicyTargetMatch_Status { + if x != nil { + return x.Status + } + return SchedulerPolicyTargetMatch_STATUS_UNSPECIFIED +} + +func (x *SchedulerPolicyTargetMatch) GetOwningPolicyId() string { + if x != nil && x.OwningPolicyId != nil { + return *x.OwningPolicyId + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetOwningPolicyName() string { + if x != nil && x.OwningPolicyName != nil { + return *x.OwningPolicyName + } + return "" +} + +func (x *SchedulerPolicyTargetMatch) GetCurrentScheduler() string { + if x != nil { + return x.CurrentScheduler + } + return "" +} + +type PreviewSchedulerPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MatchedWorkloads []*SchedulerPolicyTargetMatch `protobuf:"bytes,1,rep,name=matched_workloads,json=matchedWorkloads,proto3" json:"matched_workloads,omitempty"` + TotalMatched int32 `protobuf:"varint,2,opt,name=total_matched,json=totalMatched,proto3" json:"total_matched,omitempty"` + TotalReturned int32 `protobuf:"varint,3,opt,name=total_returned,json=totalReturned,proto3" json:"total_returned,omitempty"` // capped at 500, deterministic prefix + // Count over the FULL match set (like total_matched), not just the + // capped/returned prefix: matches whose current_scheduler is neither + // empty nor default-scheduler. + CustomSchedulerCount int32 `protobuf:"varint,4,opt,name=custom_scheduler_count,json=customSchedulerCount,proto3" json:"custom_scheduler_count,omitempty"` +} + +func (x *PreviewSchedulerPolicyTargetsResponse) Reset() { + *x = PreviewSchedulerPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[421] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSchedulerPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSchedulerPolicyTargetsResponse) ProtoMessage() {} + +func (x *PreviewSchedulerPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[421] + 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 PreviewSchedulerPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*PreviewSchedulerPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{421} +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetMatchedWorkloads() []*SchedulerPolicyTargetMatch { + if x != nil { + return x.MatchedWorkloads + } + return nil +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetTotalMatched() int32 { + if x != nil { + return x.TotalMatched + } + return 0 +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetTotalReturned() int32 { + if x != nil { + return x.TotalReturned + } + return 0 +} + +func (x *PreviewSchedulerPolicyTargetsResponse) GetCustomSchedulerCount() int32 { + if x != nil { + return x.CustomSchedulerCount + } + return 0 +} + +type ListSchedulerPolicyEnrollmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) Reset() { + *x = ListSchedulerPolicyEnrollmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[422] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPolicyEnrollmentsRequest) ProtoMessage() {} + +func (x *ListSchedulerPolicyEnrollmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[422] + 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 ListSchedulerPolicyEnrollmentsRequest.ProtoReflect.Descriptor instead. +func (*ListSchedulerPolicyEnrollmentsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{422} +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSchedulerPolicyEnrollmentsRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type SchedulerPolicyEnrollment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + State SchedulerPolicyEnrollment_State `protobuf:"varint,5,opt,name=state,proto3,enum=api.v1.SchedulerPolicyEnrollment_State" json:"state,omitempty"` + // Original scheduler captured in the workload's baseline. Unset when no + // baseline row exists yet (spec 3.3); an empty string is a real value — + // the baseline captured the field as unset on the workload, not "unknown". + OriginalSchedulerName *string `protobuf:"bytes,6,opt,name=original_scheduler_name,json=originalSchedulerName,proto3,oneof" json:"original_scheduler_name,omitempty"` + EnrolledAt *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=enrolled_at,json=enrolledAt,proto3" json:"enrolled_at,omitempty"` + UnenrolledAt *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=unenrolled_at,json=unenrolledAt,proto3,oneof" json:"unenrolled_at,omitempty"` +} + +func (x *SchedulerPolicyEnrollment) Reset() { + *x = SchedulerPolicyEnrollment{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[423] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicyEnrollment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicyEnrollment) ProtoMessage() {} + +func (x *SchedulerPolicyEnrollment) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[423] + 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 SchedulerPolicyEnrollment.ProtoReflect.Descriptor instead. +func (*SchedulerPolicyEnrollment) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{423} +} + +func (x *SchedulerPolicyEnrollment) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetState() SchedulerPolicyEnrollment_State { + if x != nil { + return x.State + } + return SchedulerPolicyEnrollment_STATE_UNSPECIFIED +} + +func (x *SchedulerPolicyEnrollment) GetOriginalSchedulerName() string { + if x != nil && x.OriginalSchedulerName != nil { + return *x.OriginalSchedulerName + } + return "" +} + +func (x *SchedulerPolicyEnrollment) GetEnrolledAt() *timestamppb.Timestamp { + if x != nil { + return x.EnrolledAt + } + return nil +} + +func (x *SchedulerPolicyEnrollment) GetUnenrolledAt() *timestamppb.Timestamp { + if x != nil { + return x.UnenrolledAt + } + return nil +} + +type ListSchedulerPolicyEnrollmentsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Enrollments []*SchedulerPolicyEnrollment `protobuf:"bytes,1,rep,name=enrollments,proto3" json:"enrollments,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id -> display name +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) Reset() { + *x = ListSchedulerPolicyEnrollmentsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[424] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSchedulerPolicyEnrollmentsResponse) ProtoMessage() {} + +func (x *ListSchedulerPolicyEnrollmentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[424] + 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 ListSchedulerPolicyEnrollmentsResponse.ProtoReflect.Descriptor instead. +func (*ListSchedulerPolicyEnrollmentsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{424} +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) GetEnrollments() []*SchedulerPolicyEnrollment { + if x != nil { + return x.Enrollments + } + return nil +} + +func (x *ListSchedulerPolicyEnrollmentsResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type SchedulerPolicySync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SchedulerPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Reverts []*SchedulerRevertInstruction `protobuf:"bytes,2,rep,name=reverts,proto3" json:"reverts,omitempty"` + // Opaque fingerprint of (policies, reverts, scheduler_settings); tunr + // echoes it in its next enrollment report so dakr can log convergence. + // Not used for correctness. + SyncFingerprint string `protobuf:"bytes,3,opt,name=sync_fingerprint,json=syncFingerprint,proto3" json:"sync_fingerprint,omitempty"` + // Rendered dz-scheduler-config.yaml content for this cluster, when a + // settings row exists. Unset when the cluster has no persisted + // SchedulerSettings row — tunr must leave the helm-managed ConfigMap + // untouched in that case, not apply a rendered-defaults config. + SchedulerSettings *SchedulerConfigPayload `protobuf:"bytes,4,opt,name=scheduler_settings,json=schedulerSettings,proto3" json:"scheduler_settings,omitempty"` +} + +func (x *SchedulerPolicySync) Reset() { + *x = SchedulerPolicySync{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[425] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerPolicySync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerPolicySync) ProtoMessage() {} + +func (x *SchedulerPolicySync) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[425] + 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 SchedulerPolicySync.ProtoReflect.Descriptor instead. +func (*SchedulerPolicySync) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{425} +} + +func (x *SchedulerPolicySync) GetPolicies() []*SchedulerPolicyProto { + if x != nil { + return x.Policies + } + return nil +} + +func (x *SchedulerPolicySync) GetReverts() []*SchedulerRevertInstruction { + if x != nil { + return x.Reverts + } + return nil +} + +func (x *SchedulerPolicySync) GetSyncFingerprint() string { + if x != nil { + return x.SyncFingerprint + } + return "" +} + +func (x *SchedulerPolicySync) GetSchedulerSettings() *SchedulerConfigPayload { + if x != nil { + return x.SchedulerSettings + } + return nil +} + +type SchedulerConfigPayload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Complete dz-scheduler-config.yaml content, rendered by dakr. + RenderedConfig string `protobuf:"bytes,1,opt,name=rendered_config,json=renderedConfig,proto3" json:"rendered_config,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SchedulerConfigPayload) Reset() { + *x = SchedulerConfigPayload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[426] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerConfigPayload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerConfigPayload) ProtoMessage() {} + +func (x *SchedulerConfigPayload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[426] + 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 SchedulerConfigPayload.ProtoReflect.Descriptor instead. +func (*SchedulerConfigPayload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{426} +} + +func (x *SchedulerConfigPayload) GetRenderedConfig() string { + if x != nil { + return x.RenderedConfig + } + return "" +} + +func (x *SchedulerConfigPayload) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type SchedulerRevertInstruction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnrollmentId string `protobuf:"bytes,1,opt,name=enrollment_id,json=enrollmentId,proto3" json:"enrollment_id,omitempty"` // ack correlation id for apply + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + // literal value to restore; empty string means remove the field + // (baseline recorded the scheduler as unset). tunr prefers the + // on-workload annotation and uses this as fallback (spec 4.5 step 2). + OriginalSchedulerName string `protobuf:"bytes,5,opt,name=original_scheduler_name,json=originalSchedulerName,proto3" json:"original_scheduler_name,omitempty"` +} + +func (x *SchedulerRevertInstruction) Reset() { + *x = SchedulerRevertInstruction{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[427] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertInstruction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertInstruction) ProtoMessage() {} + +func (x *SchedulerRevertInstruction) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[427] + 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 SchedulerRevertInstruction.ProtoReflect.Descriptor instead. +func (*SchedulerRevertInstruction) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{427} +} + +func (x *SchedulerRevertInstruction) GetEnrollmentId() string { + if x != nil { + return x.EnrollmentId + } + return "" +} + +func (x *SchedulerRevertInstruction) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerRevertInstruction) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerRevertInstruction) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerRevertInstruction) GetOriginalSchedulerName() string { + if x != nil { + return x.OriginalSchedulerName + } + return "" +} + +type SchedulerEnrollmentReport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Observations []*SchedulerEnrollmentReport_Observation `protobuf:"bytes,1,rep,name=observations,proto3" json:"observations,omitempty"` + // Echo of the SchedulerPolicySync.sync_fingerprint tunr last applied. + // dakr compares this against the sending stream's current delivery-state + // fingerprint and logs a divergence once per report (Debug/Info) -- + // informational only, never rejected: a stale echo just means tunr's + // report raced an in-flight sync push and will self-correct on the next + // tick. + SyncFingerprint string `protobuf:"bytes,2,opt,name=sync_fingerprint,json=syncFingerprint,proto3" json:"sync_fingerprint,omitempty"` + // Full image ref of the running dz-scheduler container (registry/repo:tag), + // as read from the dz-scheduler Deployment's first container. Informational, + // and the version gate the config renderer (#9978) uses to decide which + // rendered-config shape a cluster can accept. "" = unknown or the + // Deployment was not found (scheduler disabled, or not yet observed). + SchedulerImage string `protobuf:"bytes,3,opt,name=scheduler_image,json=schedulerImage,proto3" json:"scheduler_image,omitempty"` +} + +func (x *SchedulerEnrollmentReport) Reset() { + *x = SchedulerEnrollmentReport{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[428] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerEnrollmentReport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerEnrollmentReport) ProtoMessage() {} + +func (x *SchedulerEnrollmentReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[428] + 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 SchedulerEnrollmentReport.ProtoReflect.Descriptor instead. +func (*SchedulerEnrollmentReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{428} +} + +func (x *SchedulerEnrollmentReport) GetObservations() []*SchedulerEnrollmentReport_Observation { + if x != nil { + return x.Observations + } + return nil +} + +func (x *SchedulerEnrollmentReport) GetSyncFingerprint() string { + if x != nil { + return x.SyncFingerprint + } + return "" +} + +func (x *SchedulerEnrollmentReport) GetSchedulerImage() string { + if x != nil { + return x.SchedulerImage + } + return "" +} + +// SchedulerRevertEventReport carries fail-open scheduler revert events +// observed by tunr's admission failsafe: pods steered away from an +// unhealthy tracked scheduler at CREATE time. Pod-level and transient -- +// the owning workload stays enrolled; dakr records these as the negative +// signal for scheduler-impact observability. Batched per stream tick; +// dropped_events counts buffer overflow drops since the last report. +type SchedulerRevertEventReport struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []*SchedulerRevertEventReport_Event `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + DroppedEvents uint32 `protobuf:"varint,2,opt,name=dropped_events,json=droppedEvents,proto3" json:"dropped_events,omitempty"` +} + +func (x *SchedulerRevertEventReport) Reset() { + *x = SchedulerRevertEventReport{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[429] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertEventReport) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertEventReport) ProtoMessage() {} + +func (x *SchedulerRevertEventReport) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[429] + 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 SchedulerRevertEventReport.ProtoReflect.Descriptor instead. +func (*SchedulerRevertEventReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{429} +} + +func (x *SchedulerRevertEventReport) GetEvents() []*SchedulerRevertEventReport_Event { + if x != nil { + return x.Events + } + return nil +} + +func (x *SchedulerRevertEventReport) GetDroppedEvents() uint32 { + if x != nil { + return x.DroppedEvents + } + return 0 +} + +type GetWorkloadRulesByPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetWorkloadRulesByPolicyRequest) Reset() { + *x = GetWorkloadRulesByPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[430] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRulesByPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRulesByPolicyRequest) ProtoMessage() {} + +func (x *GetWorkloadRulesByPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[430] + 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 GetWorkloadRulesByPolicyRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRulesByPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{430} +} + +func (x *GetWorkloadRulesByPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRulesByPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetWorkloadRulesByPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ManagedRules []*WorkloadRule `protobuf:"bytes,1,rep,name=managed_rules,json=managedRules,proto3" json:"managed_rules,omitempty"` + ExcludedRules []*WorkloadRule `protobuf:"bytes,2,rep,name=excluded_rules,json=excludedRules,proto3" json:"excluded_rules,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,3,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *GetWorkloadRulesByPolicyResponse) Reset() { + *x = GetWorkloadRulesByPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[431] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRulesByPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRulesByPolicyResponse) ProtoMessage() {} + +func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[431] + 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 GetWorkloadRulesByPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRulesByPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{431} +} + +func (x *GetWorkloadRulesByPolicyResponse) GetManagedRules() []*WorkloadRule { + if x != nil { + return x.ManagedRules + } + return nil +} + +func (x *GetWorkloadRulesByPolicyResponse) GetExcludedRules() []*WorkloadRule { + if x != nil { + return x.ExcludedRules + } + return nil +} + +func (x *GetWorkloadRulesByPolicyResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +type ListWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,omitempty"` +} + +func (x *ListWorkloadRulesRequest) Reset() { + *x = ListWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[432] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRulesRequest) ProtoMessage() {} + +func (x *ListWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[432] + 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 ListWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{432} +} + +func (x *ListWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListWorkloadRulesRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rules []*WorkloadRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + ClusterNames map[string]string `protobuf:"bytes,2,rep,name=cluster_names,json=clusterNames,proto3" json:"cluster_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // cluster_id → display name + PolicyNames map[string]string `protobuf:"bytes,3,rep,name=policy_names,json=policyNames,proto3" json:"policy_names,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // policy_id → policy name +} + +func (x *ListWorkloadRulesResponse) Reset() { + *x = ListWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[433] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRulesResponse) ProtoMessage() {} + +func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[433] + 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 ListWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{433} +} + +func (x *ListWorkloadRulesResponse) GetRules() []*WorkloadRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *ListWorkloadRulesResponse) GetClusterNames() map[string]string { + if x != nil { + return x.ClusterNames + } + return nil +} + +func (x *ListWorkloadRulesResponse) GetPolicyNames() map[string]string { + if x != nil { + return x.PolicyNames + } + return nil +} + +type GetWorkloadRuleByIDRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *GetWorkloadRuleByIDRequest) Reset() { + *x = GetWorkloadRuleByIDRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[434] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByIDRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByIDRequest) ProtoMessage() {} + +func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[434] + 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 GetWorkloadRuleByIDRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByIDRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{434} +} + +func (x *GetWorkloadRuleByIDRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRuleByIDRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type GetWorkloadRuleByIDResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) +} + +func (x *GetWorkloadRuleByIDResponse) Reset() { + *x = GetWorkloadRuleByIDResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[435] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByIDResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByIDResponse) ProtoMessage() {} + +func (x *GetWorkloadRuleByIDResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[435] + 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 GetWorkloadRuleByIDResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByIDResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{435} +} + +func (x *GetWorkloadRuleByIDResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +func (x *GetWorkloadRuleByIDResponse) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +func (x *GetWorkloadRuleByIDResponse) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +// GetWorkloadRuleByWorkloadRequest looks up a single rule by workload coordinates. +type GetWorkloadRuleByWorkloadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,5,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` +} + +func (x *GetWorkloadRuleByWorkloadRequest) Reset() { + *x = GetWorkloadRuleByWorkloadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[436] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByWorkloadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByWorkloadRequest) ProtoMessage() {} + +func (x *GetWorkloadRuleByWorkloadRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[436] + 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 GetWorkloadRuleByWorkloadRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{436} +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadRequest) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +// GetWorkloadRuleByWorkloadResponse returns the rule for a workload (if any) plus display metadata. +// Returns found = false (with rule unset) when no rule exists for the given coordinates; +// internal errors continue to surface as gRPC error statuses. +type GetWorkloadRuleByWorkloadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` // display name of rule.cluster_id (when found) + PolicyName string `protobuf:"bytes,3,opt,name=policy_name,json=policyName,proto3" json:"policy_name,omitempty"` // display name of rule.policy_id (empty if no policy attached) + Found bool `protobuf:"varint,4,opt,name=found,proto3" json:"found,omitempty"` // true when a matching rule exists +} + +func (x *GetWorkloadRuleByWorkloadResponse) Reset() { + *x = GetWorkloadRuleByWorkloadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[437] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadRuleByWorkloadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadRuleByWorkloadResponse) ProtoMessage() {} + +func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[437] + 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 GetWorkloadRuleByWorkloadResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadRuleByWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{437} +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +func (x *GetWorkloadRuleByWorkloadResponse) GetFound() bool { + if x != nil { + return x.Found + } + return false +} + +// GetWorkloadByWorkloadRuleRequest resolves the live workload UID for a rule. +// Lightweight lookup — does not return full workload data, just the uid that +// downstream RPCs (e.g. GetWorkloadProfiles, GetWorkload) require. +type GetWorkloadByWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *GetWorkloadByWorkloadRuleRequest) Reset() { + *x = GetWorkloadByWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[438] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadByWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadByWorkloadRuleRequest) ProtoMessage() {} + +func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[438] + 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 GetWorkloadByWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadByWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{438} +} + +func (x *GetWorkloadByWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadByWorkloadRuleRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type GetWorkloadByWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkloadUid string `protobuf:"bytes,1,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` // empty when no live workload matches the rule's coordinates +} + +func (x *GetWorkloadByWorkloadRuleResponse) Reset() { + *x = GetWorkloadByWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[439] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadByWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadByWorkloadRuleResponse) ProtoMessage() {} + +func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[439] + 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 GetWorkloadByWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadByWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{439} +} + +func (x *GetWorkloadByWorkloadRuleResponse) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +type DeleteWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` +} + +func (x *DeleteWorkloadRuleRequest) Reset() { + *x = DeleteWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[440] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadRuleRequest) ProtoMessage() {} + +func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[440] + 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 DeleteWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{440} +} + +func (x *DeleteWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteWorkloadRuleRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +type DeleteWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteWorkloadRuleResponse) Reset() { + *x = DeleteWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[441] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadRuleResponse) ProtoMessage() {} + +func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[441] + 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 DeleteWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{441} +} + +type DeleteAllWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *DeleteAllWorkloadRulesRequest) Reset() { + *x = DeleteAllWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[442] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAllWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllWorkloadRulesRequest) ProtoMessage() {} + +func (x *DeleteAllWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[442] + 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 DeleteAllWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{442} +} + +func (x *DeleteAllWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteAllWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type DeleteAllWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllWorkloadRulesResponse) Reset() { + *x = DeleteAllWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[443] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAllWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllWorkloadRulesResponse) ProtoMessage() {} + +func (x *DeleteAllWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[443] + 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 DeleteAllWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*DeleteAllWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{443} +} + +// BulkDeleteWorkloadRules deletes an explicit set of rules within a single +// cluster (e.g. a UI multi-select), triggering CRD removal for each. Scoped +// to cluster_id so the server can validate ownership once and reject any +// rule_ids that don't belong to that cluster, rather than trusting the caller. +type BulkDeleteWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RuleIds []string `protobuf:"bytes,3,rep,name=rule_ids,json=ruleIds,proto3" json:"rule_ids,omitempty"` +} + +func (x *BulkDeleteWorkloadRulesRequest) Reset() { + *x = BulkDeleteWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[444] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteWorkloadRulesRequest) ProtoMessage() {} + +func (x *BulkDeleteWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[444] + 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 BulkDeleteWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BulkDeleteWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{444} +} + +func (x *BulkDeleteWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BulkDeleteWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BulkDeleteWorkloadRulesRequest) GetRuleIds() []string { + if x != nil { + return x.RuleIds + } + return nil +} + +type BulkDeleteWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DeletedCount int32 `protobuf:"varint,1,opt,name=deleted_count,json=deletedCount,proto3" json:"deleted_count,omitempty"` +} + +func (x *BulkDeleteWorkloadRulesResponse) Reset() { + *x = BulkDeleteWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[445] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkDeleteWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkDeleteWorkloadRulesResponse) ProtoMessage() {} + +func (x *BulkDeleteWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[445] + 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 BulkDeleteWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BulkDeleteWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{445} +} + +func (x *BulkDeleteWorkloadRulesResponse) GetDeletedCount() int32 { + if x != nil { + return x.DeletedCount + } + return 0 +} + +// BulkToggleWorkloadRulesDisabled flips the disabled flag on an explicit set +// of rules within a single cluster (e.g. a UI multi-select) — each rule +// switches to whatever it currently is NOT, independently of the others, so +// a single call can disable some and enable others in one request. Mirrors +// BulkDeleteWorkloadRules's scoping: rule_ids that do not belong to +// cluster_id are silently excluded rather than erroring. +type BulkToggleWorkloadRulesDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + RuleIds []string `protobuf:"bytes,3,rep,name=rule_ids,json=ruleIds,proto3" json:"rule_ids,omitempty"` +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) Reset() { + *x = BulkToggleWorkloadRulesDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[446] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkToggleWorkloadRulesDisabledRequest) ProtoMessage() {} + +func (x *BulkToggleWorkloadRulesDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[446] + 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 BulkToggleWorkloadRulesDisabledRequest.ProtoReflect.Descriptor instead. +func (*BulkToggleWorkloadRulesDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{446} +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BulkToggleWorkloadRulesDisabledRequest) GetRuleIds() []string { + if x != nil { + return x.RuleIds + } + return nil +} + +type BulkToggleWorkloadRulesDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UpdatedCount int32 `protobuf:"varint,1,opt,name=updated_count,json=updatedCount,proto3" json:"updated_count,omitempty"` +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) Reset() { + *x = BulkToggleWorkloadRulesDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[447] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BulkToggleWorkloadRulesDisabledResponse) ProtoMessage() {} + +func (x *BulkToggleWorkloadRulesDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[447] + 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 BulkToggleWorkloadRulesDisabledResponse.ProtoReflect.Descriptor instead. +func (*BulkToggleWorkloadRulesDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{447} +} + +func (x *BulkToggleWorkloadRulesDisabledResponse) GetUpdatedCount() int32 { + if x != nil { + return x.UpdatedCount + } + return 0 +} + +type DeleteRuleAndApplyRecommendationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + WorkloadUid string `protobuf:"bytes,3,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + WorkloadRecommendation *WorkloadRecommendation `protobuf:"bytes,4,opt,name=workload_recommendation,json=workloadRecommendation,proto3" json:"workload_recommendation,omitempty"` +} + +func (x *DeleteRuleAndApplyRecommendationRequest) Reset() { + *x = DeleteRuleAndApplyRecommendationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[448] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRuleAndApplyRecommendationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRuleAndApplyRecommendationRequest) ProtoMessage() {} + +func (x *DeleteRuleAndApplyRecommendationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[448] + 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 DeleteRuleAndApplyRecommendationRequest.ProtoReflect.Descriptor instead. +func (*DeleteRuleAndApplyRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{448} +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +func (x *DeleteRuleAndApplyRecommendationRequest) GetWorkloadRecommendation() *WorkloadRecommendation { + if x != nil { + return x.WorkloadRecommendation + } + return nil +} + +type DeleteRuleAndApplyRecommendationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteRuleAndApplyRecommendationResponse) Reset() { + *x = DeleteRuleAndApplyRecommendationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[449] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteRuleAndApplyRecommendationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRuleAndApplyRecommendationResponse) ProtoMessage() {} + +func (x *DeleteRuleAndApplyRecommendationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[449] + 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 DeleteRuleAndApplyRecommendationResponse.ProtoReflect.Descriptor instead. +func (*DeleteRuleAndApplyRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{449} +} + +// ManualRuleFields carries the user-configurable rule fields shared by the +// Upsert and Preview RPCs. Extracted as its own message so the two request +// messages stay shape-aligned and the Go conversion logic has a single entry +// point. +type ManualRuleFields struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuRule *ResourceRuleConfig `protobuf:"bytes,1,opt,name=cpu_rule,json=cpuRule,proto3" json:"cpu_rule,omitempty"` + MemoryRule *ResourceRuleConfig `protobuf:"bytes,2,opt,name=memory_rule,json=memoryRule,proto3" json:"memory_rule,omitempty"` + GpuRule *ResourceRuleConfig `protobuf:"bytes,3,opt,name=gpu_rule,json=gpuRule,proto3" json:"gpu_rule,omitempty"` + HpaRule *HPARuleConfig `protobuf:"bytes,4,opt,name=hpa_rule,json=hpaRule,proto3" json:"hpa_rule,omitempty"` + EmergencyResponse *EmergencyResponseConfig `protobuf:"bytes,5,opt,name=emergency_response,json=emergencyResponse,proto3" json:"emergency_response,omitempty"` + ActionTriggers []ActionTrigger `protobuf:"varint,6,rep,packed,name=action_triggers,json=actionTriggers,proto3,enum=api.v1.ActionTrigger" json:"action_triggers,omitempty"` + StartupPeriodSeconds *int64 `protobuf:"varint,7,opt,name=startup_period_seconds,json=startupPeriodSeconds,proto3,oneof" json:"startup_period_seconds,omitempty"` + CronSchedule *string `protobuf:"bytes,8,opt,name=cron_schedule,json=cronSchedule,proto3,oneof" json:"cron_schedule,omitempty"` + CooldownMinutes *int32 `protobuf:"varint,9,opt,name=cooldown_minutes,json=cooldownMinutes,proto3,oneof" json:"cooldown_minutes,omitempty"` + DetectionTriggers []WorkloadDetectionTrigger `protobuf:"varint,10,rep,packed,name=detection_triggers,json=detectionTriggers,proto3,enum=api.v1.WorkloadDetectionTrigger" json:"detection_triggers,omitempty"` + SchedulerPlugins []string `protobuf:"bytes,11,rep,name=scheduler_plugins,json=schedulerPlugins,proto3" json:"scheduler_plugins,omitempty"` + DefragmentationSchedule *string `protobuf:"bytes,12,opt,name=defragmentation_schedule,json=defragmentationSchedule,proto3,oneof" json:"defragmentation_schedule,omitempty"` + LiveMigrationEnabled bool `protobuf:"varint,13,opt,name=live_migration_enabled,json=liveMigrationEnabled,proto3" json:"live_migration_enabled,omitempty"` + UseInPlaceVerticalScaling bool `protobuf:"varint,14,opt,name=use_in_place_vertical_scaling,json=useInPlaceVerticalScaling,proto3" json:"use_in_place_vertical_scaling,omitempty"` + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + AllowInPlaceMemoryLimitDecrease bool `protobuf:"varint,20,opt,name=allow_in_place_memory_limit_decrease,json=allowInPlaceMemoryLimitDecrease,proto3" json:"allow_in_place_memory_limit_decrease,omitempty"` + // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. + Containers []*ContainerResourceRuleConfig `protobuf:"bytes,15,rep,name=containers,proto3" json:"containers,omitempty"` + // JVM heap optimization overrides for this rule. + JvmHeapRule *JVMHeapRuleConfig `protobuf:"bytes,16,opt,name=jvm_heap_rule,json=jvmHeapRule,proto3" json:"jvm_heap_rule,omitempty"` + // Per-rule override of the JVM CPU startup floor (millicores). See + // WorkloadRule.jvm_cpu_startup_floor_millicores for semantics. + JvmCpuStartupFloorMillicores *int64 `protobuf:"varint,17,opt,name=jvm_cpu_startup_floor_millicores,json=jvmCpuStartupFloorMillicores,proto3,oneof" json:"jvm_cpu_startup_floor_millicores,omitempty"` + // Rule-wide on/off switch. Only valid when creating a brand-new rule via + // UpsertManualWorkloadRule — the request is REJECTED with an error if this + // is set while updating an existing rule. Use ToggleWorkloadRuleDisabled + // to change an existing rule's disabled state. See WorkloadRule.disabled + // for runtime semantics. optional (not plain bool) so the server can tell + // "omitted" apart from "explicitly false" and enforce the create-only rule. + Disabled *bool `protobuf:"varint,18,opt,name=disabled,proto3,oneof" json:"disabled,omitempty"` + // Per-rule metrics lookback override. Unset inherits the owning policy's + // window, else the 7-day default. + LookbackPeriodSeconds *int32 `protobuf:"varint,19,opt,name=lookback_period_seconds,json=lookbackPeriodSeconds,proto3,oneof" json:"lookback_period_seconds,omitempty"` + // KEDA ScaledObject template authored by the user via the manual-rule form. + // Mirrors WorkloadRule.keda_scaled_object; written through by UpsertManualWorkloadRule. + // Field 20 is taken by main's allow_in_place_memory_limit_decrease (added on the + // main merge), so keda_scaled_object is 21. + KedaScaledObject *KEDAScaledObjectTemplate `protobuf:"bytes,21,opt,name=keda_scaled_object,json=kedaScaledObject,proto3,oneof" json:"keda_scaled_object,omitempty"` +} + +func (x *ManualRuleFields) Reset() { + *x = ManualRuleFields{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[450] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ManualRuleFields) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ManualRuleFields) ProtoMessage() {} + +func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[450] + 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 ManualRuleFields.ProtoReflect.Descriptor instead. +func (*ManualRuleFields) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{450} +} + +func (x *ManualRuleFields) GetCpuRule() *ResourceRuleConfig { + if x != nil { + return x.CpuRule + } + return nil +} + +func (x *ManualRuleFields) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *ManualRuleFields) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +func (x *ManualRuleFields) GetHpaRule() *HPARuleConfig { + if x != nil { + return x.HpaRule + } + return nil +} + +func (x *ManualRuleFields) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +func (x *ManualRuleFields) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *ManualRuleFields) GetStartupPeriodSeconds() int64 { + if x != nil && x.StartupPeriodSeconds != nil { + return *x.StartupPeriodSeconds + } + return 0 +} + +func (x *ManualRuleFields) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *ManualRuleFields) GetCooldownMinutes() int32 { + if x != nil && x.CooldownMinutes != nil { + return *x.CooldownMinutes + } + return 0 +} + +func (x *ManualRuleFields) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + return x.DetectionTriggers + } + return nil +} + +func (x *ManualRuleFields) GetSchedulerPlugins() []string { + if x != nil { + return x.SchedulerPlugins + } + return nil +} + +func (x *ManualRuleFields) GetDefragmentationSchedule() string { + if x != nil && x.DefragmentationSchedule != nil { + return *x.DefragmentationSchedule + } + return "" +} + +func (x *ManualRuleFields) GetLiveMigrationEnabled() bool { + if x != nil { + return x.LiveMigrationEnabled + } + return false +} + +func (x *ManualRuleFields) GetUseInPlaceVerticalScaling() bool { + if x != nil { + return x.UseInPlaceVerticalScaling + } + return false +} + +func (x *ManualRuleFields) GetAllowInPlaceMemoryLimitDecrease() bool { + if x != nil { + return x.AllowInPlaceMemoryLimitDecrease + } + return false +} + +func (x *ManualRuleFields) GetContainers() []*ContainerResourceRuleConfig { + if x != nil { + return x.Containers + } + return nil +} + +func (x *ManualRuleFields) GetJvmHeapRule() *JVMHeapRuleConfig { + if x != nil { + return x.JvmHeapRule + } + return nil +} + +func (x *ManualRuleFields) GetJvmCpuStartupFloorMillicores() int64 { + if x != nil && x.JvmCpuStartupFloorMillicores != nil { + return *x.JvmCpuStartupFloorMillicores + } + return 0 +} + +func (x *ManualRuleFields) GetDisabled() bool { + if x != nil && x.Disabled != nil { + return *x.Disabled + } + return false +} + +func (x *ManualRuleFields) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + return 0 +} + +func (x *ManualRuleFields) GetKedaScaledObject() *KEDAScaledObjectTemplate { + if x != nil { + return x.KedaScaledObject + } + return nil +} + +type UpsertManualWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + AutoGenerate bool `protobuf:"varint,6,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` + // Manual fields (only used when auto_generate = false). + Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` + // Optional: identifies which caller is upserting this rule. When unset, + // the server defaults to WORKLOAD_RULE_SOURCE_MANUAL (legacy UI behavior). + // External IaC providers (pulumi, terraform) MUST set this so the rule + // can be attributed in audit and UI surfaces. + Source WorkloadRuleSource `protobuf:"varint,11,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` +} + +func (x *UpsertManualWorkloadRuleRequest) Reset() { + *x = UpsertManualWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[451] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertManualWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertManualWorkloadRuleRequest) ProtoMessage() {} + +func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[451] + 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 UpsertManualWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*UpsertManualWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{451} +} + +func (x *UpsertManualWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpsertManualWorkloadRuleRequest) GetAutoGenerate() bool { + if x != nil { + return x.AutoGenerate + } + return false +} + +func (x *UpsertManualWorkloadRuleRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *UpsertManualWorkloadRuleRequest) GetSource() WorkloadRuleSource { + if x != nil { + return x.Source + } + return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED +} + +type UpsertManualWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *UpsertManualWorkloadRuleResponse) Reset() { + *x = UpsertManualWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[452] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertManualWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertManualWorkloadRuleResponse) ProtoMessage() {} + +func (x *UpsertManualWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[452] + 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 UpsertManualWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*UpsertManualWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{452} +} + +func (x *UpsertManualWorkloadRuleResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +// ToggleWorkloadRuleDisabled is the sole way to change an EXISTING rule's +// disabled state. UpsertManualWorkloadRule only honors ManualRuleFields.disabled +// when creating a brand-new rule; every other transition goes through here. +type ToggleWorkloadRuleDisabledRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + Disabled bool `protobuf:"varint,3,opt,name=disabled,proto3" json:"disabled,omitempty"` +} + +func (x *ToggleWorkloadRuleDisabledRequest) Reset() { + *x = ToggleWorkloadRuleDisabledRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[453] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadRuleDisabledRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadRuleDisabledRequest) ProtoMessage() {} + +func (x *ToggleWorkloadRuleDisabledRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[453] + 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 ToggleWorkloadRuleDisabledRequest.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadRuleDisabledRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{453} +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *ToggleWorkloadRuleDisabledRequest) GetDisabled() bool { + if x != nil { + return x.Disabled + } + return false +} + +type ToggleWorkloadRuleDisabledResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rule *WorkloadRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *ToggleWorkloadRuleDisabledResponse) Reset() { + *x = ToggleWorkloadRuleDisabledResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[454] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToggleWorkloadRuleDisabledResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToggleWorkloadRuleDisabledResponse) ProtoMessage() {} + +func (x *ToggleWorkloadRuleDisabledResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[454] + 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 ToggleWorkloadRuleDisabledResponse.ProtoReflect.Descriptor instead. +func (*ToggleWorkloadRuleDisabledResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{454} +} + +func (x *ToggleWorkloadRuleDisabledResponse) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +// PreviewWorkloadRuleRequest mirrors the upsert request but does not +// persist anything; returns a side-by-side preview instead. +type PreviewWorkloadRuleRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + // Required so the server can fetch the workload's profile (percentiles, + // behavior). The form already has uid for any existing workload. + WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,10,opt,name=fields,proto3" json:"fields,omitempty"` + // Optional. Set when this preview is being driven by a + // WorkloadOptimizationPolicy rather than a manual draft (e.g. the policy + // targeting preview's per-row rule detail) — applies the policy's + // operational overrides (currently just hpa_enabled=false, which can only + // disable HPA, never force it on — same clamp real rule generation + // applies) to the materialized pass. Has no effect on engine_projection. + PolicyId *string `protobuf:"bytes,11,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` +} + +func (x *PreviewWorkloadRuleRequest) Reset() { + *x = PreviewWorkloadRuleRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[455] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadRuleRequest) ProtoMessage() {} + +func (x *PreviewWorkloadRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[455] + 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 PreviewWorkloadRuleRequest.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadRuleRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{455} +} + +func (x *PreviewWorkloadRuleRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +func (x *PreviewWorkloadRuleRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *PreviewWorkloadRuleRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +type PreviewWorkloadRuleResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Materialized rule — engine output overlaid with the user's draft as + // constraints (engine's BaseRequest clamped to user's min/max, multipliers + // overridden, etc.). When `fields` is empty/missing, equals engine_projection. + // Same shape as a saved rule. + MaterializedRule *WorkloadRule `protobuf:"bytes,1,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` + // Engine projection — pure-engine recommendation (classification-driven, + // no user constraints). Stable benchmark; same maths Apply uses for auto. + // Empty when profile data is insufficient; see engine_projection_unavailable_reason. + EngineProjection *WorkloadRule `protobuf:"bytes,2,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` + // Observed profile (per-container percentiles, behavior, classification, + // currently configured resources). Same shape as GetWorkloadProfiles + // single-workload result. + Profile *WorkloadProfileResult `protobuf:"bytes,3,opt,name=profile,proto3" json:"profile,omitempty"` + // Set when the engine couldn't produce a projection (insufficient data, + // workload not yet emitting metrics, etc.). FE renders the materialized + // draft + observed view without an engine column. + EngineProjectionUnavailableReason string `protobuf:"bytes,4,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` + // The persisted DB rule for this workload. Null when no rule has been saved + // yet (create mode). Frontend fills ALL form fields directly from this when + // present; falls back to engine_projection for create-mode prefill. + // Engine suggestion chips always compare against engine_projection. + DbRule *WorkloadRule `protobuf:"bytes,5,opt,name=db_rule,json=dbRule,proto3" json:"db_rule,omitempty"` +} + +func (x *PreviewWorkloadRuleResponse) Reset() { + *x = PreviewWorkloadRuleResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[456] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewWorkloadRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewWorkloadRuleResponse) ProtoMessage() {} + +func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[456] + 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 PreviewWorkloadRuleResponse.ProtoReflect.Descriptor instead. +func (*PreviewWorkloadRuleResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{456} +} + +func (x *PreviewWorkloadRuleResponse) GetMaterializedRule() *WorkloadRule { + if x != nil { + return x.MaterializedRule + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetEngineProjection() *WorkloadRule { + if x != nil { + return x.EngineProjection + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetProfile() *WorkloadProfileResult { + if x != nil { + return x.Profile + } + return nil +} + +func (x *PreviewWorkloadRuleResponse) GetEngineProjectionUnavailableReason() string { + if x != nil { + return x.EngineProjectionUnavailableReason + } + return "" +} + +func (x *PreviewWorkloadRuleResponse) GetDbRule() *WorkloadRule { + if x != nil { + return x.DbRule + } + return nil +} + +type GetWorkloadContainerNamesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetWorkloadContainerNamesRequest) Reset() { + *x = GetWorkloadContainerNamesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[457] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerNamesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerNamesRequest) ProtoMessage() {} + +func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[457] + 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 GetWorkloadContainerNamesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerNamesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{457} +} + +func (x *GetWorkloadContainerNamesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *GetWorkloadContainerNamesRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetWorkloadContainerNamesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContainerNames []string `protobuf:"bytes,1,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` +} + +func (x *GetWorkloadContainerNamesResponse) Reset() { + *x = GetWorkloadContainerNamesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[458] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetWorkloadContainerNamesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadContainerNamesResponse) ProtoMessage() {} + +func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[458] + 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 GetWorkloadContainerNamesResponse.ProtoReflect.Descriptor instead. +func (*GetWorkloadContainerNamesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{458} +} + +func (x *GetWorkloadContainerNamesResponse) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +type BatchAutoOptimizeWorkload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *BatchAutoOptimizeWorkload) Reset() { + *x = BatchAutoOptimizeWorkload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[459] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkload) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[459] + 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 BatchAutoOptimizeWorkload.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{459} +} + +func (x *BatchAutoOptimizeWorkload) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchAutoOptimizeWorkload) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchAutoOptimizeWorkload) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type BatchAutoOptimizeWorkloadsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchAutoOptimizeWorkload `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadsRequest) Reset() { + *x = BatchAutoOptimizeWorkloadsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[460] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadsRequest) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[460] + 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 BatchAutoOptimizeWorkloadsRequest.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{460} +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadsRequest) GetWorkloads() []*BatchAutoOptimizeWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +type BatchAutoOptimizeWorkloadResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadResult) Reset() { + *x = BatchAutoOptimizeWorkloadResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[461] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadResult) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[461] + 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 BatchAutoOptimizeWorkloadResult.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{461} +} + +func (x *BatchAutoOptimizeWorkloadResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchAutoOptimizeWorkloadResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchAutoOptimizeWorkloadResult) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +type BatchAutoOptimizeWorkloadsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchAutoOptimizeWorkloadResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchAutoOptimizeWorkloadsResponse) Reset() { + *x = BatchAutoOptimizeWorkloadsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[462] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchAutoOptimizeWorkloadsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchAutoOptimizeWorkloadsResponse) ProtoMessage() {} + +func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[462] + 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 BatchAutoOptimizeWorkloadsResponse.ProtoReflect.Descriptor instead. +func (*BatchAutoOptimizeWorkloadsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{462} +} + +func (x *BatchAutoOptimizeWorkloadsResponse) GetResults() []*BatchAutoOptimizeWorkloadResult { + if x != nil { + return x.Results + } + return nil +} + +// Identifies a workload by namespace/kind/name. Shared by batch RPCs +// (BatchUpsertManualWorkloadRules, BatchPreviewWorkloadRules). +// workload_uid is only needed for preview (the profiling service uses it). +type BatchWorkloadEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + WorkloadUid *string `protobuf:"bytes,5,opt,name=workload_uid,json=workloadUid,proto3,oneof" json:"workload_uid,omitempty"` +} + +func (x *BatchWorkloadEntry) Reset() { + *x = BatchWorkloadEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[463] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchWorkloadEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchWorkloadEntry) ProtoMessage() {} + +func (x *BatchWorkloadEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[463] + 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 BatchWorkloadEntry.ProtoReflect.Descriptor instead. +func (*BatchWorkloadEntry) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{463} +} + +func (x *BatchWorkloadEntry) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchWorkloadEntry) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchWorkloadEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchWorkloadEntry) GetWorkloadUid() string { + if x != nil && x.WorkloadUid != nil { + return *x.WorkloadUid + } + return "" +} + +type BatchUpsertManualWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchWorkloadEntry `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + AutoGenerate bool `protobuf:"varint,4,opt,name=auto_generate,json=autoGenerate,proto3" json:"auto_generate,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,5,opt,name=fields,proto3" json:"fields,omitempty"` // shared across all workloads (only used when auto_generate=false) + Source WorkloadRuleSource `protobuf:"varint,6,opt,name=source,proto3,enum=api.v1.WorkloadRuleSource" json:"source,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRulesRequest) Reset() { + *x = BatchUpsertManualWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[464] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRulesRequest) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[464] + 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 BatchUpsertManualWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{464} +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetWorkloads() []*BatchWorkloadEntry { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetAutoGenerate() bool { + if x != nil { + return x.AutoGenerate + } + return false +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +func (x *BatchUpsertManualWorkloadRulesRequest) GetSource() WorkloadRuleSource { + if x != nil { + return x.Source + } + return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED +} + +type BatchUpsertManualWorkloadRuleResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + Rule *WorkloadRule `protobuf:"bytes,6,opt,name=rule,proto3" json:"rule,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRuleResult) Reset() { + *x = BatchUpsertManualWorkloadRuleResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[465] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRuleResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRuleResult) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRuleResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[465] + 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 BatchUpsertManualWorkloadRuleResult.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRuleResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{465} +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchUpsertManualWorkloadRuleResult) GetRule() *WorkloadRule { + if x != nil { + return x.Rule + } + return nil +} + +type BatchUpsertManualWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchUpsertManualWorkloadRuleResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchUpsertManualWorkloadRulesResponse) Reset() { + *x = BatchUpsertManualWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[466] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpsertManualWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpsertManualWorkloadRulesResponse) ProtoMessage() {} + +func (x *BatchUpsertManualWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[466] + 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 BatchUpsertManualWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BatchUpsertManualWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{466} +} + +func (x *BatchUpsertManualWorkloadRulesResponse) GetResults() []*BatchUpsertManualWorkloadRuleResult { + if x != nil { + return x.Results + } + return nil +} + +// Batch preview — applies the same ManualRuleFields to multiple workloads +// and returns per-workload previews without persisting anything. +type BatchPreviewWorkloadRulesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Workloads []*BatchWorkloadEntry `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` + Fields *ManualRuleFields `protobuf:"bytes,4,opt,name=fields,proto3" json:"fields,omitempty"` // shared across all workloads +} + +func (x *BatchPreviewWorkloadRulesRequest) Reset() { + *x = BatchPreviewWorkloadRulesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[467] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRulesRequest) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[467] + 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 BatchPreviewWorkloadRulesRequest.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRulesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{467} +} + +func (x *BatchPreviewWorkloadRulesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *BatchPreviewWorkloadRulesRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *BatchPreviewWorkloadRulesRequest) GetWorkloads() []*BatchWorkloadEntry { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *BatchPreviewWorkloadRulesRequest) GetFields() *ManualRuleFields { + if x != nil { + return x.Fields + } + return nil +} + +type BatchPreviewWorkloadRuleResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"` + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + MaterializedRule *WorkloadRule `protobuf:"bytes,6,opt,name=materialized_rule,json=materializedRule,proto3" json:"materialized_rule,omitempty"` + EngineProjection *WorkloadRule `protobuf:"bytes,7,opt,name=engine_projection,json=engineProjection,proto3" json:"engine_projection,omitempty"` + Profile *WorkloadProfileResult `protobuf:"bytes,8,opt,name=profile,proto3" json:"profile,omitempty"` + EngineProjectionUnavailableReason string `protobuf:"bytes,9,opt,name=engine_projection_unavailable_reason,json=engineProjectionUnavailableReason,proto3" json:"engine_projection_unavailable_reason,omitempty"` +} + +func (x *BatchPreviewWorkloadRuleResult) Reset() { + *x = BatchPreviewWorkloadRuleResult{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[468] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRuleResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRuleResult) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRuleResult) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[468] + 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 BatchPreviewWorkloadRuleResult.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRuleResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{468} +} + +func (x *BatchPreviewWorkloadRuleResult) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +func (x *BatchPreviewWorkloadRuleResult) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *BatchPreviewWorkloadRuleResult) GetMaterializedRule() *WorkloadRule { + if x != nil { + return x.MaterializedRule + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetEngineProjection() *WorkloadRule { + if x != nil { + return x.EngineProjection + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetProfile() *WorkloadProfileResult { + if x != nil { + return x.Profile + } + return nil +} + +func (x *BatchPreviewWorkloadRuleResult) GetEngineProjectionUnavailableReason() string { + if x != nil { + return x.EngineProjectionUnavailableReason + } + return "" +} + +type BatchPreviewWorkloadRulesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Results []*BatchPreviewWorkloadRuleResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` +} + +func (x *BatchPreviewWorkloadRulesResponse) Reset() { + *x = BatchPreviewWorkloadRulesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[469] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchPreviewWorkloadRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchPreviewWorkloadRulesResponse) ProtoMessage() {} + +func (x *BatchPreviewWorkloadRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[469] + 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 BatchPreviewWorkloadRulesResponse.ProtoReflect.Descriptor instead. +func (*BatchPreviewWorkloadRulesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{469} +} + +func (x *BatchPreviewWorkloadRulesResponse) GetResults() []*BatchPreviewWorkloadRuleResult { + if x != nil { + return x.Results + } + return nil +} + +// ApplyOneTimeOptimization runs the MPA v2 engine for a workload and immediately +// creates a WorkloadRecommendation (no WorkloadRule persisted). Only allowed when +// no WorkloadRule already exists for the workload — the frontend disables the +// button in edit mode to enforce this at the UI layer too. +type ApplyOneTimeOptimizationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + WorkloadUid string `protobuf:"bytes,6,opt,name=workload_uid,json=workloadUid,proto3" json:"workload_uid,omitempty"` +} + +func (x *ApplyOneTimeOptimizationRequest) Reset() { + *x = ApplyOneTimeOptimizationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[470] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApplyOneTimeOptimizationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyOneTimeOptimizationRequest) ProtoMessage() {} + +func (x *ApplyOneTimeOptimizationRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[470] + 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 ApplyOneTimeOptimizationRequest.ProtoReflect.Descriptor instead. +func (*ApplyOneTimeOptimizationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{470} +} + +func (x *ApplyOneTimeOptimizationRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ApplyOneTimeOptimizationRequest) GetWorkloadUid() string { + if x != nil { + return x.WorkloadUid + } + return "" +} + +type ApplyOneTimeOptimizationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ApplyOneTimeOptimizationResponse) Reset() { + *x = ApplyOneTimeOptimizationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[471] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ApplyOneTimeOptimizationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ApplyOneTimeOptimizationResponse) ProtoMessage() {} + +func (x *ApplyOneTimeOptimizationResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[471] + 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 ApplyOneTimeOptimizationResponse.ProtoReflect.Descriptor instead. +func (*ApplyOneTimeOptimizationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{471} +} + +// WorkloadProfileManifest is the authoritative key set for a single emit cycle +// of profile snapshots for a (cluster, window) pair. The server sends exactly +// one manifest followed by zero or more BatchWorkloadProfiles, all tagged with +// the same emit_id. The operator uses the manifest's keys to GC local +// WorkloadProfile CRs whose workload_uid is absent from `keys` once the emit +// cycle finalizes. +type WorkloadProfileManifest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + Keys []*ProfileKey `protobuf:"bytes,2,rep,name=keys,proto3" json:"keys,omitempty"` + IssuedAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=issued_at,json=issuedAt,proto3" json:"issued_at,omitempty"` + // emit_id is a UUID that identifies this emit cycle. Required. The operator + // buffers batches with a matching emit_id and finalizes the prior cycle + // when a manifest with a new emit_id arrives. + EmitId string `protobuf:"bytes,4,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` +} + +func (x *WorkloadProfileManifest) Reset() { + *x = WorkloadProfileManifest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[472] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadProfileManifest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadProfileManifest) ProtoMessage() {} + +func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[472] + 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 WorkloadProfileManifest.ProtoReflect.Descriptor instead. +func (*WorkloadProfileManifest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{472} +} + +func (x *WorkloadProfileManifest) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *WorkloadProfileManifest) GetKeys() []*ProfileKey { + if x != nil { + return x.Keys + } + return nil +} + +func (x *WorkloadProfileManifest) GetIssuedAt() *timestamppb.Timestamp { + if x != nil { + return x.IssuedAt + } + return nil +} + +func (x *WorkloadProfileManifest) GetEmitId() string { + if x != nil { + return x.EmitId + } + return "" +} + +// BatchWorkloadProfiles is a chunk of WorkloadProfileSnapshot values for a +// single emit cycle. Up to 128 profiles per batch. The emit_id MUST match the +// manifest's emit_id for the same cycle; operators discard batches whose +// emit_id does not match the currently-buffered cycle. +type BatchWorkloadProfiles struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Window ProfileWindow `protobuf:"varint,1,opt,name=window,proto3,enum=api.v1.ProfileWindow" json:"window,omitempty"` + Profiles []*WorkloadProfileSnapshot `protobuf:"bytes,2,rep,name=profiles,proto3" json:"profiles,omitempty"` + // emit_id matches the manifest emit_id for this cycle. Required. + EmitId string `protobuf:"bytes,3,opt,name=emit_id,json=emitId,proto3" json:"emit_id,omitempty"` +} + +func (x *BatchWorkloadProfiles) Reset() { + *x = BatchWorkloadProfiles{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[473] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchWorkloadProfiles) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchWorkloadProfiles) ProtoMessage() {} + +func (x *BatchWorkloadProfiles) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[473] + 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 BatchWorkloadProfiles.ProtoReflect.Descriptor instead. +func (*BatchWorkloadProfiles) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{473} +} + +func (x *BatchWorkloadProfiles) GetWindow() ProfileWindow { + if x != nil { + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *BatchWorkloadProfiles) GetProfiles() []*WorkloadProfileSnapshot { + if x != nil { + return x.Profiles + } + return nil +} + +func (x *BatchWorkloadProfiles) GetEmitId() string { + if x != nil { + return x.EmitId + } + return "" +} + +type NodeConfigApplyEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` +} + +func (x *NodeConfigApplyEvent) Reset() { + *x = NodeConfigApplyEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[474] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeConfigApplyEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeConfigApplyEvent) ProtoMessage() {} + +func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[474] + 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 NodeConfigApplyEvent.ProtoReflect.Descriptor instead. +func (*NodeConfigApplyEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{474} +} + +func (x *NodeConfigApplyEvent) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *NodeConfigApplyEvent) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *NodeConfigApplyEvent) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *NodeConfigApplyEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *NodeConfigApplyEvent) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + +type GetNodeRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + HistoryLimit int32 `protobuf:"varint,3,opt,name=history_limit,json=historyLimit,proto3" json:"history_limit,omitempty"` +} + +func (x *GetNodeRecommendationStatusRequest) Reset() { + *x = GetNodeRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[475] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[475] + 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 GetNodeRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetNodeRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{475} +} + +func (x *GetNodeRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetNodeRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetNodeRecommendationStatusRequest) GetHistoryLimit() int32 { + if x != nil { + return x.HistoryLimit + } + return 0 +} + +type GetNodeRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3" json:"current_config,omitempty"` + History []*NodeConfigApplyEvent `protobuf:"bytes,2,rep,name=history,proto3" json:"history,omitempty"` +} + +func (x *GetNodeRecommendationStatusResponse) Reset() { + *x = GetNodeRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[476] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNodeRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNodeRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[476] + 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 GetNodeRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetNodeRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{476} +} + +func (x *GetNodeRecommendationStatusResponse) GetCurrentConfig() *NodeRecommendationConfig { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetNodeRecommendationStatusResponse) GetHistory() []*NodeConfigApplyEvent { + if x != nil { + return x.History + } + return nil +} + +// EnableCheckpointForPolicyRequest is the orchestration request for the C/R +// toggle on a node policy. enabled=true sets dakr.devzero.io/checkpoint-node +// on the policy template AND enqueues per-node label patches for all live nodes +// in the policy's matched groups. enabled=false unsets the label and enqueues +// the corresponding unset patches. +type EnableCheckpointForPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *EnableCheckpointForPolicyRequest) Reset() { + *x = EnableCheckpointForPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[477] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableCheckpointForPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableCheckpointForPolicyRequest) ProtoMessage() {} + +func (x *EnableCheckpointForPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[477] + 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 EnableCheckpointForPolicyRequest.ProtoReflect.Descriptor instead. +func (*EnableCheckpointForPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{477} +} + +func (x *EnableCheckpointForPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *EnableCheckpointForPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *EnableCheckpointForPolicyRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +type EnableCheckpointForPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // UUID grouping the enqueued per-node patches; empty when no live nodes + // needed enqueueing (policy template still got patched). + BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` + EnqueuedNodes uint32 `protobuf:"varint,2,opt,name=enqueued_nodes,json=enqueuedNodes,proto3" json:"enqueued_nodes,omitempty"` + // cluster_ids whose live nodes were NOT enqueued because their dakr + // operator reports a version lower than MinVersionNodeLabelApply (the + // operator release carrying the Node `patch` RBAC verb + the + // dakr.devzero.io/* allowlist for SSA). The policy template was still + // patched for these clusters, so newly-provisioned nodes inherit the + // label via the NodePool template; existing nodes will be picked up the + // next time the user re-runs this action after the operator upgrade. + SkippedClusters []string `protobuf:"bytes,3,rep,name=skipped_clusters,json=skippedClusters,proto3" json:"skipped_clusters,omitempty"` +} + +func (x *EnableCheckpointForPolicyResponse) Reset() { + *x = EnableCheckpointForPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[478] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnableCheckpointForPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableCheckpointForPolicyResponse) ProtoMessage() {} + +func (x *EnableCheckpointForPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[478] + 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 EnableCheckpointForPolicyResponse.ProtoReflect.Descriptor instead. +func (*EnableCheckpointForPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{478} +} + +func (x *EnableCheckpointForPolicyResponse) GetBatchId() string { + if x != nil { + return x.BatchId + } + return "" +} + +func (x *EnableCheckpointForPolicyResponse) GetEnqueuedNodes() uint32 { + if x != nil { + return x.EnqueuedNodes + } + return 0 +} + +func (x *EnableCheckpointForPolicyResponse) GetSkippedClusters() []string { + if x != nil { + return x.SkippedClusters + } + return nil +} + +type GetCheckpointApplyStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *GetCheckpointApplyStatusRequest) Reset() { + *x = GetCheckpointApplyStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[479] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCheckpointApplyStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCheckpointApplyStatusRequest) ProtoMessage() {} + +func (x *GetCheckpointApplyStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[479] + 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 GetCheckpointApplyStatusRequest.ProtoReflect.Descriptor instead. +func (*GetCheckpointApplyStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{479} +} + +func (x *GetCheckpointApplyStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetCheckpointApplyStatusRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GetCheckpointApplyStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // batch_id of the most-recent EnableCheckpointForPolicy batch for the + // supplied policy, or empty when no batch exists yet. + BatchId string `protobuf:"bytes,1,opt,name=batch_id,json=batchId,proto3" json:"batch_id,omitempty"` + Pending uint32 `protobuf:"varint,2,opt,name=pending,proto3" json:"pending,omitempty"` + Applied uint32 `protobuf:"varint,3,opt,name=applied,proto3" json:"applied,omitempty"` + Failed uint32 `protobuf:"varint,4,opt,name=failed,proto3" json:"failed,omitempty"` + // rejected lumps every other terminal status (superseded, blocked, ignored, + // and the operator's Rejected) — the UI surfaces them collectively as "did + // not apply". + Rejected uint32 `protobuf:"varint,5,opt,name=rejected,proto3" json:"rejected,omitempty"` + Failures []*NodeApplyFailure `protobuf:"bytes,6,rep,name=failures,proto3" json:"failures,omitempty"` +} + +func (x *GetCheckpointApplyStatusResponse) Reset() { + *x = GetCheckpointApplyStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[480] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCheckpointApplyStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCheckpointApplyStatusResponse) ProtoMessage() {} + +func (x *GetCheckpointApplyStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[480] + 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 GetCheckpointApplyStatusResponse.ProtoReflect.Descriptor instead. +func (*GetCheckpointApplyStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{480} +} + +func (x *GetCheckpointApplyStatusResponse) GetBatchId() string { + if x != nil { + return x.BatchId + } + return "" +} + +func (x *GetCheckpointApplyStatusResponse) GetPending() uint32 { + if x != nil { + return x.Pending + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetApplied() uint32 { + if x != nil { + return x.Applied + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetFailed() uint32 { + if x != nil { + return x.Failed + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetRejected() uint32 { + if x != nil { + return x.Rejected + } + return 0 +} + +func (x *GetCheckpointApplyStatusResponse) GetFailures() []*NodeApplyFailure { + if x != nil { + return x.Failures + } + return nil +} + +type NodeApplyFailure struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *NodeApplyFailure) Reset() { + *x = NodeApplyFailure{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[481] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeApplyFailure) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeApplyFailure) ProtoMessage() {} + +func (x *NodeApplyFailure) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[481] + 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 NodeApplyFailure.ProtoReflect.Descriptor instead. +func (*NodeApplyFailure) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{481} +} + +func (x *NodeApplyFailure) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *NodeApplyFailure) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type GetClusterCheckpointLabelCoverageRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *GetClusterCheckpointLabelCoverageRequest) Reset() { + *x = GetClusterCheckpointLabelCoverageRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[482] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterCheckpointLabelCoverageRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterCheckpointLabelCoverageRequest) ProtoMessage() {} + +func (x *GetClusterCheckpointLabelCoverageRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[482] + 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 GetClusterCheckpointLabelCoverageRequest.ProtoReflect.Descriptor instead. +func (*GetClusterCheckpointLabelCoverageRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{482} +} + +func (x *GetClusterCheckpointLabelCoverageRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetClusterCheckpointLabelCoverageRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type NodeGroupCheckpointLabelCoverage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodePoolName string `protobuf:"bytes,1,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` + // total_nodes counts live nodes in the group whose node_group_name maps to + // a policy attached to this cluster via an enabled NodePolicyTarget. Nodes + // outside any policy's scope are excluded. + TotalNodes uint32 `protobuf:"varint,2,opt,name=total_nodes,json=totalNodes,proto3" json:"total_nodes,omitempty"` + LabeledNodes uint32 `protobuf:"varint,3,opt,name=labeled_nodes,json=labeledNodes,proto3" json:"labeled_nodes,omitempty"` + PendingNodes uint32 `protobuf:"varint,4,opt,name=pending_nodes,json=pendingNodes,proto3" json:"pending_nodes,omitempty"` + FailedNodes uint32 `protobuf:"varint,5,opt,name=failed_nodes,json=failedNodes,proto3" json:"failed_nodes,omitempty"` + // ready_nodes = label applied AND criu_configured AND agent heartbeat fresh + // (<5 min). Drives the "Active · X/Y ready" / "Awaiting runtime · X/Y ready" + // NG-row subtext. + ReadyNodes uint32 `protobuf:"varint,6,opt,name=ready_nodes,json=readyNodes,proto3" json:"ready_nodes,omitempty"` +} + +func (x *NodeGroupCheckpointLabelCoverage) Reset() { + *x = NodeGroupCheckpointLabelCoverage{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[483] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupCheckpointLabelCoverage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupCheckpointLabelCoverage) ProtoMessage() {} + +func (x *NodeGroupCheckpointLabelCoverage) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[483] + 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 NodeGroupCheckpointLabelCoverage.ProtoReflect.Descriptor instead. +func (*NodeGroupCheckpointLabelCoverage) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{483} +} + +func (x *NodeGroupCheckpointLabelCoverage) GetNodePoolName() string { + if x != nil { + return x.NodePoolName + } + return "" +} + +func (x *NodeGroupCheckpointLabelCoverage) GetTotalNodes() uint32 { + if x != nil { + return x.TotalNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetLabeledNodes() uint32 { + if x != nil { + return x.LabeledNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetPendingNodes() uint32 { + if x != nil { + return x.PendingNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetFailedNodes() uint32 { + if x != nil { + return x.FailedNodes + } + return 0 +} + +func (x *NodeGroupCheckpointLabelCoverage) GetReadyNodes() uint32 { + if x != nil { + return x.ReadyNodes + } + return 0 +} + +type GetClusterCheckpointLabelCoverageResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []*NodeGroupCheckpointLabelCoverage `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *GetClusterCheckpointLabelCoverageResponse) Reset() { + *x = GetClusterCheckpointLabelCoverageResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[484] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterCheckpointLabelCoverageResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterCheckpointLabelCoverageResponse) ProtoMessage() {} + +func (x *GetClusterCheckpointLabelCoverageResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[484] + 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 GetClusterCheckpointLabelCoverageResponse.ProtoReflect.Descriptor instead. +func (*GetClusterCheckpointLabelCoverageResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{484} +} + +func (x *GetClusterCheckpointLabelCoverageResponse) GetGroups() []*NodeGroupCheckpointLabelCoverage { + if x != nil { + return x.Groups + } + return nil +} + +type ListNodeGroupCheckpointLabelStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + NodePoolName string `protobuf:"bytes,3,opt,name=node_pool_name,json=nodePoolName,proto3" json:"node_pool_name,omitempty"` +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) Reset() { + *x = ListNodeGroupCheckpointLabelStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[485] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListNodeGroupCheckpointLabelStateRequest) ProtoMessage() {} + +func (x *ListNodeGroupCheckpointLabelStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[485] + 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 ListNodeGroupCheckpointLabelStateRequest.ProtoReflect.Descriptor instead. +func (*ListNodeGroupCheckpointLabelStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{485} +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListNodeGroupCheckpointLabelStateRequest) GetNodePoolName() string { + if x != nil { + return x.NodePoolName + } + return "" +} + +type NodeCheckpointLabelEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NodeName string `protobuf:"bytes,1,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` + HasLabel bool `protobuf:"varint,2,opt,name=has_label,json=hasLabel,proto3" json:"has_label,omitempty"` + LastApplyState NodeCheckpointLabelState `protobuf:"varint,3,opt,name=last_apply_state,json=lastApplyState,proto3,enum=api.v1.NodeCheckpointLabelState" json:"last_apply_state,omitempty"` + LastError string `protobuf:"bytes,4,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` + // criu_configured = dakr-operator's last probe found criu installed on this + // node. Pair with criu_heartbeat_fresh — a true value with a stale heartbeat + // is not trustworthy. + CriuConfigured bool `protobuf:"varint,5,opt,name=criu_configured,json=criuConfigured,proto3" json:"criu_configured,omitempty"` + // criu_heartbeat_fresh = agent_healths.last_ping_at within the last 5 min. + // FE renders "Active" only when has_label + criu_configured + this. + CriuHeartbeatFresh bool `protobuf:"varint,6,opt,name=criu_heartbeat_fresh,json=criuHeartbeatFresh,proto3" json:"criu_heartbeat_fresh,omitempty"` +} + +func (x *NodeCheckpointLabelEntry) Reset() { + *x = NodeCheckpointLabelEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[486] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeCheckpointLabelEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeCheckpointLabelEntry) ProtoMessage() {} + +func (x *NodeCheckpointLabelEntry) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[486] + 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 NodeCheckpointLabelEntry.ProtoReflect.Descriptor instead. +func (*NodeCheckpointLabelEntry) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{486} +} + +func (x *NodeCheckpointLabelEntry) GetNodeName() string { + if x != nil { + return x.NodeName + } + return "" +} + +func (x *NodeCheckpointLabelEntry) GetHasLabel() bool { + if x != nil { + return x.HasLabel + } + return false +} + +func (x *NodeCheckpointLabelEntry) GetLastApplyState() NodeCheckpointLabelState { + if x != nil { + return x.LastApplyState + } + return NodeCheckpointLabelState_NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED +} + +func (x *NodeCheckpointLabelEntry) GetLastError() string { + if x != nil { + return x.LastError + } + return "" +} + +func (x *NodeCheckpointLabelEntry) GetCriuConfigured() bool { + if x != nil { + return x.CriuConfigured + } + return false +} + +func (x *NodeCheckpointLabelEntry) GetCriuHeartbeatFresh() bool { + if x != nil { + return x.CriuHeartbeatFresh + } + return false +} + +type ListNodeGroupCheckpointLabelStateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodes []*NodeCheckpointLabelEntry `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) Reset() { + *x = ListNodeGroupCheckpointLabelStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[487] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListNodeGroupCheckpointLabelStateResponse) ProtoMessage() {} + +func (x *ListNodeGroupCheckpointLabelStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[487] + 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 ListNodeGroupCheckpointLabelStateResponse.ProtoReflect.Descriptor instead. +func (*ListNodeGroupCheckpointLabelStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{487} +} + +func (x *ListNodeGroupCheckpointLabelStateResponse) GetNodes() []*NodeCheckpointLabelEntry { + if x != nil { + return x.Nodes + } + return nil +} + +type SnapshotPercentBounds struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Upper *int32 `protobuf:"varint,1,opt,name=upper,proto3,oneof" json:"upper,omitempty"` + Lower *int32 `protobuf:"varint,2,opt,name=lower,proto3,oneof" json:"lower,omitempty"` +} + +func (x *SnapshotPercentBounds) Reset() { + *x = SnapshotPercentBounds{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[488] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPercentBounds) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPercentBounds) ProtoMessage() {} + +func (x *SnapshotPercentBounds) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[488] + 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 SnapshotPercentBounds.ProtoReflect.Descriptor instead. +func (*SnapshotPercentBounds) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{488} +} + +func (x *SnapshotPercentBounds) GetUpper() int32 { + if x != nil && x.Upper != nil { + return *x.Upper + } + return 0 +} + +func (x *SnapshotPercentBounds) GetLower() int32 { + if x != nil && x.Lower != nil { + return *x.Lower + } + return 0 +} + +type SnapshotResourceThreshold struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CpuPercent *SnapshotPercentBounds `protobuf:"bytes,1,opt,name=cpu_percent,json=cpuPercent,proto3,oneof" json:"cpu_percent,omitempty"` + MemoryPercent *SnapshotPercentBounds `protobuf:"bytes,2,opt,name=memory_percent,json=memoryPercent,proto3,oneof" json:"memory_percent,omitempty"` + PollIntervalSeconds *int32 `protobuf:"varint,3,opt,name=poll_interval_seconds,json=pollIntervalSeconds,proto3,oneof" json:"poll_interval_seconds,omitempty"` +} + +func (x *SnapshotResourceThreshold) Reset() { + *x = SnapshotResourceThreshold{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[489] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResourceThreshold) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResourceThreshold) ProtoMessage() {} + +func (x *SnapshotResourceThreshold) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[489] + 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 SnapshotResourceThreshold.ProtoReflect.Descriptor instead. +func (*SnapshotResourceThreshold) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{489} +} + +func (x *SnapshotResourceThreshold) GetCpuPercent() *SnapshotPercentBounds { + if x != nil { + return x.CpuPercent + } + return nil +} + +func (x *SnapshotResourceThreshold) GetMemoryPercent() *SnapshotPercentBounds { + if x != nil { + return x.MemoryPercent + } + return nil +} + +func (x *SnapshotResourceThreshold) GetPollIntervalSeconds() int32 { + if x != nil && x.PollIntervalSeconds != nil { + return *x.PollIntervalSeconds + } + return 0 +} + +// CheckpointSchedule behavior (triggers only — scope lives on the target). +type SnapshotSchedulePolicySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IntervalSeconds *int64 `protobuf:"varint,1,opt,name=interval_seconds,json=intervalSeconds,proto3,oneof" json:"interval_seconds,omitempty"` + ResourceThreshold *SnapshotResourceThreshold `protobuf:"bytes,2,opt,name=resource_threshold,json=resourceThreshold,proto3,oneof" json:"resource_threshold,omitempty"` + // Values: NodeDrain | PodEviction | Preemption (validated server-side; the CRD has no enum). + OnKubernetesEvents []string `protobuf:"bytes,3,rep,name=on_kubernetes_events,json=onKubernetesEvents,proto3" json:"on_kubernetes_events,omitempty"` + OnAnnotation bool `protobuf:"varint,4,opt,name=on_annotation,json=onAnnotation,proto3" json:"on_annotation,omitempty"` +} + +func (x *SnapshotSchedulePolicySpec) Reset() { + *x = SnapshotSchedulePolicySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[490] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotSchedulePolicySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotSchedulePolicySpec) ProtoMessage() {} + +func (x *SnapshotSchedulePolicySpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[490] + 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 SnapshotSchedulePolicySpec.ProtoReflect.Descriptor instead. +func (*SnapshotSchedulePolicySpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{490} +} + +func (x *SnapshotSchedulePolicySpec) GetIntervalSeconds() int64 { + if x != nil && x.IntervalSeconds != nil { + return *x.IntervalSeconds + } + return 0 +} + +func (x *SnapshotSchedulePolicySpec) GetResourceThreshold() *SnapshotResourceThreshold { + if x != nil { + return x.ResourceThreshold + } + return nil +} + +func (x *SnapshotSchedulePolicySpec) GetOnKubernetesEvents() []string { + if x != nil { + return x.OnKubernetesEvents + } + return nil +} + +func (x *SnapshotSchedulePolicySpec) GetOnAnnotation() bool { + if x != nil { + return x.OnAnnotation + } + return false +} + +type SnapshotGlobalRetention struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RetainOrphan *bool `protobuf:"varint,1,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpointsPerNamespace *int32 `protobuf:"varint,2,opt,name=max_checkpoints_per_namespace,json=maxCheckpointsPerNamespace,proto3,oneof" json:"max_checkpoints_per_namespace,omitempty"` + MaxCheckpointsPerPod *int32 `protobuf:"varint,3,opt,name=max_checkpoints_per_pod,json=maxCheckpointsPerPod,proto3,oneof" json:"max_checkpoints_per_pod,omitempty"` + MaxCheckpointsPerContainer *int32 `protobuf:"varint,4,opt,name=max_checkpoints_per_container,json=maxCheckpointsPerContainer,proto3,oneof" json:"max_checkpoints_per_container,omitempty"` + // Sizes are integer MB; the compiler renders them as "Mi" quantities. + MaxCheckpointSizeMb *int32 `protobuf:"varint,5,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizePerNamespaceMb *int32 `protobuf:"varint,6,opt,name=max_total_size_per_namespace_mb,json=maxTotalSizePerNamespaceMb,proto3,oneof" json:"max_total_size_per_namespace_mb,omitempty"` + MaxTotalSizePerPodMb *int32 `protobuf:"varint,7,opt,name=max_total_size_per_pod_mb,json=maxTotalSizePerPodMb,proto3,oneof" json:"max_total_size_per_pod_mb,omitempty"` + MaxTotalSizePerContainerMb *int32 `protobuf:"varint,8,opt,name=max_total_size_per_container_mb,json=maxTotalSizePerContainerMb,proto3,oneof" json:"max_total_size_per_container_mb,omitempty"` +} + +func (x *SnapshotGlobalRetention) Reset() { + *x = SnapshotGlobalRetention{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[491] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotGlobalRetention) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotGlobalRetention) ProtoMessage() {} + +func (x *SnapshotGlobalRetention) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[491] + 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 SnapshotGlobalRetention.ProtoReflect.Descriptor instead. +func (*SnapshotGlobalRetention) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{491} +} + +func (x *SnapshotGlobalRetention) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerNamespace() int32 { + if x != nil && x.MaxCheckpointsPerNamespace != nil { + return *x.MaxCheckpointsPerNamespace + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerPod() int32 { + if x != nil && x.MaxCheckpointsPerPod != nil { + return *x.MaxCheckpointsPerPod + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointsPerContainer() int32 { + if x != nil && x.MaxCheckpointsPerContainer != nil { + return *x.MaxCheckpointsPerContainer + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerNamespaceMb() int32 { + if x != nil && x.MaxTotalSizePerNamespaceMb != nil { + return *x.MaxTotalSizePerNamespaceMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerPodMb() int32 { + if x != nil && x.MaxTotalSizePerPodMb != nil { + return *x.MaxTotalSizePerPodMb + } + return 0 +} + +func (x *SnapshotGlobalRetention) GetMaxTotalSizePerContainerMb() int32 { + if x != nil && x.MaxTotalSizePerContainerMb != nil { + return *x.MaxTotalSizePerContainerMb + } + return 0 +} + +type SnapshotContainerRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Pod string `protobuf:"bytes,2,opt,name=pod,proto3" json:"pod,omitempty"` + Container string `protobuf:"bytes,3,opt,name=container,proto3" json:"container,omitempty"` + RetainOrphan *bool `protobuf:"varint,4,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,5,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,6,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,7,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotContainerRetentionPolicy) Reset() { + *x = SnapshotContainerRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[492] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotContainerRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotContainerRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotContainerRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[492] + 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 SnapshotContainerRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotContainerRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{492} +} + +func (x *SnapshotContainerRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetPod() string { + if x != nil { + return x.Pod + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetContainer() string { + if x != nil { + return x.Container + } + return "" +} + +func (x *SnapshotContainerRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotContainerRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +type SnapshotPodRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Pod string `protobuf:"bytes,2,opt,name=pod,proto3" json:"pod,omitempty"` + RetainOrphan *bool `protobuf:"varint,3,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,4,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,5,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,6,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotPodRetentionPolicy) Reset() { + *x = SnapshotPodRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[493] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPodRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPodRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotPodRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[493] + 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 SnapshotPodRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotPodRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{493} +} + +func (x *SnapshotPodRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotPodRetentionPolicy) GetPod() string { + if x != nil { + return x.Pod + } + return "" +} + +func (x *SnapshotPodRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotPodRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotPodRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotPodRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +type SnapshotNamespaceRetentionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + RetainOrphan *bool `protobuf:"varint,2,opt,name=retain_orphan,json=retainOrphan,proto3,oneof" json:"retain_orphan,omitempty"` + MaxCheckpoints *int32 `protobuf:"varint,3,opt,name=max_checkpoints,json=maxCheckpoints,proto3,oneof" json:"max_checkpoints,omitempty"` + MaxCheckpointSizeMb *int32 `protobuf:"varint,4,opt,name=max_checkpoint_size_mb,json=maxCheckpointSizeMb,proto3,oneof" json:"max_checkpoint_size_mb,omitempty"` + MaxTotalSizeMb *int32 `protobuf:"varint,5,opt,name=max_total_size_mb,json=maxTotalSizeMb,proto3,oneof" json:"max_total_size_mb,omitempty"` +} + +func (x *SnapshotNamespaceRetentionPolicy) Reset() { + *x = SnapshotNamespaceRetentionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[494] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotNamespaceRetentionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotNamespaceRetentionPolicy) ProtoMessage() {} + +func (x *SnapshotNamespaceRetentionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[494] + 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 SnapshotNamespaceRetentionPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotNamespaceRetentionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{494} +} + +func (x *SnapshotNamespaceRetentionPolicy) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotNamespaceRetentionPolicy) GetRetainOrphan() bool { + if x != nil && x.RetainOrphan != nil { + return *x.RetainOrphan + } + return false +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxCheckpoints() int32 { + if x != nil && x.MaxCheckpoints != nil { + return *x.MaxCheckpoints + } + return 0 +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxCheckpointSizeMb() int32 { + if x != nil && x.MaxCheckpointSizeMb != nil { + return *x.MaxCheckpointSizeMb + } + return 0 +} + +func (x *SnapshotNamespaceRetentionPolicy) GetMaxTotalSizeMb() int32 { + if x != nil && x.MaxTotalSizeMb != nil { + return *x.MaxTotalSizeMb + } + return 0 +} + +// CheckpointRestoreOperator behavior (cluster-wide retention/GC config). +type SnapshotRetentionPolicySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CheckpointDirectory string `protobuf:"bytes,1,opt,name=checkpoint_directory,json=checkpointDirectory,proto3" json:"checkpoint_directory,omitempty"` + ApplyPoliciesImmediately bool `protobuf:"varint,2,opt,name=apply_policies_immediately,json=applyPoliciesImmediately,proto3" json:"apply_policies_immediately,omitempty"` + GlobalRetention *SnapshotGlobalRetention `protobuf:"bytes,3,opt,name=global_retention,json=globalRetention,proto3,oneof" json:"global_retention,omitempty"` + ContainerPolicies []*SnapshotContainerRetentionPolicy `protobuf:"bytes,4,rep,name=container_policies,json=containerPolicies,proto3" json:"container_policies,omitempty"` + PodPolicies []*SnapshotPodRetentionPolicy `protobuf:"bytes,5,rep,name=pod_policies,json=podPolicies,proto3" json:"pod_policies,omitempty"` + NamespacePolicies []*SnapshotNamespaceRetentionPolicy `protobuf:"bytes,6,rep,name=namespace_policies,json=namespacePolicies,proto3" json:"namespace_policies,omitempty"` +} + +func (x *SnapshotRetentionPolicySpec) Reset() { + *x = SnapshotRetentionPolicySpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[495] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotRetentionPolicySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotRetentionPolicySpec) ProtoMessage() {} + +func (x *SnapshotRetentionPolicySpec) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[495] + 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 SnapshotRetentionPolicySpec.ProtoReflect.Descriptor instead. +func (*SnapshotRetentionPolicySpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{495} +} + +func (x *SnapshotRetentionPolicySpec) GetCheckpointDirectory() string { + if x != nil { + return x.CheckpointDirectory + } + return "" +} + +func (x *SnapshotRetentionPolicySpec) GetApplyPoliciesImmediately() bool { + if x != nil { + return x.ApplyPoliciesImmediately + } + return false +} + +func (x *SnapshotRetentionPolicySpec) GetGlobalRetention() *SnapshotGlobalRetention { + if x != nil { + return x.GlobalRetention + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetContainerPolicies() []*SnapshotContainerRetentionPolicy { + if x != nil { + return x.ContainerPolicies + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetPodPolicies() []*SnapshotPodRetentionPolicy { + if x != nil { + return x.PodPolicies + } + return nil +} + +func (x *SnapshotRetentionPolicySpec) GetNamespacePolicies() []*SnapshotNamespaceRetentionPolicy { + if x != nil { + return x.NamespacePolicies + } + return nil +} + +type SnapshotPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + // Types that are assignable to Spec: + // + // *SnapshotPolicy_Schedule + // *SnapshotPolicy_Retention + Spec isSnapshotPolicy_Spec `protobuf_oneof:"spec"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotPolicy) Reset() { + *x = SnapshotPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[496] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPolicy) ProtoMessage() {} + +func (x *SnapshotPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[496] + 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 SnapshotPolicy.ProtoReflect.Descriptor instead. +func (*SnapshotPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{496} +} + +func (x *SnapshotPolicy) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotPolicy) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SnapshotPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (m *SnapshotPolicy) GetSpec() isSnapshotPolicy_Spec { + if m != nil { + return m.Spec + } + return nil +} + +func (x *SnapshotPolicy) GetSchedule() *SnapshotSchedulePolicySpec { + if x, ok := x.GetSpec().(*SnapshotPolicy_Schedule); ok { + return x.Schedule + } + return nil +} + +func (x *SnapshotPolicy) GetRetention() *SnapshotRetentionPolicySpec { + if x, ok := x.GetSpec().(*SnapshotPolicy_Retention); ok { + return x.Retention + } + return nil +} + +func (x *SnapshotPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type isSnapshotPolicy_Spec interface { + isSnapshotPolicy_Spec() +} + +type SnapshotPolicy_Schedule struct { + Schedule *SnapshotSchedulePolicySpec `protobuf:"bytes,11,opt,name=schedule,proto3,oneof"` +} + +type SnapshotPolicy_Retention struct { + Retention *SnapshotRetentionPolicySpec `protobuf:"bytes,12,opt,name=retention,proto3,oneof"` +} + +func (*SnapshotPolicy_Schedule) isSnapshotPolicy_Spec() {} + +func (*SnapshotPolicy_Retention) isSnapshotPolicy_Spec() {} + +type ForensicSnapshotPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PolicyId string `protobuf:"bytes,1,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + IntervalSeconds *int64 `protobuf:"varint,11,opt,name=interval_seconds,json=intervalSeconds,proto3,oneof" json:"interval_seconds,omitempty"` + MaxSnapshots *int32 `protobuf:"varint,12,opt,name=max_snapshots,json=maxSnapshots,proto3,oneof" json:"max_snapshots,omitempty"` + MaxDurationSeconds *int64 `protobuf:"varint,13,opt,name=max_duration_seconds,json=maxDurationSeconds,proto3,oneof" json:"max_duration_seconds,omitempty"` + HashAlgorithm string `protobuf:"bytes,14,opt,name=hash_algorithm,json=hashAlgorithm,proto3" json:"hash_algorithm,omitempty"` + PostSnapshotAction ForensicPostSnapshotAction `protobuf:"varint,15,opt,name=post_snapshot_action,json=postSnapshotAction,proto3,enum=api.v1.ForensicPostSnapshotAction" json:"post_snapshot_action,omitempty"` + // Read-only: 0 = never triggered. Mutable only via + // TriggerForensicSnapshotRun. Create rejects non-zero values; Update + // ignores the field entirely (round-tripped entities carry it). + RunGeneration int32 `protobuf:"varint,16,opt,name=run_generation,json=runGeneration,proto3" json:"run_generation,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *ForensicSnapshotPolicy) Reset() { + *x = ForensicSnapshotPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[497] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicSnapshotPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicSnapshotPolicy) ProtoMessage() {} + +func (x *ForensicSnapshotPolicy) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[497] + 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 ForensicSnapshotPolicy.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{497} +} + +func (x *ForensicSnapshotPolicy) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetIntervalSeconds() int64 { + if x != nil && x.IntervalSeconds != nil { + return *x.IntervalSeconds + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetMaxSnapshots() int32 { + if x != nil && x.MaxSnapshots != nil { + return *x.MaxSnapshots + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetMaxDurationSeconds() int64 { + if x != nil && x.MaxDurationSeconds != nil { + return *x.MaxDurationSeconds + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetHashAlgorithm() string { + if x != nil { + return x.HashAlgorithm + } + return "" +} + +func (x *ForensicSnapshotPolicy) GetPostSnapshotAction() ForensicPostSnapshotAction { + if x != nil { + return x.PostSnapshotAction + } + return ForensicPostSnapshotAction_FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED +} + +func (x *ForensicSnapshotPolicy) GetRunGeneration() int32 { + if x != nil { + return x.RunGeneration + } + return 0 +} + +func (x *ForensicSnapshotPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +// Scope shared by both target families. Non-nil criteria combine with AND. +// Empty cluster_ids = NO clusters (deliberately inverted from WorkloadPolicyTarget). +type SnapshotTargetScope struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterIds []string `protobuf:"bytes,1,rep,name=cluster_ids,json=clusterIds,proto3" json:"cluster_ids,omitempty"` + Namespaces []string `protobuf:"bytes,11,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + NamespaceSelector *LabelSelector `protobuf:"bytes,12,opt,name=namespace_selector,json=namespaceSelector,proto3,oneof" json:"namespace_selector,omitempty"` + NamespacePattern *RegexPattern `protobuf:"bytes,13,opt,name=namespace_pattern,json=namespacePattern,proto3,oneof" json:"namespace_pattern,omitempty"` + WorkloadSelector *LabelSelector `protobuf:"bytes,14,opt,name=workload_selector,json=workloadSelector,proto3,oneof" json:"workload_selector,omitempty"` + AnnotationSelector *LabelSelector `protobuf:"bytes,15,opt,name=annotation_selector,json=annotationSelector,proto3,oneof" json:"annotation_selector,omitempty"` + WorkloadNames []string `protobuf:"bytes,16,rep,name=workload_names,json=workloadNames,proto3" json:"workload_names,omitempty"` + NamePattern *RegexPattern `protobuf:"bytes,17,opt,name=name_pattern,json=namePattern,proto3,oneof" json:"name_pattern,omitempty"` + KindFilter []K8SObjectKind `protobuf:"varint,18,rep,packed,name=kind_filter,json=kindFilter,proto3,enum=api.v1.K8SObjectKind" json:"kind_filter,omitempty"` + NodeGroupNames []string `protobuf:"bytes,19,rep,name=node_group_names,json=nodeGroupNames,proto3" json:"node_group_names,omitempty"` + // Passed verbatim into the CR's spec.selector; operators restricted to + // In/NotIn/Exists/DoesNotExist (validated server-side). + PodSelector *LabelSelector `protobuf:"bytes,21,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` + ContainerNames []string `protobuf:"bytes,22,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` +} + +func (x *SnapshotTargetScope) Reset() { + *x = SnapshotTargetScope{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[498] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotTargetScope) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotTargetScope) ProtoMessage() {} + +func (x *SnapshotTargetScope) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[498] + 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 SnapshotTargetScope.ProtoReflect.Descriptor instead. +func (*SnapshotTargetScope) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{498} +} + +func (x *SnapshotTargetScope) GetClusterIds() []string { + if x != nil { + return x.ClusterIds + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespaces() []string { + if x != nil { + return x.Namespaces + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern + } + return nil +} + +func (x *SnapshotTargetScope) GetWorkloadSelector() *LabelSelector { + if x != nil { + return x.WorkloadSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetAnnotationSelector() *LabelSelector { + if x != nil { + return x.AnnotationSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetWorkloadNames() []string { + if x != nil { + return x.WorkloadNames + } + return nil +} + +func (x *SnapshotTargetScope) GetNamePattern() *RegexPattern { + if x != nil { + return x.NamePattern + } + return nil +} + +func (x *SnapshotTargetScope) GetKindFilter() []K8SObjectKind { + if x != nil { + return x.KindFilter + } + return nil +} + +func (x *SnapshotTargetScope) GetNodeGroupNames() []string { + if x != nil { + return x.NodeGroupNames + } + return nil +} + +func (x *SnapshotTargetScope) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotTargetScope) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +// NOTE: the spec's target-level runtime `status` field (§8) is deliberately +// absent — phase 6 (status ingestion) adds it as a backward-compatible field +// at tag 120, mirroring NodePolicyTarget.status. +type SnapshotPolicyTarget struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,11,opt,name=scope,proto3" json:"scope,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Ingested runtime status of the target's compiled CRs (spec §8). + // Populated by ListSnapshotPolicyTargets; unset when nothing ingested. + Status *SnapshotPolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SnapshotPolicyTarget) Reset() { + *x = SnapshotPolicyTarget{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[499] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotPolicyTarget) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotPolicyTarget) ProtoMessage() {} + +func (x *SnapshotPolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[499] + 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 SnapshotPolicyTarget.ProtoReflect.Descriptor instead. +func (*SnapshotPolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{499} +} + +func (x *SnapshotPolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *SnapshotPolicyTarget) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotPolicyTarget) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SnapshotPolicyTarget) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *SnapshotPolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *SnapshotPolicyTarget) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *SnapshotPolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotPolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *SnapshotPolicyTarget) GetStatus() *SnapshotPolicyTargetStatus { + if x != nil { + return x.Status + } + return nil +} + +type ForensicSnapshotPolicyTarget struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TeamId string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,11,opt,name=scope,proto3" json:"scope,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Ingested runtime status of the target's compiled chain CRs (spec §8). + Status *SnapshotPolicyTargetStatus `protobuf:"bytes,120,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *ForensicSnapshotPolicyTarget) Reset() { + *x = ForensicSnapshotPolicyTarget{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[500] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicSnapshotPolicyTarget) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicSnapshotPolicyTarget) ProtoMessage() {} + +func (x *ForensicSnapshotPolicyTarget) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[500] + 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 ForensicSnapshotPolicyTarget.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotPolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{500} +} + +func (x *ForensicSnapshotPolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ForensicSnapshotPolicyTarget) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +func (x *ForensicSnapshotPolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *ForensicSnapshotPolicyTarget) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +func (x *ForensicSnapshotPolicyTarget) GetStatus() *SnapshotPolicyTargetStatus { + if x != nil { + return x.Status + } + return nil +} + +// ---- CRUD: snapshot policies ---- +type CreateSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*SnapshotPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` // policy_id/timestamps ignored +} + +func (x *CreateSnapshotPoliciesRequest) Reset() { + *x = CreateSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[501] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *CreateSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[501] + 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 CreateSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{501} +} + +func (x *CreateSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSnapshotPoliciesRequest) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type CreateSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateSnapshotPoliciesResponse) Reset() { + *x = CreateSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[502] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *CreateSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[502] + 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 CreateSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{502} +} + +func (x *CreateSnapshotPoliciesResponse) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type ListSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListSnapshotPoliciesRequest) Reset() { + *x = ListSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[503] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *ListSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[503] + 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 ListSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{503} +} + +func (x *ListSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSnapshotPoliciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListSnapshotPoliciesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*SnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListSnapshotPoliciesResponse) Reset() { + *x = ListSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[504] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *ListSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[504] + 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 ListSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{504} +} + +func (x *ListSnapshotPoliciesResponse) GetPolicies() []*SnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *ListSnapshotPoliciesResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *SnapshotPolicy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSnapshotPolicyRequest) Reset() { + *x = UpdateSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[505] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyRequest) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[505] + 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 UpdateSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{505} +} + +func (x *UpdateSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSnapshotPolicyRequest) GetPolicy() *SnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *SnapshotPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateSnapshotPolicyResponse) Reset() { + *x = UpdateSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[506] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyResponse) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[506] + 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 UpdateSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{506} +} + +func (x *UpdateSnapshotPolicyResponse) GetPolicy() *SnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *DeleteSnapshotPolicyRequest) Reset() { + *x = DeleteSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[507] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyRequest) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[507] + 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 DeleteSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{507} +} + +func (x *DeleteSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSnapshotPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteSnapshotPolicyResponse) Reset() { + *x = DeleteSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[508] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyResponse) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[508] + 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 DeleteSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{508} +} + +func (x *DeleteSnapshotPolicyResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- CRUD: snapshot policy targets ---- +type CreateSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Targets []*SnapshotPolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` // target_id/timestamps ignored +} + +func (x *CreateSnapshotPolicyTargetsRequest) Reset() { + *x = CreateSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[509] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *CreateSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[509] + 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 CreateSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{509} +} + +func (x *CreateSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateSnapshotPolicyTargetsRequest) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type CreateSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*SnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateSnapshotPolicyTargetsResponse) Reset() { + *x = CreateSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[510] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *CreateSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[510] + 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 CreateSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{510} +} + +func (x *CreateSnapshotPolicyTargetsResponse) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type ListSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListSnapshotPolicyTargetsRequest) Reset() { + *x = ListSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[511] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *ListSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[511] + 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 ListSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{511} +} + +func (x *ListSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListSnapshotPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *ListSnapshotPolicyTargetsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListSnapshotPolicyTargetsRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*SnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListSnapshotPolicyTargetsResponse) Reset() { + *x = ListSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[512] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *ListSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[512] + 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 ListSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{512} +} + +func (x *ListSnapshotPolicyTargetsResponse) GetTargets() []*SnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +func (x *ListSnapshotPolicyTargetsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Target *SnapshotPolicyTarget `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateSnapshotPolicyTargetRequest) Reset() { + *x = UpdateSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[513] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[513] + 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 UpdateSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{513} +} + +func (x *UpdateSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateSnapshotPolicyTargetRequest) GetTarget() *SnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *SnapshotPolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateSnapshotPolicyTargetResponse) Reset() { + *x = UpdateSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[514] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *UpdateSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[514] + 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 UpdateSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{514} +} + +func (x *UpdateSnapshotPolicyTargetResponse) GetTarget() *SnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type DeleteSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TargetIds []string `protobuf:"bytes,2,rep,name=target_ids,json=targetIds,proto3" json:"target_ids,omitempty"` +} + +func (x *DeleteSnapshotPolicyTargetRequest) Reset() { + *x = DeleteSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[515] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[515] + 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 DeleteSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{515} +} + +func (x *DeleteSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteSnapshotPolicyTargetRequest) GetTargetIds() []string { + if x != nil { + return x.TargetIds + } + return nil +} + +type DeleteSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteSnapshotPolicyTargetResponse) Reset() { + *x = DeleteSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[516] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *DeleteSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[516] + 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 DeleteSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{516} +} + +func (x *DeleteSnapshotPolicyTargetResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- CRUD: forensic snapshot policies + targets (mirrors above) ---- +type CreateForensicSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,2,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateForensicSnapshotPoliciesRequest) Reset() { + *x = CreateForensicSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[517] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *CreateForensicSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[517] + 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 CreateForensicSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{517} +} + +func (x *CreateForensicSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateForensicSnapshotPoliciesRequest) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type CreateForensicSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` +} + +func (x *CreateForensicSnapshotPoliciesResponse) Reset() { + *x = CreateForensicSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[518] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *CreateForensicSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[518] + 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 CreateForensicSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{518} +} + +func (x *CreateForensicSnapshotPoliciesResponse) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +type ListForensicSnapshotPoliciesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,3,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListForensicSnapshotPoliciesRequest) Reset() { + *x = ListForensicSnapshotPoliciesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[519] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPoliciesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPoliciesRequest) ProtoMessage() {} + +func (x *ListForensicSnapshotPoliciesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[519] + 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 ListForensicSnapshotPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{519} +} + +func (x *ListForensicSnapshotPoliciesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListForensicSnapshotPoliciesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListForensicSnapshotPoliciesRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListForensicSnapshotPoliciesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policies []*ForensicSnapshotPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListForensicSnapshotPoliciesResponse) Reset() { + *x = ListForensicSnapshotPoliciesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[520] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPoliciesResponse) ProtoMessage() {} + +func (x *ListForensicSnapshotPoliciesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[520] + 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 ListForensicSnapshotPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{520} +} + +func (x *ListForensicSnapshotPoliciesResponse) GetPolicies() []*ForensicSnapshotPolicy { + if x != nil { + return x.Policies + } + return nil +} + +func (x *ListForensicSnapshotPoliciesResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateForensicSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Policy *ForensicSnapshotPolicy `protobuf:"bytes,2,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyRequest) Reset() { + *x = UpdateForensicSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[521] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyRequest) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[521] + 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 UpdateForensicSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{521} +} + +func (x *UpdateForensicSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateForensicSnapshotPolicyRequest) GetPolicy() *ForensicSnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type UpdateForensicSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *ForensicSnapshotPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyResponse) Reset() { + *x = UpdateForensicSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[522] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyResponse) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[522] + 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 UpdateForensicSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{522} +} + +func (x *UpdateForensicSnapshotPolicyResponse) GetPolicy() *ForensicSnapshotPolicy { + if x != nil { + return x.Policy + } + return nil +} + +type DeleteForensicSnapshotPolicyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyRequest) Reset() { + *x = DeleteForensicSnapshotPolicyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[523] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyRequest) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[523] + 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 DeleteForensicSnapshotPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{523} +} + +func (x *DeleteForensicSnapshotPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteForensicSnapshotPolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteForensicSnapshotPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyResponse) Reset() { + *x = DeleteForensicSnapshotPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[524] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyResponse) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[524] + 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 DeleteForensicSnapshotPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{524} +} + +func (x *DeleteForensicSnapshotPolicyResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +type CreateForensicSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) Reset() { + *x = CreateForensicSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[525] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[525] + 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 CreateForensicSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{525} +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *CreateForensicSnapshotPolicyTargetsRequest) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type CreateForensicSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) Reset() { + *x = CreateForensicSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[526] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateForensicSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[526] + 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 CreateForensicSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateForensicSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{526} +} + +func (x *CreateForensicSnapshotPolicyTargetsResponse) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +type ListForensicSnapshotPolicyTargetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId *string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3,oneof" json:"policy_id,omitempty"` + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,4,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) Reset() { + *x = ListForensicSnapshotPolicyTargetsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[527] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPolicyTargetsRequest) ProtoMessage() {} + +func (x *ListForensicSnapshotPolicyTargetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[527] + 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 ListForensicSnapshotPolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{527} +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetPolicyId() string { + if x != nil && x.PolicyId != nil { + return *x.PolicyId + } + return "" +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListForensicSnapshotPolicyTargetsRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type ListForensicSnapshotPolicyTargetsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Targets []*ForensicSnapshotPolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) Reset() { + *x = ListForensicSnapshotPolicyTargetsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[528] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListForensicSnapshotPolicyTargetsResponse) ProtoMessage() {} + +func (x *ListForensicSnapshotPolicyTargetsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[528] + 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 ListForensicSnapshotPolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListForensicSnapshotPolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{528} +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) GetTargets() []*ForensicSnapshotPolicyTarget { + if x != nil { + return x.Targets + } + return nil +} + +func (x *ListForensicSnapshotPolicyTargetsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type UpdateForensicSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Target *ForensicSnapshotPolicyTarget `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) Reset() { + *x = UpdateForensicSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[529] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[529] + 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 UpdateForensicSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{529} +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *UpdateForensicSnapshotPolicyTargetRequest) GetTarget() *ForensicSnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateForensicSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Target *ForensicSnapshotPolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) Reset() { + *x = UpdateForensicSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[530] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateForensicSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[530] + 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 UpdateForensicSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateForensicSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{530} +} + +func (x *UpdateForensicSnapshotPolicyTargetResponse) GetTarget() *ForensicSnapshotPolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type DeleteForensicSnapshotPolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + TargetIds []string `protobuf:"bytes,2,rep,name=target_ids,json=targetIds,proto3" json:"target_ids,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) Reset() { + *x = DeleteForensicSnapshotPolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[531] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyTargetRequest) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[531] + 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 DeleteForensicSnapshotPolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{531} +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *DeleteForensicSnapshotPolicyTargetRequest) GetTargetIds() []string { + if x != nil { + return x.TargetIds + } + return nil +} + +type DeleteForensicSnapshotPolicyTargetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) Reset() { + *x = DeleteForensicSnapshotPolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[532] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteForensicSnapshotPolicyTargetResponse) ProtoMessage() {} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[532] + 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 DeleteForensicSnapshotPolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteForensicSnapshotPolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{532} +} + +func (x *DeleteForensicSnapshotPolicyTargetResponse) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// ---- Forensic run trigger ---- +type TriggerForensicSnapshotRunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` +} + +func (x *TriggerForensicSnapshotRunRequest) Reset() { + *x = TriggerForensicSnapshotRunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[533] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TriggerForensicSnapshotRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TriggerForensicSnapshotRunRequest) ProtoMessage() {} + +func (x *TriggerForensicSnapshotRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[533] + 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 TriggerForensicSnapshotRunRequest.ProtoReflect.Descriptor instead. +func (*TriggerForensicSnapshotRunRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{533} +} + +func (x *TriggerForensicSnapshotRunRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *TriggerForensicSnapshotRunRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type TriggerForensicSnapshotRunResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunGeneration int32 `protobuf:"varint,1,opt,name=run_generation,json=runGeneration,proto3" json:"run_generation,omitempty"` +} + +func (x *TriggerForensicSnapshotRunResponse) Reset() { + *x = TriggerForensicSnapshotRunResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[534] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TriggerForensicSnapshotRunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TriggerForensicSnapshotRunResponse) ProtoMessage() {} + +func (x *TriggerForensicSnapshotRunResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[534] + 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 TriggerForensicSnapshotRunResponse.ProtoReflect.Descriptor instead. +func (*TriggerForensicSnapshotRunResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{534} +} + +func (x *TriggerForensicSnapshotRunResponse) GetRunGeneration() int32 { + if x != nil { + return x.RunGeneration + } + return 0 +} + +// ---- Targeting preview (shared resolver, spec §6) ---- +type SnapshotResolvedWorkload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind K8SObjectKind `protobuf:"varint,1,opt,name=kind,proto3,enum=api.v1.K8SObjectKind" json:"kind,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` + PodSelector *LabelSelector `protobuf:"bytes,4,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` // from the workload's pod template + // Summed container resource requests + replicas from the workload spec, + // for the preview's workload table. Zero when the kind has no typed spec + // (Pod, CRDs) or the field is absent (DaemonSet/Job have no replica count). + Replicas int32 `protobuf:"varint,5,opt,name=replicas,proto3" json:"replicas,omitempty"` + CpuRequestMillicores int64 `protobuf:"varint,6,opt,name=cpu_request_millicores,json=cpuRequestMillicores,proto3" json:"cpu_request_millicores,omitempty"` + MemoryRequestBytes int64 `protobuf:"varint,7,opt,name=memory_request_bytes,json=memoryRequestBytes,proto3" json:"memory_request_bytes,omitempty"` +} + +func (x *SnapshotResolvedWorkload) Reset() { + *x = SnapshotResolvedWorkload{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[535] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResolvedWorkload) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResolvedWorkload) ProtoMessage() {} + +func (x *SnapshotResolvedWorkload) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[535] + 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 SnapshotResolvedWorkload.ProtoReflect.Descriptor instead. +func (*SnapshotResolvedWorkload) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{535} +} + +func (x *SnapshotResolvedWorkload) GetKind() K8SObjectKind { + if x != nil { + return x.Kind + } + return K8SObjectKind_K8S_OBJECT_KIND_UNSPECIFIED +} + +func (x *SnapshotResolvedWorkload) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SnapshotResolvedWorkload) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + +func (x *SnapshotResolvedWorkload) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotResolvedWorkload) GetReplicas() int32 { + if x != nil { + return x.Replicas + } + return 0 +} + +func (x *SnapshotResolvedWorkload) GetCpuRequestMillicores() int64 { + if x != nil { + return x.CpuRequestMillicores + } + return 0 +} + +func (x *SnapshotResolvedWorkload) GetMemoryRequestBytes() int64 { + if x != nil { + return x.MemoryRequestBytes + } + return 0 +} + +type SnapshotResolvedNamespace struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + // Present only when workload-scope criteria were used; empty for + // pod_selector-passthrough targets. + Workloads []*SnapshotResolvedWorkload `protobuf:"bytes,2,rep,name=workloads,proto3" json:"workloads,omitempty"` + PodSelectorPassthrough bool `protobuf:"varint,3,opt,name=pod_selector_passthrough,json=podSelectorPassthrough,proto3" json:"pod_selector_passthrough,omitempty"` +} + +func (x *SnapshotResolvedNamespace) Reset() { + *x = SnapshotResolvedNamespace{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[536] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotResolvedNamespace) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotResolvedNamespace) ProtoMessage() {} + +func (x *SnapshotResolvedNamespace) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[536] + 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 SnapshotResolvedNamespace.ProtoReflect.Descriptor instead. +func (*SnapshotResolvedNamespace) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{536} +} + +func (x *SnapshotResolvedNamespace) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotResolvedNamespace) GetWorkloads() []*SnapshotResolvedWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *SnapshotResolvedNamespace) GetPodSelectorPassthrough() bool { + if x != nil { + return x.PodSelectorPassthrough + } + return false +} + +type SnapshotClusterScopePreview struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespaces []*SnapshotResolvedNamespace `protobuf:"bytes,2,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + Truncated bool `protobuf:"varint,3,opt,name=truncated,proto3" json:"truncated,omitempty"` // fan-out cap hit (spec §6) + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` // per-cluster resolution error (cluster missing, etc.) +} + +func (x *SnapshotClusterScopePreview) Reset() { + *x = SnapshotClusterScopePreview{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[537] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotClusterScopePreview) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotClusterScopePreview) ProtoMessage() {} + +func (x *SnapshotClusterScopePreview) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[537] + 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 SnapshotClusterScopePreview.ProtoReflect.Descriptor instead. +func (*SnapshotClusterScopePreview) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{537} +} + +func (x *SnapshotClusterScopePreview) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotClusterScopePreview) GetNamespaces() []*SnapshotResolvedNamespace { + if x != nil { + return x.Namespaces + } + return nil +} + +func (x *SnapshotClusterScopePreview) GetTruncated() bool { + if x != nil { + return x.Truncated + } + return false +} + +func (x *SnapshotClusterScopePreview) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type PreviewSnapshotPolicyTargetMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"` // unsaved target scope +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) Reset() { + *x = PreviewSnapshotPolicyTargetMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[538] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotPolicyTargetMatchesRequest) ProtoMessage() {} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[538] + 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 PreviewSnapshotPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{538} +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSnapshotPolicyTargetMatchesRequest) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +type PreviewSnapshotPolicyTargetMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*SnapshotClusterScopePreview `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) Reset() { + *x = PreviewSnapshotPolicyTargetMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[539] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotPolicyTargetMatchesResponse) ProtoMessage() {} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[539] + 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 PreviewSnapshotPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{539} +} + +func (x *PreviewSnapshotPolicyTargetMatchesResponse) GetClusters() []*SnapshotClusterScopePreview { + if x != nil { + return x.Clusters + } + return nil +} + +type ForensicTargetOverlap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TargetId string `protobuf:"bytes,1,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + WorkloadUids []string `protobuf:"bytes,5,rep,name=workload_uids,json=workloadUids,proto3" json:"workload_uids,omitempty"` +} + +func (x *ForensicTargetOverlap) Reset() { + *x = ForensicTargetOverlap{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[540] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ForensicTargetOverlap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ForensicTargetOverlap) ProtoMessage() {} + +func (x *ForensicTargetOverlap) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[540] + 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 ForensicTargetOverlap.ProtoReflect.Descriptor instead. +func (*ForensicTargetOverlap) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{540} +} + +func (x *ForensicTargetOverlap) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *ForensicTargetOverlap) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *ForensicTargetOverlap) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ForensicTargetOverlap) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *ForensicTargetOverlap) GetWorkloadUids() []string { + if x != nil { + return x.WorkloadUids + } + return nil +} + +type PreviewForensicSnapshotPolicyTargetMatchesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + Scope *SnapshotTargetScope `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"` + // When previewing edits to an existing target, set this to its id so the + // target's persisted copy is not reported as overlapping itself. + ExcludeTargetId *string `protobuf:"bytes,3,opt,name=exclude_target_id,json=excludeTargetId,proto3,oneof" json:"exclude_target_id,omitempty"` +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) Reset() { + *x = PreviewForensicSnapshotPolicyTargetMatchesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[541] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotPolicyTargetMatchesRequest) ProtoMessage() {} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[541] + 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 PreviewForensicSnapshotPolicyTargetMatchesRequest.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotPolicyTargetMatchesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{541} +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetScope() *SnapshotTargetScope { + if x != nil { + return x.Scope + } + return nil +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesRequest) GetExcludeTargetId() string { + if x != nil && x.ExcludeTargetId != nil { + return *x.ExcludeTargetId + } + return "" +} + +type PreviewForensicSnapshotPolicyTargetMatchesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Clusters []*SnapshotClusterScopePreview `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` + // Enabled forensic targets whose rendered workloads intersect this scope + // (overlapping forensic captures race on DeletePod — spec §2). Computed + // against the rendered-scope read model, so overlaps reflect each + // target's matches as of its LAST RENDER (up to one render interval + // stale), not a live re-resolution. + Overlaps []*ForensicTargetOverlap `protobuf:"bytes,2,rep,name=overlaps,proto3" json:"overlaps,omitempty"` +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) Reset() { + *x = PreviewForensicSnapshotPolicyTargetMatchesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[542] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotPolicyTargetMatchesResponse) ProtoMessage() {} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[542] + 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 PreviewForensicSnapshotPolicyTargetMatchesResponse.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotPolicyTargetMatchesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{542} +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) GetClusters() []*SnapshotClusterScopePreview { + if x != nil { + return x.Clusters + } + return nil +} + +func (x *PreviewForensicSnapshotPolicyTargetMatchesResponse) GetOverlaps() []*ForensicTargetOverlap { + if x != nil { + return x.Overlaps + } + return nil +} + +// ---- Rendered scope (read model, spec §3.5) ---- +type SnapshotRenderedScopeRow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + PolicyId string `protobuf:"bytes,2,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + TargetId string `protobuf:"bytes,3,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + Namespace string `protobuf:"bytes,4,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodSelector *LabelSelector `protobuf:"bytes,5,opt,name=pod_selector,json=podSelector,proto3,oneof" json:"pod_selector,omitempty"` + ContainerNames []string `protobuf:"bytes,6,rep,name=container_names,json=containerNames,proto3" json:"container_names,omitempty"` + WorkloadCount int32 `protobuf:"varint,7,opt,name=workload_count,json=workloadCount,proto3" json:"workload_count,omitempty"` + Workloads []*SnapshotResolvedWorkload `protobuf:"bytes,8,rep,name=workloads,proto3" json:"workloads,omitempty"` + ConfigId string `protobuf:"bytes,9,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + RunGeneration *int32 `protobuf:"varint,10,opt,name=run_generation,json=runGeneration,proto3,oneof" json:"run_generation,omitempty"` // forensic only + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotRenderedScopeRow) Reset() { + *x = SnapshotRenderedScopeRow{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[543] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotRenderedScopeRow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotRenderedScopeRow) ProtoMessage() {} + +func (x *SnapshotRenderedScopeRow) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[543] + 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 SnapshotRenderedScopeRow.ProtoReflect.Descriptor instead. +func (*SnapshotRenderedScopeRow) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{543} +} + +func (x *SnapshotRenderedScopeRow) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetPodSelector() *LabelSelector { + if x != nil { + return x.PodSelector + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetContainerNames() []string { + if x != nil { + return x.ContainerNames + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetWorkloadCount() int32 { + if x != nil { + return x.WorkloadCount + } + return 0 +} + +func (x *SnapshotRenderedScopeRow) GetWorkloads() []*SnapshotResolvedWorkload { + if x != nil { + return x.Workloads + } + return nil +} + +func (x *SnapshotRenderedScopeRow) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotRenderedScopeRow) GetRunGeneration() int32 { + if x != nil && x.RunGeneration != nil { + return *x.RunGeneration + } + return 0 +} + +func (x *SnapshotRenderedScopeRow) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type GetSnapshotPolicyTargetRenderedScopeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Types that are assignable to By: + // + // *GetSnapshotPolicyTargetRenderedScopeRequest_TargetId + // *GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId + By isGetSnapshotPolicyTargetRenderedScopeRequest_By `protobuf_oneof:"by"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) Reset() { + *x = GetSnapshotPolicyTargetRenderedScopeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[544] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest) ProtoMessage() {} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[544] + 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 GetSnapshotPolicyTargetRenderedScopeRequest.ProtoReflect.Descriptor instead. +func (*GetSnapshotPolicyTargetRenderedScopeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{544} +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (m *GetSnapshotPolicyTargetRenderedScopeRequest) GetBy() isGetSnapshotPolicyTargetRenderedScopeRequest_By { + if m != nil { + return m.By + } + return nil +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetTargetId() string { + if x, ok := x.GetBy().(*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId); ok { + return x.TargetId + } + return "" +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetPolicyId() string { + if x, ok := x.GetBy().(*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId); ok { + return x.PolicyId + } + return "" +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetSnapshotPolicyTargetRenderedScopeRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type isGetSnapshotPolicyTargetRenderedScopeRequest_By interface { + isGetSnapshotPolicyTargetRenderedScopeRequest_By() +} + +type GetSnapshotPolicyTargetRenderedScopeRequest_TargetId struct { + TargetId string `protobuf:"bytes,2,opt,name=target_id,json=targetId,proto3,oneof"` +} + +type GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId struct { + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3,oneof"` +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId) isGetSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +func (*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId) isGetSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +type GetSnapshotPolicyTargetRenderedScopeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rows []*SnapshotRenderedScopeRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) Reset() { + *x = GetSnapshotPolicyTargetRenderedScopeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[545] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotPolicyTargetRenderedScopeResponse) ProtoMessage() {} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[545] + 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 GetSnapshotPolicyTargetRenderedScopeResponse.ProtoReflect.Descriptor instead. +func (*GetSnapshotPolicyTargetRenderedScopeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{545} +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) GetRows() []*SnapshotRenderedScopeRow { + if x != nil { + return x.Rows + } + return nil +} + +func (x *GetSnapshotPolicyTargetRenderedScopeResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Types that are assignable to By: + // + // *GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId + // *GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId + By isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By `protobuf_oneof:"by"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + Offset int32 `protobuf:"varint,5,opt,name=offset,proto3" json:"offset,omitempty"` +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) Reset() { + *x = GetForensicSnapshotPolicyTargetRenderedScopeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[546] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest) ProtoMessage() {} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[546] + 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 GetForensicSnapshotPolicyTargetRenderedScopeRequest.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{546} +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (m *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetBy() isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By { + if m != nil { + return m.By + } + return nil +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetTargetId() string { + if x, ok := x.GetBy().(*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId); ok { + return x.TargetId + } + return "" +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetPolicyId() string { + if x, ok := x.GetBy().(*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId); ok { + return x.PolicyId + } + return "" +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +type isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By interface { + isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId struct { + TargetId string `protobuf:"bytes,2,opt,name=target_id,json=targetId,proto3,oneof"` +} + +type GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId struct { + PolicyId string `protobuf:"bytes,3,opt,name=policy_id,json=policyId,proto3,oneof"` +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId) isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId) isGetForensicSnapshotPolicyTargetRenderedScopeRequest_By() { +} + +type GetForensicSnapshotPolicyTargetRenderedScopeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rows []*SnapshotRenderedScopeRow `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) Reset() { + *x = GetForensicSnapshotPolicyTargetRenderedScopeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[547] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotPolicyTargetRenderedScopeResponse) ProtoMessage() {} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[547] + 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 GetForensicSnapshotPolicyTargetRenderedScopeResponse.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotPolicyTargetRenderedScopeResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{547} +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) GetRows() []*SnapshotRenderedScopeRow { + if x != nil { + return x.Rows + } + return nil +} + +func (x *GetForensicSnapshotPolicyTargetRenderedScopeResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +// ---- Delivery status (apply layer now; runtime status added in phase 6) ---- +type SnapshotConfigInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ConfigId string `protobuf:"bytes,1,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + ContentHash string `protobuf:"bytes,3,opt,name=content_hash,json=contentHash,proto3" json:"content_hash,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // pending | applied | failed + Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` + RunGeneration *int32 `protobuf:"varint,6,opt,name=run_generation,json=runGeneration,proto3,oneof" json:"run_generation,omitempty"` // forensic only + TriggeredBy string `protobuf:"bytes,7,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"` // forensic only + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` +} + +func (x *SnapshotConfigInfo) Reset() { + *x = SnapshotConfigInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[548] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotConfigInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotConfigInfo) ProtoMessage() {} + +func (x *SnapshotConfigInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[548] + 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 SnapshotConfigInfo.ProtoReflect.Descriptor instead. +func (*SnapshotConfigInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{548} +} + +func (x *SnapshotConfigInfo) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotConfigInfo) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *SnapshotConfigInfo) GetContentHash() string { + if x != nil { + return x.ContentHash + } + return "" +} + +func (x *SnapshotConfigInfo) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *SnapshotConfigInfo) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *SnapshotConfigInfo) GetRunGeneration() int32 { + if x != nil && x.RunGeneration != nil { + return *x.RunGeneration + } + return 0 +} + +func (x *SnapshotConfigInfo) GetTriggeredBy() string { + if x != nil { + return x.TriggeredBy + } + return "" +} + +func (x *SnapshotConfigInfo) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +func (x *SnapshotConfigInfo) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +type SnapshotConfigApplyEventInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventId string `protobuf:"bytes,1,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + ConfigId string `protobuf:"bytes,2,opt,name=config_id,json=configId,proto3" json:"config_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + AppliedAt *timestamppb.Timestamp `protobuf:"bytes,51,opt,name=applied_at,json=appliedAt,proto3" json:"applied_at,omitempty"` + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,52,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` +} + +func (x *SnapshotConfigApplyEventInfo) Reset() { + *x = SnapshotConfigApplyEventInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[549] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SnapshotConfigApplyEventInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SnapshotConfigApplyEventInfo) ProtoMessage() {} + +func (x *SnapshotConfigApplyEventInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[549] + 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 SnapshotConfigApplyEventInfo.ProtoReflect.Descriptor instead. +func (*SnapshotConfigApplyEventInfo) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{549} +} + +func (x *SnapshotConfigApplyEventInfo) GetEventId() string { + if x != nil { + return x.EventId + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetConfigId() string { + if x != nil { + return x.ConfigId + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *SnapshotConfigApplyEventInfo) GetAppliedAt() *timestamppb.Timestamp { + if x != nil { + return x.AppliedAt + } + return nil +} + +func (x *SnapshotConfigApplyEventInfo) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +type GetSnapshotRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + EventLimit int32 `protobuf:"varint,3,opt,name=event_limit,json=eventLimit,proto3" json:"event_limit,omitempty"` // default 20 +} + +func (x *GetSnapshotRecommendationStatusRequest) Reset() { + *x = GetSnapshotRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[550] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetSnapshotRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[550] + 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 GetSnapshotRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetSnapshotRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{550} +} + +func (x *GetSnapshotRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetSnapshotRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetSnapshotRecommendationStatusRequest) GetEventLimit() int32 { + if x != nil { + return x.EventLimit + } + return 0 +} + +type GetSnapshotRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *SnapshotConfigInfo `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3,oneof" json:"current_config,omitempty"` + Events []*SnapshotConfigApplyEventInfo `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"` + // Ingested runtime status of the cluster's resilience-family CRs. + Runtime []*SnapshotCRRuntimeStatus `protobuf:"bytes,3,rep,name=runtime,proto3" json:"runtime,omitempty"` + Prereqs *SnapshotPrereqs `protobuf:"bytes,4,opt,name=prereqs,proto3" json:"prereqs,omitempty"` +} + +func (x *GetSnapshotRecommendationStatusResponse) Reset() { + *x = GetSnapshotRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[551] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSnapshotRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSnapshotRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetSnapshotRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[551] + 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 GetSnapshotRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetSnapshotRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{551} +} + +func (x *GetSnapshotRecommendationStatusResponse) GetCurrentConfig() *SnapshotConfigInfo { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetEvents() []*SnapshotConfigApplyEventInfo { + if x != nil { + return x.Events + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetRuntime() []*SnapshotCRRuntimeStatus { + if x != nil { + return x.Runtime + } + return nil +} + +func (x *GetSnapshotRecommendationStatusResponse) GetPrereqs() *SnapshotPrereqs { + if x != nil { + return x.Prereqs + } + return nil +} + +type GetForensicSnapshotRecommendationStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + EventLimit int32 `protobuf:"varint,3,opt,name=event_limit,json=eventLimit,proto3" json:"event_limit,omitempty"` +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) Reset() { + *x = GetForensicSnapshotRecommendationStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[552] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotRecommendationStatusRequest) ProtoMessage() {} + +func (x *GetForensicSnapshotRecommendationStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[552] + 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 GetForensicSnapshotRecommendationStatusRequest.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotRecommendationStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{552} +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetForensicSnapshotRecommendationStatusRequest) GetEventLimit() int32 { + if x != nil { + return x.EventLimit + } + return 0 +} + +type GetForensicSnapshotRecommendationStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentConfig *SnapshotConfigInfo `protobuf:"bytes,1,opt,name=current_config,json=currentConfig,proto3,oneof" json:"current_config,omitempty"` + Events []*SnapshotConfigApplyEventInfo `protobuf:"bytes,2,rep,name=events,proto3" json:"events,omitempty"` + // Ingested runtime status of the cluster's ForensicSnapshotChain CRs. + Runtime []*SnapshotCRRuntimeStatus `protobuf:"bytes,3,rep,name=runtime,proto3" json:"runtime,omitempty"` +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) Reset() { + *x = GetForensicSnapshotRecommendationStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[553] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetForensicSnapshotRecommendationStatusResponse) ProtoMessage() {} + +func (x *GetForensicSnapshotRecommendationStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[553] + 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 GetForensicSnapshotRecommendationStatusResponse.ProtoReflect.Descriptor instead. +func (*GetForensicSnapshotRecommendationStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{553} +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetCurrentConfig() *SnapshotConfigInfo { + if x != nil { + return x.CurrentConfig + } + return nil +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetEvents() []*SnapshotConfigApplyEventInfo { + if x != nil { + return x.Events + } + return nil +} + +func (x *GetForensicSnapshotRecommendationStatusResponse) GetRuntime() []*SnapshotCRRuntimeStatus { + if x != nil { + return x.Runtime + } + return nil +} + +// ---- Compiled-config preview (implemented in phase 3; Unimplemented now) ---- +type PreviewSnapshotRecommendationConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *PreviewSnapshotRecommendationConfigRequest) Reset() { + *x = PreviewSnapshotRecommendationConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[554] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotRecommendationConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotRecommendationConfigRequest) ProtoMessage() {} + +func (x *PreviewSnapshotRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[554] + 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 PreviewSnapshotRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{554} +} + +func (x *PreviewSnapshotRecommendationConfigRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewSnapshotRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type PreviewSnapshotRecommendationConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Yaml string `protobuf:"bytes,1,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *PreviewSnapshotRecommendationConfigResponse) Reset() { + *x = PreviewSnapshotRecommendationConfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[555] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewSnapshotRecommendationConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewSnapshotRecommendationConfigResponse) ProtoMessage() {} + +func (x *PreviewSnapshotRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[555] + 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 PreviewSnapshotRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewSnapshotRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{555} +} + +func (x *PreviewSnapshotRecommendationConfigResponse) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +type PreviewForensicSnapshotRecommendationConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) Reset() { + *x = PreviewForensicSnapshotRecommendationConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[556] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotRecommendationConfigRequest) ProtoMessage() {} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[556] + 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 PreviewForensicSnapshotRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{556} +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *PreviewForensicSnapshotRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type PreviewForensicSnapshotRecommendationConfigResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Yaml string `protobuf:"bytes,1,opt,name=yaml,proto3" json:"yaml,omitempty"` +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) Reset() { + *x = PreviewForensicSnapshotRecommendationConfigResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[557] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewForensicSnapshotRecommendationConfigResponse) ProtoMessage() {} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[557] + 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 PreviewForensicSnapshotRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewForensicSnapshotRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{557} +} + +func (x *PreviewForensicSnapshotRecommendationConfigResponse) GetYaml() string { + if x != nil { + return x.Yaml + } + return "" +} + +// ---- KEDA shared authentication ---- +type ListReferencedAuthenticationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` +} + +func (x *ListReferencedAuthenticationsRequest) Reset() { + *x = ListReferencedAuthenticationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[558] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListReferencedAuthenticationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReferencedAuthenticationsRequest) ProtoMessage() {} + +func (x *ListReferencedAuthenticationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[558] + 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 ListReferencedAuthenticationsRequest.ProtoReflect.Descriptor instead. +func (*ListReferencedAuthenticationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{558} +} + +func (x *ListReferencedAuthenticationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *ListReferencedAuthenticationsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +// ReferencedAuthentication is a distinct KEDA authenticationRef observed +// across a cluster's active WorkloadRules. +// It carries no credential or secret data. +type ReferencedAuthentication struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // kind is either TriggerAuthentication or ClusterTriggerAuthentication. + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + // used_by_count is the number of active WorkloadRules that reference this auth object. + UsedByCount int64 `protobuf:"varint,3,opt,name=used_by_count,json=usedByCount,proto3" json:"used_by_count,omitempty"` + // namespaces lists the namespaces of the referencing WorkloadRules. + Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` +} + +func (x *ReferencedAuthentication) Reset() { + *x = ReferencedAuthentication{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[559] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReferencedAuthentication) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReferencedAuthentication) ProtoMessage() {} + +func (x *ReferencedAuthentication) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[559] + 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 ReferencedAuthentication.ProtoReflect.Descriptor instead. +func (*ReferencedAuthentication) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{559} +} + +func (x *ReferencedAuthentication) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ReferencedAuthentication) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ReferencedAuthentication) GetUsedByCount() int64 { + if x != nil { + return x.UsedByCount + } + return 0 +} + +func (x *ReferencedAuthentication) GetNamespaces() []string { + if x != nil { + return x.Namespaces + } + return nil +} + +type ListReferencedAuthenticationsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Authentications []*ReferencedAuthentication `protobuf:"bytes,1,rep,name=authentications,proto3" json:"authentications,omitempty"` +} + +func (x *ListReferencedAuthenticationsResponse) Reset() { + *x = ListReferencedAuthenticationsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[560] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListReferencedAuthenticationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReferencedAuthenticationsResponse) ProtoMessage() {} + +func (x *ListReferencedAuthenticationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[560] + 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 ListReferencedAuthenticationsResponse.ProtoReflect.Descriptor instead. +func (*ListReferencedAuthenticationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{560} +} + +func (x *ListReferencedAuthenticationsResponse) GetAuthentications() []*ReferencedAuthentication { + if x != nil { + return x.Authentications + } + return nil +} + +type SchedulerEnrollmentReport_Observation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + WorkloadName string `protobuf:"bytes,3,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + PolicyId string `protobuf:"bytes,4,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + // pre-mutation scheduler observed at first application; "" = field + // was unset in the workload spec + OriginalSchedulerName string `protobuf:"bytes,5,opt,name=original_scheduler_name,json=originalSchedulerName,proto3" json:"original_scheduler_name,omitempty"` +} + +func (x *SchedulerEnrollmentReport_Observation) Reset() { + *x = SchedulerEnrollmentReport_Observation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[597] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerEnrollmentReport_Observation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerEnrollmentReport_Observation) ProtoMessage() {} + +func (x *SchedulerEnrollmentReport_Observation) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[597] + 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 SchedulerEnrollmentReport_Observation.ProtoReflect.Descriptor instead. +func (*SchedulerEnrollmentReport_Observation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{428, 0} +} + +func (x *SchedulerEnrollmentReport_Observation) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SchedulerEnrollmentReport_Observation) GetOriginalSchedulerName() string { + if x != nil { + return x.OriginalSchedulerName + } + return "" +} + +type SchedulerRevertEventReport_Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodName string `protobuf:"bytes,2,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + // Owning controller identity when resolvable from ownerRefs at + // admission time; empty for bare pods. + WorkloadKind string `protobuf:"bytes,3,opt,name=workload_kind,json=workloadKind,proto3" json:"workload_kind,omitempty"` + WorkloadName string `protobuf:"bytes,4,opt,name=workload_name,json=workloadName,proto3" json:"workload_name,omitempty"` + // scheduler-policy id annotation value if the pod carried one. + PolicyId string `protobuf:"bytes,5,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + FromScheduler string `protobuf:"bytes,6,opt,name=from_scheduler,json=fromScheduler,proto3" json:"from_scheduler,omitempty"` + ToScheduler string `protobuf:"bytes,7,opt,name=to_scheduler,json=toScheduler,proto3" json:"to_scheduler,omitempty"` + // Why the scheduler was considered unhealthy at revert time. + Reason SchedulerUnhealthyReason `protobuf:"varint,8,opt,name=reason,proto3,enum=api.v1.SchedulerUnhealthyReason" json:"reason,omitempty"` + OccurredAt *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=occurred_at,json=occurredAt,proto3" json:"occurred_at,omitempty"` +} + +func (x *SchedulerRevertEventReport_Event) Reset() { + *x = SchedulerRevertEventReport_Event{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[598] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchedulerRevertEventReport_Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchedulerRevertEventReport_Event) ProtoMessage() {} + +func (x *SchedulerRevertEventReport_Event) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_proto_msgTypes[598] + 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 SchedulerRevertEventReport_Event.ProtoReflect.Descriptor instead. +func (*SchedulerRevertEventReport_Event) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{429, 0} +} + +func (x *SchedulerRevertEventReport_Event) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetPodName() string { + if x != nil { + return x.PodName + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetWorkloadKind() string { + if x != nil { + return x.WorkloadKind + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetFromScheduler() string { + if x != nil { + return x.FromScheduler + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetToScheduler() string { + if x != nil { + return x.ToScheduler + } + return "" +} + +func (x *SchedulerRevertEventReport_Event) GetReason() SchedulerUnhealthyReason { + if x != nil { + return x.Reason + } + return SchedulerUnhealthyReason_SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED +} + +func (x *SchedulerRevertEventReport_Event) GetOccurredAt() *timestamppb.Timestamp { + if x != nil { + return x.OccurredAt + } + return nil +} + +var File_api_v1_recommendation_proto protoreflect.FileDescriptor + +var file_api_v1_recommendation_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, + 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x10, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x38, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x68, 0x70, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x61, 0x70, 0x69, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xfc, 0x03, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x48, 0x02, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xae, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x99, 0x02, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x71, 0x0a, + 0x25, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x92, 0x02, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x74, 0x61, 0x74, 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, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x00, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x48, 0x01, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x97, 0x03, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x89, 0x03, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x2f, 0x0a, - 0x14, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x35, 0x12, 0x41, - 0x0a, 0x1f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, - 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, - 0x48, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, - 0x35, 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, - 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x39, 0x39, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x39, 0x12, 0x41, 0x0a, 0x1f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, - 0x66, 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x21, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, - 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, - 0x89, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 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, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 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, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x28, + 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x48, 0x01, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x22, 0x97, 0x03, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x27, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, + 0x5f, 0x70, 0x39, 0x35, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x39, + 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x35, 0x12, 0x41, 0x0a, 0x1f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x35, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, 0x66, + 0x49, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x35, 0x12, 0x27, 0x0a, + 0x10, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, + 0x39, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x14, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x39, 0x39, 0x12, 0x41, 0x0a, 0x1f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x68, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x4f, 0x6e, 0x50, 0x39, 0x39, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, - 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, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x65, 0x66, - 0x6f, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 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, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x27, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 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, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x2a, 0x0a, 0x11, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x61, 0x66, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xdd, 0x03, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 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, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x3c, 0x0a, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x76, 0x70, 0x61, 0x4c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x3c, - 0x0a, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0b, 0x68, 0x70, 0x61, 0x4c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x89, 0x04, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x30, 0x0a, 0x03, 0x72, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, - 0x72, 0x65, 0x63, 0x22, 0x98, 0x03, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, 0x3c, 0x0a, 0x0c, 0x76, 0x70, 0x61, - 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x76, 0x70, 0x61, 0x4c, - 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, - 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x68, 0x70, 0x61, 0x4c, 0x6f, 0x6f, - 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x94, - 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x89, 0x03, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, + 0x0b, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x5c, 0x0a, + 0x28, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x03, 0x72, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xca, 0x03, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x72, 0x65, 0x63, 0x22, 0xc4, 0x02, 0x0a, 0x28, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 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, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, + 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x52, 0x0c, 0x76, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, + 0x62, 0x61, 0x63, 0x6b, 0x52, 0x0c, 0x68, 0x70, 0x61, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x29, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xca, 0x03, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x25, 0x47, 0x65, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x43, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, - 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x22, 0xe7, 0x03, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, + 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, + 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x29, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x97, 0x01, 0x0a, 0x28, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x22, 0x45, 0x0a, 0x29, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x22, 0x81, 0x02, 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x39, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 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, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, + 0x5a, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2d, 0x0a, 0x0c, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xea, 0x05, 0x0a, 0x2a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x50, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, @@ -29178,58 +45351,77 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, - 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5d, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, + 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x02, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, + 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, + 0x0a, 0x17, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5f, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x69, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0x45, 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 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, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, - 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, - 0xe7, 0x03, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x70, 0x0a, 0x2b, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x87, 0x06, 0x0a, 0x2a, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x50, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, @@ -29239,685 +45431,534 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x97, 0x01, 0x0a, - 0x28, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x22, 0x45, 0x0a, 0x29, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, + 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, + 0x07, 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, + 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, + 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x81, 0x02, - 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, - 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 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, - 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x22, 0xc3, 0x02, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x7c, 0x0a, - 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, 0x1a, 0x5a, 0x0a, 0x16, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2d, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xea, 0x05, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, - 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, - 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, - 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, - 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, - 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, - 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x22, 0x6c, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x22, 0x62, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x22, 0x5f, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x22, 0x69, 0x0a, 0x28, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x45, 0x0a, - 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x70, 0x0a, 0x2b, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x87, 0x06, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x12, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, - 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, - 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, 0x6d, 0x69, 0x6e, - 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x63, - 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, - 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, - 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, - 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, - 0x22, 0x6c, 0x0a, 0x2b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3d, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x62, - 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x2b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0xb3, 0x02, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, + 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, + 0x61, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, + 0x73, 0x65, 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x47, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x82, + 0x01, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x22, 0x47, 0x0a, 0x2b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x6a, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xb3, 0x02, 0x0a, 0x2a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x12, - 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, - 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x53, - 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x47, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x29, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 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, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x6a, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x5e, 0x0a, 0x26, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x67, 0x0a, 0x27, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x6e, 0x0a, 0x2a, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, + 0x5e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x67, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x29, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 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, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x6e, + 0x0a, 0x2a, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x82, + 0x01, 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, - 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x61, 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x61, 0x0a, 0x29, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x22, 0x46, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x03, 0x0a, 0x29, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x46, - 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x8a, 0x03, 0x0a, 0x29, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, + 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, + 0x65, 0x74, 0x61, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x75, 0x73, 0x65, 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, - 0x61, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x63, - 0x68, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x73, 0x75, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x53, 0x75, 0x62, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x2a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x2b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x72, 0x0a, 0x2c, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x61, 0x74, - 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xe5, - 0x02, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xff, 0x07, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, - 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, + 0xbc, 0x01, 0x0a, 0x2b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x72, + 0x0a, 0x2c, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xe5, 0x02, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfa, 0x08, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, + 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, + 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, + 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x03, - 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, + 0x34, 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, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xf4, 0x07, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, - 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xf9, 0x06, 0x0a, 0x21, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, + 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, - 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, + 0x0a, 0x12, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, + 0x49, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, + 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, + 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0x56, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x56, 0x0a, 0x1e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x49, 0x64, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x20, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, - 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0b, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x21, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa9, 0x07, 0x0a, 0x21, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x22, 0xa4, 0x08, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 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, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, - 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0x5b, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x76, 0x0a, - 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, + 0x02, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, + 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x03, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x04, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x14, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, + 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x06, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x5b, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 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, 0xb1, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x46, 0x0a, 0x1f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbf, 0x05, 0x0a, 0x29, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 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, 0x12, 0x49, 0x0a, - 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x67, 0x65, 0x74, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, + 0x64, 0x73, 0x22, 0x76, 0x0a, 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3f, 0x0a, 0x23, 0x54, 0x6f, + 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0xb1, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x1f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1d, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xba, 0x06, 0x0a, + 0x29, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 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, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, + 0x01, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, + 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, + 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0a, 0x6b, - 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, + 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, + 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x0f, 0x6b, 0x69, + 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, @@ -29931,7 +45972,7 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x92, 0x06, 0x0a, 0x34, 0x47, + 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xb7, 0x07, 0x0a, 0x34, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, @@ -29969,471 +46010,707 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, - 0xb5, 0x03, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x15, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, + 0x69, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x4e, 0x6f, 0x74, 0x49, 0x6e, 0x12, 0x42, 0x0a, 0x12, + 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, + 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x0f, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x49, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf7, 0x05, 0x0a, 0x35, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, + 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x14, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, - 0x6d, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, - 0x12, 0x89, 0x01, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x56, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x69, 0x0a, 0x18, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 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, 0x37, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, - 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, - 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x40, 0x0a, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xa9, 0x03, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, - 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, - 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xa3, 0x02, - 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, - 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x20, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x02, 0x52, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x22, 0x5d, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, - 0xa3, 0x02, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x72, 0x75, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x1a, 0x69, + 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x69, 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, 0x37, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x69, 0x0a, 0x1c, 0x43, 0x6f, 0x6c, + 0x6c, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x69, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0e, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa9, + 0x03, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, + 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, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0x5c, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, - 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0x5c, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, - 0x73, 0x22, 0x77, 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x57, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, 0x54, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x23, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 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, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x22, 0x70, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, - 0x83, 0x01, 0x0a, 0x36, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, + 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, + 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5d, 0x0a, + 0x22, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xeb, 0x03, 0x0a, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0d, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, - 0x0a, 0x19, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa3, 0x02, 0x0a, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x1b, 0x0a, 0x09, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x5c, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0x5c, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x77, + 0x0a, 0x23, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, 0x54, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x25, 0x0a, 0x23, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x8e, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 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, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x70, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x41, 0x0a, 0x13, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x52, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x22, 0xb6, 0x01, 0x0a, 0x35, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x83, 0x01, 0x0a, + 0x36, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x96, 0x06, 0x0a, 0x20, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x40, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x5c, 0x0a, 0x19, 0x69, + 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, + 0x52, 0x17, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x19, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x16, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x63, 0x0a, 0x1b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, + 0x52, 0x19, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x67, 0x0a, 0x1d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x41, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x38, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, + 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x0e, 0x0a, 0x21, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x59, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0f, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, - 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, - 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, - 0x38, 0x0a, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, - 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xb1, 0x0b, 0x0a, 0x21, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x13, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, - 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6c, 0x0a, 0x1e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1c, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1e, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6b, 0x69, 0x6e, 0x64, 0x54, 0x6f, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x1b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5d, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, - 0x57, 0x0a, 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x48, - 0x00, 0x52, 0x15, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x17, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, - 0x00, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x82, 0x01, 0x0a, 0x26, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, - 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x48, 0x00, 0x52, 0x1e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x12, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0x58, 0x0a, 0x12, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x0a, 0x1d, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x6e, 0x48, 0x00, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x13, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x70, 0x0a, 0x20, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1d, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6c, 0x0a, 0x1e, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1c, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1e, 0x6b, 0x69, + 0x6e, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x74, 0x6f, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, + 0x1a, 0x6b, 0x69, 0x6e, 0x64, 0x54, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x1b, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, + 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, + 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x17, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x15, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x4e, 0x0a, 0x17, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x12, 0x82, 0x01, 0x0a, 0x26, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, + 0x52, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x76, 0x63, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x48, 0x00, 0x52, 0x12, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x12, 0x6b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x11, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x59, 0x0a, 0x17, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x72, 0x0a, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x1e, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x14, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x70, 0x61, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x41, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x48, 0x00, 0x52, + 0x12, 0x62, 0x61, 0x74, 0x63, 0x68, 0x48, 0x70, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x15, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x42, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x48, + 0x00, 0x52, 0x13, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6a, 0x0a, 0x1d, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x96, 0x0d, - 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x75, 0x6c, 0x65, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x68, 0x0a, + 0x1c, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, + 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x11, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 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, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, - 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3a, - 0x0a, 0x19, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x17, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x1e, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, - 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, - 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, - 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, - 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1d, - 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x46, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x53, 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, 0x54, 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, 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x5a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, - 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0xfe, 0x05, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, + 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, + 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, + 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x6f, 0x75, 0x74, 0x6c, + 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6f, 0x75, 0x74, + 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x21, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, + 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, + 0x22, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, + 0x23, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, + 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3d, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x3c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, + 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, + 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, + 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, + 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, + 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x51, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x53, 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, 0x54, 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, 0x1f, 0x0a, + 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x65, 0x64, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x65, 0x64, 0x12, 0x43, + 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x5a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x1c, + 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, + 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x17, 0x6c, + 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x15, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x12, 0x6b, 0x65, 0x64, 0x61, + 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x5f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, + 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x07, 0x52, 0x10, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, + 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, + 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, + 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, + 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, + 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0xb5, 0x0a, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x6d, + 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x0f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, + 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, + 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, + 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, + 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x70, 0x6d, 0x61, 0x78, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, 0x09, 0x70, 0x6d, 0x61, + 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x48, 0x07, + 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x0c, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x48, 0x09, 0x52, 0x0e, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x0a, 0x52, 0x0c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x0b, 0x52, 0x11, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, 0x6f, 0x6f, 0x72, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x48, 0x0c, 0x52, 0x13, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, + 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0d, 0x52, 0x0d, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x27, 0x0a, 0x0d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, + 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0e, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, + 0x61, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, + 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, + 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x22, 0xf0, 0x03, 0x0a, 0x10, 0x48, + 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1b, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x02, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 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, 0x15, 0x0a, 0x13, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, + 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x72, 0x0a, + 0x0b, 0x48, 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, + 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x22, 0xf2, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, @@ -30449,241 +46726,284 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, - 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x04, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, - 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, - 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6d, - 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x70, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, - 0x09, 0x70, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, - 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x69, 0x6c, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, - 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, - 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x22, 0xb7, 0x03, 0x0a, 0x10, 0x48, 0x50, 0x41, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, - 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x88, 0x01, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 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, 0x15, 0x0a, 0x13, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x22, 0x72, 0x0a, 0x0b, 0x48, 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xd7, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 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, 0x21, 0x0a, 0x0c, 0x62, - 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, - 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, - 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, + 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, + 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, + 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, + 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, + 0x72, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0d, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, + 0x0d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, + 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, + 0x5f, 0x72, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, + 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, + 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x67, + 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, + 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x22, 0xaf, 0x04, 0x0a, 0x11, 0x4a, 0x56, 0x4d, 0x48, + 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x00, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x68, 0x65, 0x61, + 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x48, 0x01, 0x52, 0x12, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, + 0x6f, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x19, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x02, 0x52, 0x16, 0x6e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, + 0x72, 0x68, 0x65, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x17, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x03, 0x52, 0x14, 0x6e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, 0x72, 0x68, + 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x6d, + 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, + 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x48, 0x65, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, - 0x0a, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, - 0x6f, 0x74, 0x65, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x22, - 0xfe, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, - 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, - 0x22, 0xe2, 0x06, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 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, 0x26, 0x0a, 0x0c, - 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, - 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, - 0x03, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x17, 0x6d, 0x61, 0x78, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x62, 0x65, 0x68, - 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, - 0x48, 0x05, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, - 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x88, 0x01, - 0x01, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, - 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x48, 0x07, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, 0x65, - 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x18, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, - 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, - 0x52, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x61, 0x78, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x65, 0x68, 0x61, - 0x76, 0x69, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xf8, 0x02, 0x0a, 0x17, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6f, 0x6f, 0x6d, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x13, 0x6f, 0x6f, 0x6d, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0f, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x12, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x70, - 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, 0x63, 0x70, - 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, - 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x22, 0x6c, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, - 0x35, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xd5, - 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x03, 0x63, - 0x70, 0x75, 0x12, 0x30, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x06, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, - 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6e, 0x6f, + 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0xb3, 0x05, 0x0a, 0x0d, 0x48, 0x50, + 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, + 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, + 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x17, 0x6d, 0x61, 0x78, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x62, + 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, + 0x6f, 0x72, 0x48, 0x03, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x10, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, + 0x50, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x48, 0x05, 0x52, 0x08, 0x66, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, + 0x52, 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, + 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x1e, + 0x0a, 0x1c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, + 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a, 0x04, + 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, + 0x52, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xf8, 0x02, 0x0a, 0x17, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, + 0x6f, 0x6d, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x6f, 0x6f, 0x6d, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, + 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6f, 0x6f, 0x6d, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6f, 0x6f, 0x6d, + 0x4d, 0x61, 0x78, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x14, + 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6f, 0x6f, 0x6d, 0x43, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x34, + 0x0a, 0x16, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3a, + 0x0a, 0x19, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x17, 0x63, 0x70, 0x75, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x69, 0x6e, 0x67, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x8b, 0x05, 0x0a, 0x18, 0x4b, + 0x45, 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, + 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x64, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x10, 0x69, 0x64, 0x6c, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x10, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0e, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, + 0x77, 0x6e, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x15, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, + 0x48, 0x06, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x12, + 0x35, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x48, 0x07, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x6f, + 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x12, + 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x22, 0xea, 0x02, 0x0a, 0x0b, 0x4b, 0x45, 0x44, + 0x41, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x3d, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x51, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x45, 0x44, 0x41, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x48, 0x00, 0x52, 0x11, 0x61, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, + 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x75, 0x73, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 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, 0x15, + 0x0a, 0x13, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x22, 0x3f, 0x0a, 0x15, 0x4b, 0x45, 0x44, 0x41, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x73, 0x0a, 0x0c, 0x4b, 0x45, 0x44, 0x41, 0x46, 0x61, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 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, + 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x0c, + 0x4b, 0x45, 0x44, 0x41, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x21, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1d, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, + 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x6c, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x22, 0xa0, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x73, 0x74, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x64, - 0x69, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x22, 0x7f, 0x0a, 0x16, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x38, 0x0a, 0x0a, 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, - 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x52, 0x0a, - 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x6d, 0x0a, 0x12, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x2a, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, + 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x38, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x03, 0x70, 0x38, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x35, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x39, 0x39, 0x22, 0xd5, 0x01, 0x0a, 0x13, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x30, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x12, 0x32, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x07, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x2c, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x04, 0x64, 0x69, + 0x73, 0x6b, 0x22, 0xa0, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, + 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x69, 0x73, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x64, 0x69, 0x73, 0x6b, 0x12, + 0x19, 0x0a, 0x08, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x07, 0x70, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6d, + 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x70, 0x6d, + 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x22, 0x7f, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, 0x6d, 0x69, + 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x0a, + 0x62, 0x75, 0x72, 0x73, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x72, 0x73, 0x74, 0x69, + 0x6e, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x73, 0x52, 0x0a, 0x62, 0x75, 0x72, 0x73, + 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x22, 0x6d, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x05, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x54, 0x6f, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x48, + 0x50, 0x41, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x73, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x5d, 0x0a, 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x57, 0x69, 0x74, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, @@ -30807,3284 +47127,4137 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x29, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, - 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, - 0xfd, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x16, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xf7, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x24, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x70, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, - 0x0a, 0x27, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x23, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x63, 0x72, 0x65, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x6f, - 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x29, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, 0x5f, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x35, - 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x28, 0x0a, 0x10, 0x73, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x76, 0x63, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x0b, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x12, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x1a, 0x5b, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, 0x01, - 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, 0x74, - 0x61, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x69, 0x75, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x0e, 0x0a, - 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xfc, 0x01, - 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 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, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, - 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x2c, - 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9f, 0x04, 0x0a, - 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x21, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x70, 0x75, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, 0x5f, - 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x70, 0x75, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, - 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x14, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, - 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, - 0x75, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, 0x73, - 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, - 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, - 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, - 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x67, 0x70, - 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x68, 0x6f, 0x75, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x67, 0x70, 0x75, 0x56, - 0x72, 0x61, 0x6d, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, 0xcd, - 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x50, 0x0a, 0x12, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x11, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xe4, - 0x03, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 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, 0x1b, 0x0a, 0x09, - 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x70, 0x75, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, - 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, - 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, - 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xec, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 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, 0x20, 0x0a, - 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, - 0x26, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x29, 0x0a, 0x08, 0x67, 0x70, 0x75, - 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x67, 0x70, 0x75, - 0x56, 0x72, 0x61, 0x6d, 0x22, 0xee, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, - 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6d, 0x69, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, - 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x30, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, 0x0a, - 0x03, 0x70, 0x39, 0x37, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x37, 0x12, - 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, - 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x9b, 0x03, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x22, 0xaa, 0x01, 0x0a, 0x1e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, - 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0xcc, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x76, - 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x70, 0x75, 0x56, 0x72, - 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x63, 0x70, - 0x75, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x6d, 0x65, 0x6d, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, - 0x65, 0x52, 0x09, 0x6d, 0x65, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, - 0x67, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x67, 0x70, 0x75, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, - 0x52, 0x0d, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xf1, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x03, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x32, - 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x11, 0x74, 0x6f, - 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x22, 0x9c, 0x04, 0x0a, 0x1b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x12, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, - 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, - 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x22, 0x92, 0x07, 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, - 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x12, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, - 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, - 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, - 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, - 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, 0x6d, 0x69, - 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, - 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, 0x6d, 0x61, - 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, - 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, - 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x33, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, - 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0xb9, 0x06, 0x0a, 0x21, 0x56, 0x65, 0x72, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, - 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, - 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, - 0x48, 0x02, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, - 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x11, 0x6d, 0x61, 0x78, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, - 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, - 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, - 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x1a, 0x61, 0x64, 0x6a, - 0x75, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, 0x66, 0x5f, - 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x61, - 0x64, 0x6a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, 0x49, 0x66, 0x4e, 0x6f, - 0x74, 0x53, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, - 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, - 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, - 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, - 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1c, 0x0a, 0x1a, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x22, 0x85, 0x07, 0x0a, 0x23, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, - 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, - 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, - 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x02, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, - 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, - 0x17, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x27, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x68, - 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x29, 0x20, 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x22, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x68, 0x72, - 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, - 0x65, 0x63, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x17, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, - 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, - 0x18, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, 0x0a, - 0x0d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x1d, 0x0a, 0x1b, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x2a, 0x0a, 0x28, 0x5f, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, - 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xda, 0x12, 0x0a, 0x1c, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x5b, 0x0a, 0x14, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x12, 0x63, 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x12, 0x61, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x15, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, - 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x14, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x12, 0x67, 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x12, 0x64, 0x0a, 0x19, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x16, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, - 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x12, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, - 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x11, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, - 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, - 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x02, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, - 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, - 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, - 0x18, 0x39, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x3e, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd6, 0x01, 0x0a, 0x17, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x46, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x3e, 0x0a, 0x0d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x41, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x4a, 0x73, 0x6f, + 0x6e, 0x22, 0xce, 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 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, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x22, 0x5d, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 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, 0x22, 0x66, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x09, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x11, 0x52, 0x65, + 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x22, 0xfd, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x16, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xf7, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x54, 0x0a, 0x27, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x23, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x5f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, + 0x6f, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, + 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x61, 0x72, 0x67, 0x6f, 0x63, 0x64, 0x50, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x12, + 0x35, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x5f, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x28, 0x0a, 0x10, 0x73, 0x76, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x76, 0x63, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x0b, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x12, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x1a, 0x5b, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, + 0x65, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, + 0x01, 0x0a, 0x0f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4d, 0x65, + 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x69, 0x75, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x0e, + 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0xfc, + 0x01, 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 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, 0x23, 0x0a, 0x0d, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x7a, + 0x6f, 0x6e, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x9f, 0x04, + 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x21, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x70, + 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x70, 0x75, + 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x70, + 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, + 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, + 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x67, 0x70, 0x75, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, + 0x0a, 0x11, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x67, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x67, 0x70, 0x75, + 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, + 0x6d, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, + 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x67, + 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x67, 0x70, 0x75, + 0x56, 0x72, 0x61, 0x6d, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x22, + 0xcd, 0x02, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x50, 0x0a, + 0x12, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x11, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, + 0xe4, 0x03, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 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, 0x1b, 0x0a, + 0x09, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x70, + 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, + 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x67, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, + 0x6d, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, + 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, + 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xec, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 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, 0x20, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x26, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x29, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x07, 0x67, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x22, 0xee, 0x01, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6d, + 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x35, 0x30, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x35, 0x30, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x37, 0x35, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x37, 0x35, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, + 0x30, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x30, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x39, 0x35, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x35, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x39, 0x37, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, 0x39, 0x37, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x39, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x70, + 0x39, 0x39, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x31, 0x30, 0x30, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x04, 0x70, 0x31, 0x30, 0x30, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xcd, 0x04, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x11, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x5f, 0x6d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x4e, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, + 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6f, 0x6d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x6f, 0x6d, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x1e, 0x4b, 0x65, 0x64, 0x61, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0xcc, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x70, 0x75, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x70, + 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x67, 0x70, + 0x75, 0x56, 0x72, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, + 0x09, 0x63, 0x70, 0x75, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x6d, 0x65, + 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x6d, 0x65, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x33, 0x0a, 0x0a, 0x67, 0x70, 0x75, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x09, 0x67, 0x70, 0x75, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0f, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, + 0x61, 0x6b, 0x65, 0x52, 0x0d, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x0e, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, 0x4d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa8, 0x01, + 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x4d, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, + 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, + 0x6c, 0x61, 0x67, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7d, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x78, 0x0a, 0x12, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, + 0x0a, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xf1, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x15, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x32, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x11, + 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x9c, 0x04, 0x0a, 0x1b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 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, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, + 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, + 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, + 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, + 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x92, 0x07, 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 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, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, + 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, + 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, + 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x07, + 0x6d, 0x69, 0x6e, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x07, + 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x12, 0x39, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, - 0x10, 0x6d, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x59, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, - 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, - 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, 0x0e, 0x73, - 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x76, 0x4d, 0x61, 0x78, 0x88, 0x01, 0x01, - 0x12, 0x35, 0x0a, 0x14, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, - 0x73, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, - 0x52, 0x12, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x56, 0x73, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x64, 0x72, 0x69, 0x66, 0x74, - 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x5e, - 0x20, 0x01, 0x28, 0x02, 0x48, 0x08, 0x52, 0x11, 0x64, 0x72, 0x69, 0x66, 0x74, 0x44, 0x65, 0x6c, - 0x74, 0x61, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, - 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x09, 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x56, 0x70, 0x61, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, - 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, - 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, - 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, - 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x6d, 0x70, 0x61, 0x18, 0x61, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4d, 0x70, 0x61, 0x12, - 0x46, 0x0a, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x69, 0x6e, 0x67, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x64, 0x62, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x62, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x64, - 0x62, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, - 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x63, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, - 0x0a, 0x14, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0b, 0x52, 0x12, - 0x70, 0x6d, 0x61, 0x78, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x0c, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1b, - 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, - 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x42, 0x17, 0x0a, 0x15, 0x5f, - 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, - 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x0a, 0x1b, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, - 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, - 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 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, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x64, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, + 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x22, 0xb5, 0x07, 0x0a, 0x21, 0x56, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x24, 0x0a, 0x0b, 0x6d, 0x69, 0x6e, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, + 0x52, 0x0a, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x24, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, + 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x02, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x48, 0x03, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x55, 0x70, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, + 0x19, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x06, 0x52, 0x17, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2e, + 0x0a, 0x10, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, + 0x65, 0x72, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x0f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2b, + 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x1a, 0x61, + 0x64, 0x6a, 0x75, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x5f, 0x69, + 0x66, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, 0x49, 0x66, + 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x0f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, + 0x2b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x0a, 0x52, 0x0b, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x52, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, 0x65, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x75, + 0x70, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, + 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x73, + 0x73, 0x22, 0x85, 0x07, 0x0a, 0x23, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x26, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x69, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x01, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x48, + 0x02, 0x52, 0x11, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x48, 0x05, 0x52, 0x17, 0x6d, + 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x27, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x6f, + 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x63, 0x18, 0x29, 0x20, 0x01, 0x28, 0x03, 0x48, 0x06, 0x52, 0x22, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, + 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x33, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x75, 0x6c, 0x61, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, 0x18, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x42, 0x15, 0x0a, 0x13, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x2a, 0x0a, 0x28, 0x5f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x73, 0x65, 0x63, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x75, 0x6c, 0x61, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, + 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xe7, 0x1e, 0x0a, 0x1c, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xb1, 0x01, 0x0a, - 0x16, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 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, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x48, 0x00, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x22, 0xfd, 0x02, 0x0a, 0x0f, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6c, 0x69, - 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x23, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x20, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x55, 0x0a, 0x25, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, - 0x52, 0x21, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, - 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x1c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x42, 0x26, - 0x0a, 0x24, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x28, 0x0a, 0x26, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x22, 0xb0, 0x02, 0x0a, 0x22, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x19, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, - 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x01, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x42, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x5b, 0x0a, 0x14, 0x63, 0x70, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x63, + 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x61, 0x0a, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x15, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, + 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5b, 0x0a, 0x14, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x67, + 0x70, 0x75, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x64, 0x0a, 0x19, 0x67, 0x70, 0x75, 0x5f, 0x76, 0x72, 0x61, 0x6d, 0x5f, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x16, 0x67, 0x70, 0x75, 0x56, 0x72, 0x61, 0x6d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x12, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x6f, 0x72, + 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x11, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x02, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, + 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x39, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, + 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, + 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x3d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, + 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x18, 0x47, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, + 0x31, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x10, 0x6d, + 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x59, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, + 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x2d, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x06, 0x52, 0x0e, 0x73, 0x74, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x76, 0x4d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x12, 0x35, + 0x0a, 0x14, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x02, 0x48, 0x07, 0x52, 0x12, + 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x56, 0x73, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, + 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x5e, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x08, 0x52, 0x11, 0x64, 0x72, 0x69, 0x66, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x6d, 0x69, + 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, + 0x52, 0x16, 0x6d, 0x69, 0x6e, 0x56, 0x70, 0x61, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, + 0x60, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, + 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x20, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, + 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x50, + 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x79, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x64, 0x62, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x62, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x64, 0x62, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6d, + 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x64, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x14, 0x70, 0x6d, 0x61, + 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0b, 0x52, 0x12, 0x70, 0x6d, 0x61, 0x78, 0x52, + 0x61, 0x74, 0x69, 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x66, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x48, 0x0c, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x41, 0x0a, 0x1d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1a, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, 0x6c, + 0x65, 0x18, 0x69, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0d, 0x52, 0x17, 0x6a, 0x76, 0x6d, 0x48, 0x65, + 0x61, 0x70, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x69, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x1c, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, + 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x0e, 0x52, 0x19, 0x6a, + 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x48, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x1d, 0x6a, + 0x76, 0x6d, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, + 0x68, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, + 0x28, 0x02, 0x48, 0x0f, 0x52, 0x19, 0x6a, 0x76, 0x6d, 0x4e, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x70, + 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x6a, 0x76, 0x6d, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x03, 0x48, 0x10, 0x52, 0x17, 0x6a, 0x76, 0x6d, 0x4e, 0x6f, + 0x6e, 0x48, 0x65, 0x61, 0x70, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x69, 0x6e, + 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x6d, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x11, 0x52, 0x0f, 0x6a, 0x76, 0x6d, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x61, 0x70, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x12, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x6e, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x12, 0x52, 0x0f, 0x6a, 0x76, 0x6d, 0x4d, 0x61, 0x78, 0x48, 0x65, 0x61, + 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1c, 0x6a, 0x76, 0x6d, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x19, 0x6a, 0x76, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, + 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, + 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x70, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x13, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x70, 0x75, 0x5f, 0x66, + 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x71, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x14, 0x52, 0x0f, 0x63, 0x70, 0x75, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x72, 0x20, 0x01, 0x28, 0x03, 0x48, 0x15, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x33, 0x0a, 0x13, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x73, 0x20, 0x01, 0x28, 0x03, 0x48, 0x16, 0x52, 0x11, + 0x63, 0x70, 0x75, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, + 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x74, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x17, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x17, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x75, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x18, 0x52, 0x14, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, 0x6f, 0x6f, + 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x76, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x19, 0x52, 0x17, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x6c, + 0x6f, 0x6f, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, + 0x19, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x77, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x1a, 0x52, 0x16, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, + 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, + 0x1c, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x78, 0x20, + 0x01, 0x28, 0x03, 0x48, 0x1b, 0x52, 0x19, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x69, + 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x63, 0x76, 0x5f, 0x6d, 0x61, 0x78, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x79, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x76, 0x73, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, + 0x69, 0x6e, 0x5f, 0x76, 0x70, 0x61, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, + 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, + 0x0a, 0x15, 0x5f, 0x70, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x68, + 0x65, 0x61, 0x70, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x42, 0x1f, 0x0a, 0x1d, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x6e, + 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, 0x61, 0x64, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6a, 0x76, 0x6d, + 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x65, + 0x61, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6a, 0x76, 0x6d, + 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, 0x61, 0x70, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x70, 0x75, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x6c, 0x6f, + 0x6f, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x65, + 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1a, 0x0a, + 0x18, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, + 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1f, 0x0a, 0x1d, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x61, 0x10, 0x62, 0x52, 0x14, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x6d, 0x70, 0x61, 0x22, 0x8b, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 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, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x12, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, + 0x65, 0x22, 0x64, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xb1, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x48, + 0x00, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xfd, 0x02, 0x0a, 0x0f, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x25, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x23, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x25, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x21, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x65, + 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x42, 0x28, 0x0a, 0x26, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xa4, 0x03, 0x0a, 0x22, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x48, 0x01, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, + 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, + 0x02, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0xb2, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, - 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, - 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x5b, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 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, 0x26, 0x0a, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, - 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, - 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 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, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, - 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x10, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, 0x06, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x22, 0xe1, 0x06, 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, - 0x63, 0x74, 0x12, 0x47, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, - 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x1a, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x75, 0x6c, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x22, 0xed, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, + 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x22, 0x5b, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 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, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xfb, 0x02, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x54, 0x6f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 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, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, + 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x00, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xe1, 0x06, + 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x47, 0x0a, 0x16, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, + 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, + 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, + 0x6e, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x17, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, + 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, + 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x54, 0x0a, 0x1d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, + 0x79, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, + 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x5c, 0x0a, 0x21, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, - 0x6e, 0x65, 0x79, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, - 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x70, 0x75, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x54, 0x0a, 0x1d, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, - 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x19, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x70, + 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, - 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, 0x70, 0x75, 0x43, 0x6f, - 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x5c, 0x0a, 0x21, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1d, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x73, 0x74, - 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x4e, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, - 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, - 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, - 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x56, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x67, 0x70, 0x75, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, - 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, - 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3c, 0x0a, 0x18, - 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, - 0x52, 0x15, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x73, 0x50, - 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x65, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x22, 0x91, 0x0e, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, - 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x71, 0x0a, 0x21, 0x6b, 0x65, 0x64, 0x61, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x6b, 0x65, 0x64, 0x61, - 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, - 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, - 0x73, 0x65, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, - 0x69, 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x12, 0x21, - 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, - 0x01, 0x12, 0x43, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6c, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x48, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x48, 0x04, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x06, 0x52, 0x0c, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x48, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x75, - 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x49, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x06, 0x72, - 0x75, 0x6c, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x14, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, 0x12, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x09, 0x52, 0x13, - 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x53, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, - 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x48, 0x0b, 0x52, 0x0a, 0x63, 0x6f, - 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1d, 0x75, - 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x5c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, - 0x0c, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x5d, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x69, 0x76, 0x65, - 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x23, - 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xd3, - 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, - 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x11, - 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x64, 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x1a, 0x6e, 0x0a, 0x1d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, 0x6f, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 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, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x65, 0x0a, 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x4f, 0x0a, 0x13, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x8c, 0x01, - 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x47, 0x70, 0x75, 0x43, 0x6f, + 0x73, 0x74, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x33, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3c, 0x0a, 0x18, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, + 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x15, 0x65, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x74, + 0x68, 0x88, 0x01, 0x01, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x22, 0x8b, 0x14, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x19, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x71, 0x0a, 0x21, 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1e, 0x6b, 0x65, 0x64, 0x61, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x75, + 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x73, 0x65, 0x4c, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x07, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x13, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x29, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x4f, 0x0a, 0x17, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, + 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x16, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x33, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, + 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa3, 0x01, 0x0a, - 0x23, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, + 0x63, 0x79, 0x48, 0x04, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x3e, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x06, 0x52, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x48, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x49, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x06, 0x72, 0x75, 0x6c, + 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0a, 0x72, + 0x75, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, + 0x52, 0x16, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x14, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x52, + 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x15, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x52, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x76, 0x65, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, + 0x0b, 0x52, 0x13, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x53, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x6a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, + 0x63, 0x74, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x48, 0x0e, 0x52, 0x0a, + 0x63, 0x6f, 0x73, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, + 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x5c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, + 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x5d, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x54, 0x0a, 0x17, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x65, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x15, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x14, 0x74, 0x6f, 0x6c, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x67, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x49, 0x0a, + 0x16, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, + 0x61, 0x6b, 0x65, 0x52, 0x13, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x12, 0x4a, 0x0a, 0x11, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x6c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x0f, 0x52, + 0x10, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x88, 0x01, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6d, + 0x61, 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, 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, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, + 0xc8, 0x03, 0x0a, 0x10, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x08, 0x69, + 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x52, 0x08, 0x69, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x10, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x3a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x48, 0x00, 0x52, + 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x09, + 0x64, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x65, 0x63, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x72, 0x69, 0x73, 0x6b, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, + 0x3c, 0x0a, 0x1a, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x61, + 0x64, 0x62, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x18, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x61, 0x64, 0x62, 0x61, 0x6e, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x22, 0x69, 0x0a, 0x11, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xb9, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, + 0x68, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x08, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x76, + 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x45, + 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x66, 0x74, 0x65, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x18, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, + 0x67, 0x65, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x35, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x2f, + 0x0a, 0x03, 0x67, 0x70, 0x75, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x03, 0x67, 0x70, 0x75, 0x12, + 0x23, 0x0a, 0x0d, 0x6f, 0x6f, 0x6d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x6f, 0x6d, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x09, 0x63, 0x70, 0x75, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x0a, + 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x88, 0x01, 0x0a, 0x1a, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, + 0x6c, 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, 0x25, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x6f, 0x73, 0x63, 0x69, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x73, 0x4f, 0x73, + 0x63, 0x69, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x6e, 0x63, 0x79, 0x22, 0xea, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x3e, 0x0a, 0x0b, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x51, + 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x11, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0xa6, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, + 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, + 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x75, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x22, 0x85, 0x01, 0x0a, 0x23, 0x47, + 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x69, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xd3, 0x01, + 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x1f, 0x0a, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, - 0x64, 0x73, 0x22, 0x9e, 0x03, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0a, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x60, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 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, 0x12, 0x21, 0x0a, 0x0c, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, + 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, - 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, - 0xa8, 0x03, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x11, 0x72, + 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, + 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x54, 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, + 0x6f, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x1a, + 0x6e, 0x0a, 0x1d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x54, 0x6f, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x64, 0x54, 0x61, 0x72, 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, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x65, 0x0a, 0x21, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x4f, 0x0a, 0x13, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x8c, 0x01, 0x0a, + 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x40, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x23, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x73, 0x22, 0x9e, 0x03, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x65, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x1a, 0x63, 0x0a, - 0x0e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x0d, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0xbc, 0x01, - 0x0a, 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 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, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x1f, 0x0a, 0x1d, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd9, 0x02, - 0x0a, 0x1a, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x75, - 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x5c, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x1a, 0x0a, - 0x18, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1d, 0x0a, 0x1b, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xd7, 0x02, 0x0a, 0x21, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, - 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, - 0x0a, 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0xbd, 0x01, 0x0a, 0x22, 0x52, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x33, 0x0a, 0x07, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, - 0x67, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x61, - 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x0f, 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x22, 0x64, 0x0a, 0x19, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, - 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, - 0x4c, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, - 0x1a, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x60, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x62, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x10, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xa9, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 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, 0x49, 0x0a, 0x1b, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x8d, - 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0xa8, + 0x03, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x70, 0x12, 0x65, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, 0x70, 0x1a, 0x63, 0x0a, 0x0e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x56, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0xbc, 0x01, 0x0a, + 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 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, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd9, 0x02, 0x0a, + 0x1a, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x8f, - 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, + 0x72, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x75, 0x6c, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x5c, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1d, 0x0a, 0x1b, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x36, 0x0a, 0x1c, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xd7, + 0x02, 0x0a, 0x21, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, + 0x19, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x22, 0xbd, 0x01, 0x0a, 0x22, 0x52, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x33, 0x0a, 0x07, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x07, 0x73, 0x61, 0x76, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, + 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x22, 0x64, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x2e, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x4c, + 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x1a, + 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 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, 0x49, 0x0a, 0x1b, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x8d, 0x01, + 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 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, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x8f, 0x01, + 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x22, 0x8e, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x8e, 0x01, 0x0a, 0x29, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 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, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x22, 0x9b, 0x02, 0x0a, 0x2a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 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, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x22, 0x9b, 0x02, 0x0a, 0x2a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, - 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x52, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, - 0x78, 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 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, 0xc2, 0x02, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x10, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x75, 0x6e, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3b, - 0x0a, 0x1a, 0x61, 0x6b, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x61, 0x6b, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x52, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 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, - 0x9a, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xaf, 0x01, 0x0a, - 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x52, 0x0b, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x78, + 0x0a, 0x1d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x22, 0x5b, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 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, 0xc2, 0x02, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x75, 0x6e, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x1a, 0x61, 0x6b, 0x73, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x61, 0x6b, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x58, 0x0a, 0x1e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x72, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x2e, - 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xd4, - 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, - 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 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, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 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, 0x22, 0xd2, 0x01, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x64, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0b, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbd, 0x01, - 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, - 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x23, - 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x32, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 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, 0x22, 0x4a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x5e, 0x0a, - 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xc5, 0x01, 0x0a, 0x1f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x68, 0x61, 0x73, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x68, 0x61, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0b, + 0x68, 0x61, 0x73, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x43, 0x61, 0x73, 0x74, 0x41, 0x69, 0x22, 0x52, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 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, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x46, 0x0a, - 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xf4, 0x01, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, - 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x24, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 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, 0x9a, 0x02, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xaf, 0x01, + 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x22, + 0x2e, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x5b, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0xee, 0x01, 0x0a, - 0x25, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x79, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x62, - 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x61, 0x0a, 0x10, 0x42, 0x79, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, - 0x23, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x1b, 0x0a, - 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x4f, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, - 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xf5, 0x17, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x46, 0x0a, - 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, - 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x43, 0x70, 0x75, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x12, - 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x18, 0x71, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, - 0x69, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x54, 0x69, 0x70, - 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x54, 0x69, 0x70, 0x88, - 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1e, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, - 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, - 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x54, 0x69, - 0x70, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, - 0x72, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, - 0x12, 0x2b, 0x0a, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, - 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x25, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x08, 0x7a, 0x6f, 0x6e, 0x65, 0x73, - 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2e, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x08, 0x52, 0x10, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2f, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x54, - 0x79, 0x70, 0x65, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x74, - 0x69, 0x70, 0x18, 0x30, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x54, 0x69, 0x70, 0x88, - 0x01, 0x01, 0x12, 0x36, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x33, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, - 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0e, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x37, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, - 0x6e, 0x74, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, - 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, - 0x39, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x09, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x54, - 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, - 0x52, 0x0e, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, - 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x09, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3c, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, - 0x69, 0x6e, 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x6f, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x48, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x77, 0x73, 0x12, - 0x2a, 0x0a, 0x03, 0x67, 0x63, 0x70, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x30, 0x0a, 0x05, 0x61, - 0x7a, 0x75, 0x72, 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, - 0x03, 0x6f, 0x63, 0x69, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, - 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x55, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x0f, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x56, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0b, 0x7a, 0x6f, 0x6e, 0x61, - 0x6c, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, - 0x69, 0x66, 0x74, 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, - 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, - 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6e, 0x20, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x22, 0xa3, 0x02, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xb8, 0x01, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x37, 0x0a, + 0x25, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xc0, 0x02, 0x0a, 0x1a, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x54, 0x6f, 0x6f, 0x6c, 0x12, 0x3b, + 0x0a, 0x0b, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6f, 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, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x70, 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, - 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x0a, 0x18, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, - 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, - 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, - 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, - 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x61, 0x69, - 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, 0x69, 0x73, 0x72, - 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, - 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xaf, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x0a, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0f, 0x61, + 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, 0x6f, + 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x42, 0x79, 0x22, 0x62, 0x0a, 0x28, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 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, 0xa6, 0x01, + 0x0a, 0x29, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x63, + 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, + 0x63, 0x74, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, + 0x18, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x64, 0x65, 0x76, 0x5f, 0x7a, 0x65, 0x72, + 0x6f, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x44, 0x65, 0x76, 0x5a, 0x65, 0x72, 0x6f, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x22, 0x91, 0x01, 0x0a, 0x2c, 0x41, 0x63, 0x6b, 0x6e, 0x6f, + 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, + 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x6b, 0x6e, + 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x64, 0x42, 0x79, 0x22, 0x3f, 0x0a, 0x2d, 0x41, 0x63, + 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x17, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, + 0x6d, 0x6c, 0x22, 0x5c, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 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, 0x64, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x83, 0x01, 0x0a, + 0x21, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0x5d, 0x0a, 0x27, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x6e, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x6e, 0x72, 0x63, 0x22, 0xb2, 0x03, 0x0a, 0x18, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x60, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x41, 0x64, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 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, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 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, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, + 0x6e, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x57, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0xd2, 0x01, 0x0a, 0x18, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, + 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x64, 0x0a, + 0x1e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x42, 0x0a, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x4a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x22, 0x5e, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0x46, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xa6, 0x02, 0x0a, 0x19, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x33, 0x0a, 0x16, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x13, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, - 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x59, 0x61, 0x6d, 0x6c, - 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x72, 0x49, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, + 0x0a, 0x0d, 0x62, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x62, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x1a, 0x61, 0x0a, 0x10, 0x42, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x75, 0x0a, 0x23, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x24, + 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x4f, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x66, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8c, 0x1a, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, + 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, + 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, + 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, + 0x75, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x12, 0x48, 0x0a, + 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, + 0x69, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, + 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, + 0x3e, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, + 0x65, 0x73, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, + 0x3c, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x45, 0x0a, + 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x6e, 0x76, 0x6d, 0x65, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x4e, 0x76, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, + 0x01, 0x12, 0x37, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, + 0x6c, 0x69, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x70, 0x75, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, 0x73, + 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x16, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x79, 0x70, 0x65, 0x72, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x16, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, 0x73, 0x5f, + 0x74, 0x69, 0x70, 0x18, 0x75, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, + 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x72, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x07, 0x52, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x76, 0x6d, 0x65, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, + 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x05, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0d, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x25, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0d, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x11, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x20, 0x0a, 0x09, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2d, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x08, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x54, 0x69, 0x70, + 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, + 0x52, 0x10, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x54, + 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x0a, 0x52, 0x0f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, + 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, + 0x36, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x38, + 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x35, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0a, 0x64, 0x69, + 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, + 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x37, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x22, + 0x0a, 0x0a, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x0c, 0x52, 0x09, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x54, 0x69, 0x70, 0x88, + 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x0e, 0x64, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, + 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3b, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x09, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x54, 0x69, + 0x70, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, + 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x0f, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x54, 0x61, 0x69, 0x6e, 0x74, + 0x73, 0x54, 0x69, 0x70, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x48, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, + 0x67, 0x63, 0x70, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x63, + 0x69, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x55, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x10, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0b, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, + 0x68, 0x69, 0x66, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, + 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x6f, 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, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x18, 0x70, 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, 0x59, 0x0a, - 0x1f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x22, 0xb0, 0x03, 0x0a, 0x20, 0x53, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, - 0x0e, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x4e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x6e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, - 0x63, 0x0a, 0x0f, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, - 0x65, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x1a, 0x61, 0x0a, 0x11, 0x4e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x12, 0x4e, 0x67, 0x54, 0x6f, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa4, 0x01, 0x0a, 0x2a, - 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, - 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x22, 0x8d, 0x02, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, - 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x12, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x22, 0x86, 0x03, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, - 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, - 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, - 0x6e, 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, - 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x61, - 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x01, 0x52, - 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, 0x0a, 0x2b, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, - 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x6b, 0x69, - 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x73, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x76, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x44, 0x0a, 0x1e, 0x75, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, + 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x77, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x75, 0x6e, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x69, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, + 0x0a, 0x19, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x79, 0x70, 0x65, + 0x72, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1b, 0x0a, 0x19, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6e, 0x76, 0x6d, 0x65, 0x5f, + 0x74, 0x69, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x73, 0x5f, 0x74, 0x69, + 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x18, 0x0a, + 0x16, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x61, 0x69, 0x6e, + 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, 0x69, 0x73, 0x72, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x69, 0x70, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0xaf, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x12, 0x2e, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x73, 0x22, 0x5d, 0x0a, 0x27, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x6e, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x03, 0x6e, 0x72, 0x63, 0x22, 0xb2, 0x03, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 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, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x5f, 0x79, + 0x61, 0x6d, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, + 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x12, 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, 0x59, 0x0a, 0x1f, + 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x22, 0xb0, 0x03, 0x0a, 0x20, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0e, + 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4e, + 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x6e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x63, + 0x0a, 0x0f, 0x6e, 0x67, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x67, 0x54, 0x6f, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x1a, 0x61, 0x0a, 0x11, 0x4e, 0x67, 0x54, 0x6f, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x12, 0x4e, 0x67, 0x54, 0x6f, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd6, 0x01, 0x0a, 0x24, 0x53, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 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, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x22, 0xf0, 0x02, 0x0a, 0x25, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x09, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x09, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, + 0x3e, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0xc1, 0x01, 0x0a, 0x28, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0xcb, 0x02, + 0x0a, 0x1e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x22, 0xe5, 0x05, 0x0a, 0x14, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2d, 0x0a, + 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x30, 0x0a, 0x06, + 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x52, 0x06, 0x66, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x12, 0x36, + 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x76, 0x69, + 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x46, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x75, + 0x73, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x53, 0x61, 0x76, 0x69, + 0x6e, 0x67, 0x73, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x18, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x16, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x12, 0x49, 0x0a, 0x1f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, + 0x73, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x1b, 0x75, + 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x42, 0x20, 0x0a, + 0x1e, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, + 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x75, 0x73, 0x64, 0x42, + 0x22, 0x0a, 0x20, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x5f, + 0x75, 0x73, 0x64, 0x22, 0x96, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2c, 0x0a, 0x12, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, + 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xc2, 0x01, 0x0a, + 0x12, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x12, 0x3b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x66, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x22, 0x89, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0xc9, 0x02, + 0x0a, 0x11, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x3c, 0x0a, 0x0e, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x0d, + 0x65, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x34, 0x0a, + 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x1e, 0x75, 0x6e, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x75, 0x6e, 0x72, + 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x2a, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, + 0x64, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x8d, 0x02, 0x0a, 0x28, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 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, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x12, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x3c, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x86, 0x03, 0x0a, 0x0d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, - 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x29, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x12, 0x3e, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x3e, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, - 0x11, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 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, 0x22, 0x54, 0x0a, 0x1e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x22, 0x55, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 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, - 0x22, 0x53, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, + 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x01, 0x52, 0x10, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x5a, 0x0a, 0x2b, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x05, + 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x29, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, + 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x22, 0x2b, 0x0a, 0x15, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, + 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2b, + 0x0a, 0x15, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x11, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 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, 0x22, 0x54, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x55, + 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x51, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xbf, 0x03, 0x0a, - 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x6e, 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, 0x6f, - 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, 0x39, 0x0a, 0x0a, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x70, 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, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x37, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x22, 0x53, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x32, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x22, 0x51, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc1, - 0x01, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x4c, 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, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xbf, 0x03, 0x0a, 0x10, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x6e, 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, 0x6f, 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, 0x12, - 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x22, 0x55, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x10, 0x5a, 0x6f, - 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, - 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, - 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x30, - 0x0a, 0x14, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x76, - 0x69, 0x63, 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x66, - 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5a, 0x6f, 0x6e, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x22, 0x47, 0x0a, 0x05, 0x54, 0x61, 0x69, 0x6e, 0x74, 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, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x10, 0x44, 0x69, 0x73, - 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x02, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x35, 0x0a, - 0x17, 0x74, 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, - 0x74, 0x74, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, 0x65, 0x72, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, - 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x32, 0x0a, - 0x07, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, - 0x73, 0x22, 0x3a, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x86, 0x0a, - 0x0a, 0x10, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x4e, 0x0a, 0x15, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, - 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x13, 0x73, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, - 0x6d, 0x73, 0x12, 0x64, 0x0a, 0x1d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, - 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x1a, 0x73, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x23, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x20, - 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x12, 0x42, 0x0a, 0x1b, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x18, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, - 0x74, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x12, 0x61, 0x6d, 0x69, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x10, 0x61, 0x6d, 0x69, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x61, - 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x09, 0x61, 0x6d, 0x69, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, - 0x01, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, - 0x67, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, - 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x05, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x4e, 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x54, 0x0a, 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x06, 0x52, 0x13, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x07, 0x52, 0x12, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x10, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x08, - 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0x1e, 0x0a, 0x1c, - 0x5f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x61, 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x6f, - 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, - 0x6c, 0x65, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x16, 0x0a, - 0x14, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x45, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, - 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x11, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, - 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, - 0x73, 0x22, 0x42, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3b, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x52, - 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, 0x49, + 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, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x70, 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, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc1, 0x01, 0x0a, + 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x4c, 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, 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, 0x12, 0x6c, 0x61, + 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x55, 0x0a, 0x16, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x10, 0x5a, 0x6f, 0x6e, 0x61, + 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x13, + 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x7a, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x68, + 0x69, 0x66, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x5a, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x30, 0x0a, 0x14, + 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x76, 0x69, 0x63, + 0x74, 0x49, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x66, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5a, 0x6f, 0x6e, 0x65, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x22, 0x47, + 0x0a, 0x05, 0x54, 0x61, 0x69, 0x6e, 0x74, 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, 0x12, + 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x22, 0x7a, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x72, 0x75, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xc9, 0x02, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x17, 0x74, + 0x74, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x74, + 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x41, 0x66, 0x74, 0x65, 0x72, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x47, 0x0a, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1d, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x62, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x3a, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x63, 0x70, 0x75, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x86, 0x0a, 0x0a, 0x10, + 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x4e, 0x0a, 0x15, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x13, 0x73, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, + 0x12, 0x64, 0x0a, 0x1d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x1a, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x23, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x20, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x42, + 0x0a, 0x1b, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x18, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x45, 0x0a, 0x12, 0x61, 0x6d, 0x69, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x10, 0x61, 0x6d, 0x69, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x6d, 0x69, + 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x09, 0x61, 0x6d, 0x69, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, + 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x57, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x12, 0x3b, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x05, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, + 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, + 0x15, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x06, 0x52, 0x13, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x07, 0x52, 0x12, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x10, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x08, 0x52, 0x0f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0x1e, 0x0a, 0x1c, 0x5f, 0x61, + 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, + 0x6d, 0x69, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x6f, 0x6c, 0x65, + 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x16, 0x0a, 0x14, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x45, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x11, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x52, 0x10, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x22, + 0x42, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x52, 0x0d, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x5b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x52, 0x0e, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x22, 0x49, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x0c, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x48, 0x0a, 0x0d, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x0c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5f, 0x0a, 0x10, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, + 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x12, 0x12, 0x0a, 0x04, + 0x76, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x76, 0x63, 0x70, 0x75, + 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x5f, 0x0a, 0x10, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x23, - 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x50, 0x55, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x76, 0x63, 0x70, 0x75, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x10, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x22, 0x6a, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, - 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x6a, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x13, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, + 0x55, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x70, 0x75, 0x73, 0x22, + 0x46, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x5f, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x41, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x22, 0x53, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0d, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x43, 0x70, 0x75, 0x73, 0x22, 0x46, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x5f, 0x0a, - 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x52, - 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x97, - 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, - 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, - 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0xb9, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, - 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, - 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, + 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, + 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0xb9, 0x01, 0x0a, 0x19, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, + 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, + 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcc, + 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, + 0x72, 0x6d, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x49, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0xf6, 0x01, + 0x0a, 0x0f, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, + 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, + 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x73, 0x6d, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x73, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, + 0x09, 0x54, 0x61, 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, 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, 0xc2, 0x0a, 0x0a, 0x14, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, 0x6e, 0x73, + 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x73, 0x50, + 0x65, 0x72, 0x43, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x0f, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6b, 0x75, 0x62, + 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x12, 0x53, + 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x6f, 0x66, 0x74, 0x12, 0x76, 0x0a, 0x1a, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, + 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x17, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, + 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x0a, 0x1d, 0x65, + 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, + 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x02, 0x52, 0x19, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x78, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, + 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, + 0x4c, 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, + 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, + 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x1a, + 0x41, 0x0a, 0x13, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 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, 0xf6, 0x01, 0x0a, 0x0f, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x35, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x49, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x54, 0x65, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, - 0x0a, 0x0d, 0x73, 0x73, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x73, 0x6d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0xc2, 0x0a, 0x0a, - 0x14, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x64, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x44, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, - 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, - 0x0b, 0x70, 0x6f, 0x64, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x59, 0x0a, 0x0f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x6b, 0x75, - 0x62, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, - 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x72, 0x64, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x61, 0x72, 0x64, 0x12, 0x53, 0x0a, 0x0d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x65, 0x76, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x12, 0x76, 0x0a, 0x1a, 0x65, 0x76, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x76, 0x69, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x17, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x45, 0x0a, 0x1d, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, + 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x1c, 0x45, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 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, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, + 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x19, 0x65, 0x76, 0x69, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x47, 0x72, 0x61, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, - 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, - 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, - 0x74, 0x61, 0x88, 0x01, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, + 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x22, 0xb4, 0x01, 0x0a, 0x12, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x03, 0x65, 0x62, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x48, 0x01, 0x52, 0x03, 0x65, 0x62, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x0a, 0x72, 0x6f, 0x6f, + 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, + 0x62, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x22, 0x9d, 0x04, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6e, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x65, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, + 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, + 0x0a, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x04, + 0x69, 0x6f, 0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0a, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x6b, + 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, + 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x18, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, + 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, + 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, + 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x69, 0x6f, 0x70, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, + 0x70, 0x75, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0c, 0x68, 0x74, 0x74, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x12, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, + 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x70, 0x76, 0x36, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, + 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x6f, 0x70, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x68, + 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x5f, 0x69, 0x70, 0x76, 0x36, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, + 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xfa, 0x04, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, + 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, + 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, + 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x15, 0x6b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x14, 0x6b, 0x75, 0x62, 0x65, + 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x12, 0x25, 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x1a, + 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3f, 0x0a, 0x11, 0x45, 0x76, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4a, 0x0a, 0x1c, 0x45, - 0x76, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x47, 0x72, 0x61, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 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, 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, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, - 0x70, 0x6f, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x63, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x21, 0x0a, 0x1f, - 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, - 0x61, 0x22, 0xb4, 0x01, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x24, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, - 0x0a, 0x03, 0x65, 0x62, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x01, 0x52, 0x03, 0x65, 0x62, 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x72, 0x6f, - 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x02, 0x52, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x88, 0x01, 0x01, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x62, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9d, 0x04, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x13, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x21, 0x0a, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x02, 0x52, 0x04, 0x69, 0x6f, 0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, - 0x0a, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x03, 0x52, 0x08, 0x6b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, - 0x68, 0x70, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x05, 0x52, 0x0a, 0x74, 0x68, - 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x06, 0x52, 0x18, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, - 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0a, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x69, 0x6f, 0x70, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, - 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb0, 0x02, 0x0a, 0x0f, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x0d, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x49, 0x70, 0x76, 0x36, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, - 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, - 0x52, 0x17, 0x68, 0x74, 0x74, 0x70, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x6f, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x03, 0x52, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x88, - 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x68, 0x6f, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xfa, 0x04, 0x0a, 0x10, - 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x14, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x74, 0x65, 0x72, 0x6d, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x12, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x56, 0x0a, 0x15, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, - 0x52, 0x14, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, - 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x61, 0x67, 0x73, 0x12, 0x25, - 0x0a, 0x05, 0x64, 0x69, 0x73, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, 0x6b, 0x52, 0x05, - 0x64, 0x69, 0x73, 0x6b, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6b, 0x75, 0x62, + 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x3c, 0x0a, 0x14, 0x47, 0x43, 0x50, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, + 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0xb6, 0x01, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x44, 0x69, 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x73, 0x69, 0x7a, 0x65, 0x47, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0xa5, 0x04, 0x0a, 0x12, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x29, 0x0a, 0x0e, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x76, 0x6e, 0x65, 0x74, + 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0f, 0x6f, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x6f, 0x73, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x47, 0x62, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x20, 0x0a, 0x09, 0x66, 0x69, 0x70, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x66, 0x69, 0x70, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x6b, + 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x04, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, + 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, + 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 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, 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, 0x0f, 0x0a, - 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3c, 0x0a, 0x14, 0x47, 0x43, 0x50, 0x49, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x62, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x70, + 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xc4, 0x06, 0x0a, 0x19, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x31, 0x0a, 0x12, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, + 0x70, 0x75, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, + 0x6f, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x63, 0x70, 0x75, + 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x63, + 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, + 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, + 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, + 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x15, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, + 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x6e, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x6e, 0x73, 0x61, 0x66, + 0x65, 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, + 0x0a, 0x0e, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x64, 0x50, 0x69, 0x64, + 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x63, 0x70, + 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, + 0x74, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, + 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, + 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x19, + 0x0a, 0x17, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, + 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, + 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x61, 0x0a, 0x14, 0x4f, 0x43, 0x49, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, - 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xb6, 0x01, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x44, 0x69, - 0x73, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x69, 0x7a, 0x65, 0x47, 0x69, 0x62, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x30, 0x0a, - 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x2e, 0x0a, 0x13, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x6f, 0x6f, - 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, 0x6f, 0x6f, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, - 0xe9, 0x03, 0x0a, 0x12, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x0e, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, - 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0c, 0x76, 0x6e, 0x65, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x2a, 0x0a, 0x0f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x6f, 0x73, - 0x44, 0x69, 0x73, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x47, 0x62, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, - 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, - 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x69, 0x70, 0x73, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x66, 0x69, 0x70, 0x73, - 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x12, 0x40, 0x0a, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x7a, 0x75, 0x72, - 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x04, 0x52, 0x07, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x64, 0x73, - 0x88, 0x01, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 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, 0x11, 0x0a, 0x0f, - 0x5f, 0x76, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x6f, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x5f, 0x67, 0x62, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, - 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x70, 0x73, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x64, 0x73, 0x22, 0xc4, 0x06, 0x0a, 0x19, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4b, 0x75, 0x62, 0x65, 0x6c, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x12, 0x63, 0x70, 0x75, - 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x63, 0x70, 0x75, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, - 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x0b, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, - 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, - 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x11, 0x63, 0x70, 0x75, 0x43, 0x66, 0x73, 0x51, 0x75, 0x6f, - 0x74, 0x61, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, 0x1f, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x48, - 0x69, 0x67, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, - 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, - 0x52, 0x1a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x47, 0x63, 0x4c, 0x6f, 0x77, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x17, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x05, 0x52, 0x15, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x73, - 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x6e, 0x73, 0x61, 0x66, 0x65, 0x53, 0x79, 0x73, 0x63, 0x74, - 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x06, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, - 0x6f, 0x67, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, - 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x61, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0e, 0x70, 0x6f, 0x64, 0x5f, - 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x64, 0x50, 0x69, 0x64, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x88, 0x01, 0x01, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x42, 0x17, 0x0a, 0x15, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x63, 0x66, 0x73, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, - 0x67, 0x63, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x67, 0x63, 0x5f, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x1a, 0x0a, 0x18, - 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x69, 0x64, 0x73, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0x61, 0x0a, 0x14, 0x4f, 0x43, 0x49, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x15, 0x4f, 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x1c, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, - 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x0d, 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, - 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x73, 0x12, 0x34, 0x0a, - 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x76, 0x70, 0x75, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, - 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x56, 0x70, 0x75, 0x73, 0x50, 0x65, - 0x72, 0x47, 0x62, 0x22, 0x90, 0x03, 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4c, 0x61, 0x75, 0x6e, 0x63, - 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x62, 0x6f, 0x6f, 0x74, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, - 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x66, 0x69, 0x72, - 0x6d, 0x77, 0x61, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x03, 0x52, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x44, 0x61, 0x74, 0x61, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x23, - 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x1f, 0x69, 0x73, 0x43, - 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, - 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, - 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x26, - 0x0a, 0x24, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x13, 0x4f, 0x43, 0x49, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, - 0x0b, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x47, 0x62, 0x73, 0x12, 0x1e, 0x0a, - 0x0b, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x76, 0x70, 0x75, 0x73, 0x50, 0x65, 0x72, 0x47, 0x62, 0x22, 0x91, 0x08, - 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x63, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x63, 0x6e, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, - 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x46, - 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x17, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x15, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x72, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x15, 0x4f, + 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x1c, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x70, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x09, 0x6d, 0x65, 0x74, - 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x66, 0x72, 0x65, - 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, - 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x46, 0x72, 0x65, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x66, - 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x62, - 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0e, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x0d, + 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, + 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, + 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x47, 0x62, 0x73, 0x12, 0x34, 0x0a, 0x17, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x62, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x6f, 0x6f, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x56, 0x70, 0x75, 0x73, 0x50, 0x65, 0x72, 0x47, 0x62, 0x22, 0x90, 0x03, 0x0a, 0x10, 0x4f, 0x43, + 0x49, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, + 0x0a, 0x10, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, + 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, + 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x51, 0x0a, 0x23, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x04, 0x52, 0x1f, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x66, + 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x55, 0x0a, 0x13, + 0x4f, 0x43, 0x49, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x67, + 0x62, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x47, 0x62, 0x73, 0x12, 0x1e, 0x0a, 0x0b, 0x76, 0x70, 0x75, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x67, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x76, 0x70, 0x75, 0x73, 0x50, 0x65, + 0x72, 0x47, 0x62, 0x22, 0x91, 0x08, 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x76, 0x63, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x63, 0x6e, 0x49, 0x64, 0x12, + 0x43, 0x0a, 0x0e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x0e, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x17, + 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x54, + 0x65, 0x72, 0x6d, 0x52, 0x15, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x09, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, + 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x70, 0x72, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x43, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x50, 0x0a, 0x0e, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x66, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x43, 0x49, 0x42, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x62, + 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0e, 0x6c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4c, 0x61, + 0x75, 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x6c, 0x61, 0x75, + 0x6e, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x44, 0x61, 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, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x46, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x46, - 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x61, 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, 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, 0x0c, 0x0a, 0x0a, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x70, - 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x22, 0x6a, 0x0a, 0x1f, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, - 0x10, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x79, 0x61, - 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, - 0x6f, 0x6c, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xeb, 0x01, - 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4b, 0x61, - 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x77, 0x73, - 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x6b, 0x73, 0x12, 0x2a, 0x0a, 0x03, - 0x67, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x63, 0x69, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x03, 0x6f, 0x63, 0x69, 0x12, 0x25, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x63, - 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x43, 0x66, 0x67, 0x49, 0x64, 0x22, 0x60, 0x0a, 0x10, 0x41, - 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, - 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x43, 0x32, 0x4e, 0x6f, 0x64, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, 0x22, 0x60, 0x0a, - 0x10, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, - 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x61, 0x6b, 0x73, 0x6e, 0x63, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4b, 0x53, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x61, 0x6b, 0x73, 0x6e, 0x63, 0x22, - 0x26, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x70, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x6a, 0x0a, 0x1f, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x10, 0x52, 0x61, 0x77, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x25, 0x0a, 0x0e, + 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x59, + 0x61, 0x6d, 0x6c, 0x22, 0x9b, 0x01, 0x0a, 0x16, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x66, 0x67, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, + 0x68, 0x22, 0xa3, 0x01, 0x0a, 0x1e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x26, 0x0a, 0x0f, + 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x43, + 0x66, 0x67, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x50, 0x0a, 0x16, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x36, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x10, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6a, 0x73, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x73, 0x6f, 0x6e, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 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, 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, 0xe2, 0x04, 0x0a, 0x17, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x43, 0x52, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 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, + 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, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x13, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x1f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x69, 0x74, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x10, 0x6c, 0x61, 0x73, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x0e, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x2c, 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, 0x0a, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5b, 0x0a, 0x1a, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x0f, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x1c, 0x6b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x03, 0x61, 0x77, 0x73, 0x12, 0x2a, 0x0a, 0x03, 0x61, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4b, 0x53, 0x4b, 0x61, + 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x61, 0x6b, 0x73, + 0x12, 0x2a, 0x0a, 0x03, 0x67, 0x63, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x03, 0x67, 0x63, 0x70, 0x12, 0x2a, 0x0a, 0x03, + 0x6f, 0x63, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x03, 0x6f, 0x63, 0x69, 0x12, 0x25, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x63, 0x66, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x29, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x43, 0x66, 0x67, 0x49, 0x64, 0x22, + 0x60, 0x0a, 0x10, 0x41, 0x57, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x65, 0x63, 0x32, 0x6e, 0x63, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x43, + 0x32, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x65, 0x63, 0x32, 0x6e, + 0x63, 0x22, 0x60, 0x0a, 0x10, 0x41, 0x4b, 0x53, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x2a, 0x0a, 0x05, 0x61, 0x6b, 0x73, 0x6e, 0x63, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x4b, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x61, 0x6b, + 0x73, 0x6e, 0x63, 0x22, 0x26, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x45, + 0x43, 0x32, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x45, 0x43, 0x32, 0x4e, 0x6f, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x41, 0x4b, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x41, 0x4b, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x6d, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2a, - 0x0a, 0x0c, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x10, 0x4f, 0x43, - 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, - 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, - 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0b, 0x6e, 0x6f, - 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x4f, 0x43, 0x49, - 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x93, 0x0a, 0x0a, 0x1b, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x6e, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x10, 0x47, 0x43, 0x50, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x0c, 0x47, 0x43, 0x45, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x6d, + 0x0a, 0x10, 0x4f, 0x43, 0x49, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x20, 0x0a, 0x02, 0x6e, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x52, 0x02, 0x6e, 0x70, 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x52, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x2a, 0x0a, + 0x0c, 0x4f, 0x43, 0x49, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x93, 0x0a, 0x0a, 0x1b, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 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, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, + 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, + 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, + 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, + 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, + 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, + 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, + 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, + 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, + 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, + 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, + 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x69, + 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, + 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, + 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, + 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, + 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, + 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, + 0xa3, 0x08, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 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, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3c, 0x0a, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, - 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, - 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, - 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, - 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, - 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, - 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, - 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, - 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, - 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, - 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, - 0x69, 0x62, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, - 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, - 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, - 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, - 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, + 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, + 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, + 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, + 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, + 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, + 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, + 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, + 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, + 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, + 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, + 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, + 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, + 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, + 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, + 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, + 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, - 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, - 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x32, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, - 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, - 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, - 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, - 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, - 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, - 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, - 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, - 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xa3, 0x08, 0x0a, 0x28, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x44, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, - 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, - 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, - 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, - 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, - 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, - 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, - 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, - 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, - 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, - 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, - 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, - 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, - 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, - 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x22, 0x68, 0x0a, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, - 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x44, 0x0a, 0x25, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, - 0x64, 0x22, 0x65, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x43, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x6c, 0x0a, - 0x29, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xc0, 0x08, 0x0a, 0x28, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x64, 0x22, 0x6c, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, + 0xc0, 0x08, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x41, 0x0a, 0x1a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, + 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, + 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, + 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x2b, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, + 0x15, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, + 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, + 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, + 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x3c, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x08, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, + 0x74, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, + 0x61, 0x78, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, + 0x0a, 0x1b, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, + 0x12, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, + 0x75, 0x6c, 0x6c, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, + 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x75, 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, + 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x22, 0x68, 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3b, - 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x01, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x48, - 0x02, 0x52, 0x18, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2e, - 0x0a, 0x11, 0x77, 0x61, 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, - 0x75, 0x6c, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x77, 0x61, 0x72, - 0x6e, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, - 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, - 0x48, 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, - 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x15, 0x63, 0x72, 0x69, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, - 0x6c, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, 0x12, 0x63, 0x72, 0x69, 0x74, - 0x69, 0x63, 0x61, 0x6c, 0x44, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x88, 0x01, - 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, - 0x79, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, - 0x72, 0x6f, 0x6f, 0x6d, 0x44, 0x61, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x6d, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x08, 0x52, - 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x47, 0x69, 0x62, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x6d, 0x61, 0x78, - 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, 0x73, - 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x48, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x6f, - 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x17, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x0a, 0x52, 0x15, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x1a, - 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x77, 0x61, - 0x72, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x64, 0x61, - 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x75, - 0x73, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x68, - 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x45, + 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x60, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x22, 0x45, 0x0a, 0x29, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x22, 0xda, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, - 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, - 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x32, 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, 0x33, 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, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xd4, - 0x02, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x58, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0x6d, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x59, - 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xda, 0x03, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x32, 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, 0x33, + 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, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x22, 0xd4, 0x02, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x57, 0x0a, 0x20, 0x55, 0x70, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x49, + 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x65, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x58, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x22, 0x58, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0x6d, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, + 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x22, 0x59, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x58, 0x0a, 0x20, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x22, 0x3d, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x57, 0x0a, + 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x33, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x58, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x0b, 0x0a, 0x18, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x76, 0x63, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x76, 0x63, 0x4e, - 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, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x2b, 0x0a, - 0x12, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x64, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x75, 0x74, - 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x79, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x52, 0x61, - 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, 0x79, 0x12, 0x20, 0x0a, - 0x0c, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, 0x75, 0x6c, 0x6c, 0x12, - 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, - 0x73, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, 0x73, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, 0x73, 0x64, 0x12, - 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, - 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, 0x73, 0x64, - 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x6d, - 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, 0x6f, 0x6e, 0x74, 0x68, - 0x6c, 0x79, 0x55, 0x73, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x09, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x19, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x28, 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, 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 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, 0x48, 0x03, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x32, 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, 0x33, 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, 0x3f, 0x0a, 0x0e, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x3d, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x04, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, - 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x3f, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x50, 0x76, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0x58, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x22, 0x3d, 0x0a, 0x21, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x0b, 0x0a, 0x18, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, - 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x23, 0x47, 0x65, - 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x70, 0x76, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x76, 0x63, 0x4e, 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, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, + 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x79, 0x74, 0x65, + 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x75, + 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x63, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x67, 0x72, 0x6f, 0x77, 0x74, + 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x64, 0x61, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x67, 0x72, 0x6f, 0x77, + 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, + 0x79, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x64, 0x61, 0x79, 0x73, 0x54, 0x6f, 0x46, + 0x75, 0x6c, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x18, 0x63, 0x6f, + 0x73, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x63, 0x6f, + 0x73, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, + 0x55, 0x73, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, + 0x75, 0x73, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, + 0x79, 0x55, 0x73, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, + 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x5f, 0x75, 0x73, 0x64, 0x18, 0x1b, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4d, + 0x6f, 0x6e, 0x74, 0x68, 0x6c, 0x79, 0x55, 0x73, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x88, + 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x28, 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, 0x3e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, + 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, 0x48, 0x03, 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x32, 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, 0x33, 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, 0x3f, 0x0a, + 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x3c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x76, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x3d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x05, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x22, 0x47, + 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6f, + 0x0a, 0x23, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xba, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbb, 0x01, 0x0a, + 0x25, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x97, 0x01, 0x0a, 0x27, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x17, + 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x24, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x22, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x37, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbb, 0x01, 0x0a, 0x25, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x97, 0x01, 0x0a, 0x27, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, - 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, - 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x22, 0xaa, 0x01, 0x0a, 0x28, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x22, 0x96, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, - 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x96, 0x01, - 0x0a, 0x26, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 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, - 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x27, 0x50, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0b, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, - 0x6f, 0x6e, 0x22, 0x91, 0x05, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, - 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x49, 0x64, 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, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, - 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x12, - 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x10, 0x6e, - 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x0f, 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, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, - 0x66, 0x74, 0x65, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, - 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, - 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, - 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6f, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 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, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6b, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x22, 0xf1, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x23, 0x0a, 0x0d, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x63, 0x70, 0x75, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x12, - 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x61, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, - 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, - 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x11, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, - 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x27, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x74, - 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x43, - 0x70, 0x75, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 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, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x70, - 0x75, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xc4, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, - 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, - 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7f, - 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, - 0xd5, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 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, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x76, 0x63, 0x5f, 0x75, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x76, 0x63, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x27, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x6b, 0x69, 0x70, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x91, 0x05, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, - 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, + 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, + 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, + 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x28, + 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 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, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, + 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6f, 0x0a, 0x21, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcd, 0x01, 0x0a, 0x1c, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, + 0x65, 0x6e, 0x74, 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, 0x1c, 0x0a, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x6b, 0x0a, 0x1d, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf1, 0x04, 0x0a, 0x1c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, + 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, 0x23, + 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, + 0x75, 0x6c, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0e, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x70, 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x70, 0x75, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x41, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x68, 0x72, 0x6f, 0x74, + 0x74, 0x6c, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x64, 0x46, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, + 0x6e, 0x65, 0x77, 0x43, 0x70, 0x75, 0x41, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 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, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6e, 0x65, + 0x77, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xc4, 0x01, 0x0a, 0x28, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x02, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x22, 0x7f, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xcb, 0x08, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x22, 0xd5, 0x01, 0x0a, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 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, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x7b, 0x0a, 0x25, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, + 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, + 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x3a, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x15, 0x0a, + 0x06, 0x6e, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, + 0x6f, 0x74, 0x49, 0x6e, 0x22, 0xe4, 0x10, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, @@ -34092,1713 +51265,4231 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x5e, + 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3e, + 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, + 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, + 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0e, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0f, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, + 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, + 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, + 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, + 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x43, + 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x48, 0x05, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x06, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x48, 0x07, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x08, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, + 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, + 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, + 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, + 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, + 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, + 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, + 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, + 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x0a, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 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, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, + 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, + 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, + 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0xfb, 0x03, 0x0a, 0x1b, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, + 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 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, 0x52, + 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, + 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, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, + 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, + 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, + 0x68, 0x65, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, + 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, + 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, + 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0xa8, 0x0b, 0x0a, 0x27, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, + 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, + 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, + 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, + 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, + 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, + 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, + 0x65, 0x61, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x05, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x06, 0x52, 0x0d, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x07, 0x52, 0x0b, 0x6e, 0x61, 0x6d, + 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x08, 0x52, 0x10, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x09, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, + 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, + 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, + 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, + 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x6b, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x22, 0x61, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x6f, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x43, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xbf, 0x01, + 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x72, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x22, 0xcd, 0x0c, 0x0a, 0x27, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, + 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, + 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6f, 0x6f, + 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, + 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x05, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, + 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, + 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, + 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x07, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, + 0x52, 0x0a, 0x24, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, 0x52, + 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x09, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, + 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x0a, 0x52, 0x0c, 0x6b, + 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, + 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x0b, 0x52, + 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x0c, 0x52, + 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x48, 0x0d, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x05, 0x48, 0x0e, 0x52, 0x15, 0x6c, 0x6f, 0x6f, 0x6b, + 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, + 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, + 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, + 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, + 0x15, 0x10, 0x16, 0x22, 0xd5, 0x01, 0x0a, 0x2f, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x72, 0x75, 0x6c, + 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, + 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x30, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x6b, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xb7, 0x01, + 0x0a, 0x27, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x40, 0x0a, 0x0b, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0a, 0x72, 0x75, 0x6c, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x04, 0x0a, 0x2f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 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, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x48, 0x05, 0x52, 0x10, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x22, 0xed, 0x02, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x45, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0e, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6f, + 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x30, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x22, 0x91, 0x03, 0x0a, 0x1a, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6b, 0x69, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x3c, 0x0a, 0x0e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x37, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x0b, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x41, 0x0a, 0x11, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0xeb, 0x05, 0x0a, + 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 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, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x19, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 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, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x0a, 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, 0x5e, 0x0a, 0x0d, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0f, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, - 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, - 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, - 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 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, 0x0e, - 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, - 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x22, 0xac, 0x06, 0x0a, 0x27, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0f, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, - 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, - 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, - 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, - 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, - 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, - 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x68, 0x70, 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, - 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x22, 0x6b, 0x0a, 0x28, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x61, - 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 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, 0x6f, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, + 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4f, 0x0a, 0x13, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, + 0x12, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x53, 0x0a, 0x0d, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 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, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xfc, 0x01, 0x0a, 0x1c, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x1d, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0x6a, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x22, 0x0a, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xf3, 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3f, + 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x02, 0x52, 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x1c, 0x0a, 0x1a, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, 0x55, 0x0a, + 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, + 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x22, 0x78, 0x0a, 0x24, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x8a, + 0x01, 0x0a, 0x25, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, + 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x22, 0x6a, 0x0a, 0x1c, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0xe5, 0x01, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6f, 0x75, 0x74, + 0x63, 0x6f, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x52, 0x07, 0x6f, 0x75, 0x74, 0x63, 0x6f, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x72, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x22, + 0x4e, 0x0a, 0x07, 0x4f, 0x75, 0x74, 0x63, 0x6f, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x55, + 0x54, 0x43, 0x4f, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x55, 0x54, 0x43, 0x4f, 0x4d, 0x45, 0x5f, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x4f, 0x55, 0x54, 0x43, + 0x4f, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x22, + 0xad, 0x01, 0x0a, 0x24, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 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, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, + 0xf5, 0x03, 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 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, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0e, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x10, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x22, 0x74, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x45, 0x57, 0x5f, 0x45, + 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x41, + 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x5f, + 0x54, 0x48, 0x49, 0x53, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x1c, 0x0a, + 0x18, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4f, 0x54, 0x48, + 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x03, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xfa, 0x01, 0x0a, 0x25, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4f, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x10, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x34, + 0x0a, 0x16, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5d, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x49, 0x64, 0x22, 0xb3, 0x04, 0x0a, 0x19, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, + 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, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x44, 0x0a, 0x0d, 0x75, 0x6e, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x0c, 0x75, 0x6e, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x22, 0x73, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x52, 0x54, + 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x56, 0x45, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x41, 0x42, 0x41, 0x4e, 0x44, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x75, 0x6e, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x95, 0x02, 0x0a, 0x26, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0b, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, + 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 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, 0x87, 0x02, 0x0a, 0x13, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x74, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x79, 0x6e, + 0x63, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x12, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x7c, 0x0a, 0x16, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x1a, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xfe, 0x02, 0x0a, + 0x19, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x51, 0x0a, 0x0c, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6e, + 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x1a, 0xb9, 0x01, 0x0a, 0x0b, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf0, 0x03, + 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x76, 0x65, 0x72, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, + 0x65, 0x76, 0x65, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xe8, 0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x70, 0x6f, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x6f, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x25, 0x0a, 0x0e, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x55, 0x6e, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x41, 0x74, + 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x20, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, + 0x0a, 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x61, 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, 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, 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x22, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x22, 0xf9, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, + 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 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, 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, 0x4e, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, + 0x79, 0x49, 0x44, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x22, 0x68, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xc4, 0x07, 0x0a, 0x27, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, - 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x2d, 0x0a, 0x12, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x0f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x28, 0x0a, 0x0d, 0x63, - 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6d, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x8b, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x20, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa7, + 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x54, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x46, + 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x17, 0x0a, 0x07, + 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x20, 0x0a, 0x1e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, + 0x0a, 0x1e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6c, 0x65, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x1f, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7b, 0x0a, 0x26, 0x42, + 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 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, 0x12, 0x19, 0x0a, + 0x08, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x22, 0x4e, 0x0a, 0x27, 0x42, 0x75, 0x6c, 0x6b, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x27, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x17, 0x0a, + 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x57, 0x0a, 0x17, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe1, + 0x0b, 0x0a, 0x10, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 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, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 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, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x6d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x67, 0x70, 0x75, 0x5f, 0x72, + 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x30, + 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, 0x41, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, 0x70, 0x61, 0x52, 0x75, 0x6c, 0x65, + 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x65, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, + 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, - 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x04, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, + 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, + 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x45, - 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, - 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, - 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, 0x52, 0x0a, 0x68, 0x70, - 0x61, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, - 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, - 0x20, 0x0a, 0x1e, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, - 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x68, 0x70, 0x61, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x22, 0x6b, 0x0a, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x82, - 0x01, 0x0a, 0x27, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x22, 0x2a, 0x0a, 0x28, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xbc, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, - 0x0d, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x61, 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, 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, 0x66, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x22, 0x0a, 0x0a, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, - 0xf9, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, - 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 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, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3e, 0x0a, 0x10, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 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, 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, 0x4e, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, - 0x49, 0x44, 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, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x1b, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, - 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, - 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb1, 0x01, 0x0a, 0x20, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa7, 0x01, - 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, + 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x4d, 0x0a, 0x24, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x72, 0x65, + 0x61, 0x73, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x44, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0a, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x6a, 0x76, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6c, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4a, 0x56, 0x4d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0b, 0x6a, 0x76, 0x6d, 0x48, 0x65, 0x61, 0x70, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, + 0x0a, 0x20, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x1c, 0x6a, 0x76, 0x6d, 0x43, + 0x70, 0x75, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x05, 0x48, 0x06, 0x52, + 0x15, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x12, 0x6b, 0x65, 0x64, + 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, + 0x45, 0x44, 0x41, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x48, 0x07, 0x52, 0x10, 0x6b, 0x65, 0x64, 0x61, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x88, 0x01, 0x01, 0x42, 0x19, + 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, + 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, + 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x23, 0x0a, + 0x21, 0x5f, 0x6a, 0x76, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, + 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x6b, 0x65, 0x64, 0x61, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0xaa, 0x02, 0x0a, 0x1f, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x75, 0x74, + 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x4c, 0x0a, 0x20, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x54, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 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, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x22, 0x46, 0x0a, - 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x71, 0x0a, + 0x21, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 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, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, - 0x6c, 0x65, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, + 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x22, 0x4e, 0x0a, 0x22, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, + 0x22, 0x9f, 0x02, 0x0a, 0x1a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, + 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, + 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x22, 0xdc, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xee, 0x07, 0x0a, 0x10, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, - 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x63, 0x70, 0x75, 0x5f, 0x72, - 0x75, 0x6c, 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, 0x52, 0x75, 0x6c, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x70, 0x75, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, - 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6c, 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, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0a, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x67, - 0x70, 0x75, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x67, 0x70, 0x75, 0x52, 0x75, - 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x68, 0x70, 0x61, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x50, - 0x41, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x68, 0x70, 0x61, - 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4e, 0x0a, 0x12, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x11, 0x65, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x5f, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x28, 0x0a, 0x0d, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x63, 0x72, 0x6f, 0x6e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x6f, 0x6f, - 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x4d, - 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x11, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x17, 0x64, 0x65, 0x66, - 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x76, 0x65, 0x5f, - 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x49, 0x6e, 0x50, 0x6c, 0x61, 0x63, 0x65, - 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, - 0x43, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, - 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x72, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x6d, - 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x22, 0xaa, 0x02, 0x0a, 0x1f, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, + 0x73, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x12, 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x21, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x06, 0x64, 0x62, 0x52, 0x75, 0x6c, + 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 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, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x61, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x22, 0x9c, 0x01, 0x0a, 0x21, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, + 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 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, 0x12, 0x3f, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1f, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, + 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x18, + 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, + 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x22, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, + 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x22, 0x93, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x26, + 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x55, 0x69, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x22, 0xa4, 0x02, 0x0a, 0x25, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xc5, + 0x01, 0x0a, 0x23, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 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, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x04, + 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x6f, 0x0a, 0x26, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x45, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xc6, 0x01, 0x0a, 0x20, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x73, 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, 0x12, 0x38, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x30, + 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, + 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x22, 0xa6, 0x03, 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 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, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x37, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x21, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0xc2, 0x01, 0x0a, 0x1f, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x55, 0x69, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc2, 0x01, 0x0a, 0x17, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, + 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x26, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x37, 0x0a, 0x09, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0x9c, + 0x01, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, + 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0xbb, 0x01, + 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x41, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x22, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xa6, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x36, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x72, 0x0a, 0x20, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x90, 0x01, 0x0a, + 0x21, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x25, 0x0a, + 0x0e, 0x65, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x65, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0xdb, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x62, 0x0a, + 0x28, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 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, 0xf7, 0x01, 0x0a, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, + 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0a, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x6d, 0x0a, 0x29, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x28, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x75, - 0x74, 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x4c, 0x0a, 0x20, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0xef, - 0x01, 0x0a, 0x1a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, + 0x24, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x68, 0x61, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x4a, 0x0a, 0x10, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, + 0x73, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x72, 0x69, 0x75, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x63, 0x72, 0x69, 0x75, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x63, 0x72, 0x69, 0x75, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x63, 0x72, 0x69, 0x75, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x46, 0x72, 0x65, + 0x73, 0x68, 0x22, 0x63, 0x0a, 0x29, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, + 0x12, 0x19, 0x0a, 0x05, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x00, 0x52, 0x05, 0x75, 0x70, 0x70, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x22, 0xa1, 0x02, 0x0a, 0x19, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0b, 0x63, 0x70, 0x75, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x48, 0x00, 0x52, 0x0a, + 0x63, 0x70, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, + 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x73, 0x48, 0x01, 0x52, 0x0d, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x6f, 0x6c, 0x6c, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x70, 0x6f, 0x6c, 0x6c, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x70, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xa6, + 0x02, 0x0a, 0x1a, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2e, 0x0a, + 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, + 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x48, 0x01, 0x52, 0x11, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x6e, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x6f, 0x6e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x6e, 0x5f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, + 0x6e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x8e, 0x06, 0x0a, 0x17, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, + 0x70, 0x68, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, + 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, + 0x1d, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x50, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, 0x52, 0x13, 0x6d, 0x61, 0x78, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, + 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x1a, + 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x06, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x50, 0x65, 0x72, 0x50, 0x6f, 0x64, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x1f, 0x6d, + 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x62, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x07, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x69, 0x7a, 0x65, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x70, 0x6f, 0x64, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, + 0x64, 0x5f, 0x6d, 0x62, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x62, 0x22, 0x89, 0x03, 0x0a, 0x20, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x6f, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x0d, 0x72, + 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, + 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, + 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xe5, 0x02, 0x0a, 0x1a, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x6f, 0x64, 0x12, 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, + 0x70, 0x68, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, + 0x74, 0x61, 0x69, 0x6e, 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, + 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, + 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, + 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x4d, 0x62, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xd9, 0x02, 0x0a, + 0x20, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x28, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, + 0x4f, 0x72, 0x70, 0x68, 0x61, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, + 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, + 0x01, 0x12, 0x2e, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x88, 0x01, + 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x72, 0x70, + 0x68, 0x61, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6d, 0x62, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x22, 0xed, 0x03, 0x0a, 0x1b, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x31, 0x0a, 0x14, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x61, + 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x5f, 0x69, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x18, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x12, 0x4f, 0x0a, 0x10, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x12, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x70, + 0x6f, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x03, 0x0a, 0x0e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x70, 0x65, + 0x63, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x06, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xef, 0x04, 0x0a, + 0x16, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, + 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0c, 0x6d, 0x61, + 0x78, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, + 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x6d, + 0x61, 0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6c, 0x67, + 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x68, 0x61, + 0x73, 0x68, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x54, 0x0a, 0x14, 0x70, + 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x50, 0x6f, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x70, + 0x6f, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0xab, + 0x06, 0x0a, 0x13, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x12, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x11, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, + 0x01, 0x01, 0x12, 0x46, 0x0a, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x48, 0x01, 0x52, 0x10, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x02, 0x52, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x13, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x03, 0x52, 0x12, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x48, 0x04, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x0b, 0x6b, 0x69, 0x6e, 0x64, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, + 0x64, 0x52, 0x0a, 0x6b, 0x69, 0x6e, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, + 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x05, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xba, 0x03, 0x0a, + 0x14, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x3a, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc2, 0x03, 0x0a, 0x1c, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x78, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6c, + 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x32, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x54, 0x0a, 0x1e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, + 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x22, 0x64, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x68, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x66, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x2e, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x4e, 0x0a, 0x1c, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x53, 0x0a, 0x1b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, + 0x38, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x75, 0x0a, 0x22, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x22, 0x5d, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, + 0x99, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x20, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x21, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x72, + 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, 0x34, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0x5a, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x5b, + 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 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, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x3e, 0x0a, 0x22, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x7c, 0x0a, 0x25, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, 0x3a, 0x0a, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0x64, 0x0a, 0x26, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, + 0x6c, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 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, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x78, 0x0a, + 0x24, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x76, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, 0x36, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x5e, 0x0a, 0x24, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x5b, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 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, + 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x24, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x85, + 0x01, 0x0a, 0x2a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x12, 0x30, - 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x75, - 0x6c, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x22, 0xad, 0x02, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x41, 0x0a, 0x11, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x52, 0x10, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x52, 0x10, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x4f, 0x0a, 0x24, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x65, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x22, 0xa0, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x6d, 0x0a, 0x2b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 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, 0x20, 0x0a, 0x09, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x29, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x82, 0x01, + 0x0a, 0x29, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 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, 0x3c, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0x6a, 0x0a, 0x2a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3c, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x63, + 0x0a, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 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, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x49, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x2a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x21, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x22, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xbf, 0x02, 0x0a, 0x18, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x29, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x38, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 0x64, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x34, 0x0a, 0x16, + 0x63, 0x70, 0x75, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x63, 0x70, + 0x75, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x50, 0x61, 0x73, 0x73, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x22, 0xb3, 0x01, 0x0a, 0x1b, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 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, 0x41, 0x0a, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x77, 0x0a, 0x29, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 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, 0x31, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x2a, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, + 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x15, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, + 0x6c, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x23, 0x0a, 0x0d, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x69, 0x64, 0x73, 0x22, + 0xc6, 0x01, 0x0a, 0x31, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 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, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x69, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x22, 0x61, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x22, 0x9c, 0x01, 0x0a, 0x21, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, - 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 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, 0x12, 0x3f, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x22, 0xc1, 0x01, 0x0a, 0x1f, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, - 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 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, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x28, 0x0a, - 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x22, 0x67, 0x0a, 0x22, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, - 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x22, 0xc2, 0x01, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x26, 0x0a, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x2d, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x3b, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x65, - 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x6d, - 0x69, 0x74, 0x49, 0x64, 0x22, 0xbb, 0x01, 0x0a, 0x14, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x31, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x2f, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0xb0, 0x01, 0x0a, 0x32, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x39, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, + 0x70, 0x52, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x70, 0x73, 0x22, 0x88, 0x04, 0x0a, 0x18, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, 0x77, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, + 0x64, 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, + 0x3d, 0x0a, 0x0c, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0b, + 0x70, 0x6f, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, + 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x1b, + 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0e, 0x72, + 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, - 0x41, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb8, 0x01, 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 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, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, + 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x04, 0x0a, 0x02, 0x62, + 0x79, 0x22, 0x7a, 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, + 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xc0, 0x01, + 0x0a, 0x33, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 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, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x04, 0x0a, 0x02, 0x62, 0x79, + 0x22, 0x82, 0x01, 0x0a, 0x34, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x77, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, + 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xf9, 0x02, 0x0a, 0x12, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x75, 0x6e, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x34, 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, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xfa, 0x01, 0x0a, 0x1c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x33, 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, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x34, 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, 0x22, 0x81, + 0x01, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xa6, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x27, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, - 0x72, 0x0a, 0x20, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, + 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x31, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x73, 0x52, 0x07, 0x70, 0x72, 0x65, 0x72, 0x65, + 0x71, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 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, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x22, 0x85, 0x02, 0x0a, 0x2f, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, + 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x52, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x64, 0x0a, 0x2a, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 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, + 0x41, 0x0a, 0x2b, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, + 0x6d, 0x6c, 0x22, 0x6c, 0x0a, 0x32, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 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, 0x49, 0x0a, 0x33, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x61, 0x6d, 0x6c, 0x22, 0x5e, 0x0a, 0x24, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 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, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x21, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x74, - 0x63, 0x68, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x65, 0x6e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x73, - 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x22, 0x57, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 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, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, 0x22, - 0xdb, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, - 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0x45, 0x0a, - 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x79, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x43, 0x4f, 0x4e, - 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x4f, 0x50, - 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, - 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, - 0x5b, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x54, 0x61, 0x6b, 0x65, 0x12, - 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, - 0x45, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x45, 0x54, 0x10, - 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, - 0x41, 0x4b, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, - 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, - 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x53, 0x54, 0x5f, - 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x4d, 0x4f, 0x4e, 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, - 0x0a, 0x0f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x52, 0x55, - 0x4e, 0x10, 0x02, 0x2a, 0xd1, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x67, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x4f, 0x52, 0x50, 0x48, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x4c, + 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, 0x86, 0x01, 0x0a, 0x18, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x22, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x25, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, + 0x0f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x79, 0x0a, 0x0f, 0x52, 0x65, 0x63, + 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, + 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x43, 0x4f, 0x4e, + 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, + 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, + 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x43, 0x49, 0x4c, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x4b, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x5b, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x54, 0x61, 0x6b, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x4f, 0x5f, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, + 0x02, 0x2a, 0x69, 0x0a, 0x0e, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x53, 0x45, 0x52, 0x54, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x54, 0x0a, 0x09, + 0x41, 0x72, 0x67, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x52, 0x47, + 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x52, 0x47, 0x5f, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x41, 0x52, 0x47, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x52, + 0x47, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, + 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, + 0x11, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x5f, 0x4d, 0x4f, 0x4e, + 0x54, 0x48, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x45, 0x52, + 0x49, 0x4f, 0x44, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x02, 0x2a, 0x84, 0x02, 0x0a, 0x18, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x69, 0x67, 0x68, 0x74, 0x53, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, + 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, + 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, + 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, + 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x45, 0x56, + 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x05, + 0x2a, 0x96, 0x02, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x73, 0x69, 0x67, 0x68, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x22, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, + 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x54, + 0x45, 0x52, 0x4e, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, + 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x4e, 0x4f, 0x4d, 0x41, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x45, 0x4e, 0x44, 0x10, 0x03, 0x12, 0x27, 0x0a, 0x23, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x49, 0x53, 0x4b, 0x10, 0x05, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, + 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x06, 0x2a, 0xd9, 0x04, 0x0a, 0x15, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2f, 0x0a, 0x2b, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x41, 0x49, + 0x4e, 0x54, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x01, 0x12, 0x2b, 0x0a, + 0x27, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, + 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x4c, 0x49, 0x43, 0x54, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x46, 0x4c, 0x4f, + 0x4f, 0x52, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x43, 0x45, 0x49, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, + 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x4c, 0x41, 0x54, + 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x4c, 0x4f, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x28, 0x0a, 0x24, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x41, 0x46, 0x45, 0x54, 0x59, 0x5f, 0x46, + 0x4c, 0x4f, 0x4f, 0x52, 0x10, 0x06, 0x12, 0x27, 0x0a, 0x23, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, + 0x2d, 0x0a, 0x29, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, + 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x46, 0x45, 0x41, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x10, 0x08, 0x12, 0x28, + 0x0a, 0x24, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, + 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x29, 0x0a, 0x25, 0x52, 0x45, 0x41, 0x53, + 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, + 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x0a, 0x12, 0x2e, 0x0a, 0x2a, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x46, 0x4c, 0x4f, 0x4f, + 0x52, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x44, 0x45, 0x43, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x43, 0x45, 0x49, 0x4c, + 0x49, 0x4e, 0x47, 0x10, 0x0c, 0x2a, 0xd1, 0x01, 0x0a, 0x1a, 0x4c, 0x69, 0x76, 0x65, 0x4d, 0x69, + 0x67, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4f, 0x52, 0x50, 0x48, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x2c, 0x0a, + 0x28, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, + 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x4c, 0x49, 0x56, 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x42, 0x41, 0x43, - 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x4c, 0x49, 0x56, - 0x45, 0x5f, 0x4d, 0x49, 0x47, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, - 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x47, - 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x03, 0x2a, 0xe7, 0x04, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x1d, 0x52, 0x45, - 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x1a, 0x02, 0x08, - 0x01, 0x12, 0x24, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x50, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x41, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, + 0x45, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x03, 0x2a, 0xe7, 0x04, 0x0a, 0x14, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, + 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x1d, + 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x1a, + 0x02, 0x08, 0x01, 0x12, 0x24, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, + 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x50, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, + 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, + 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, + 0x53, 0x41, 0x56, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, + 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, 0x56, + 0x45, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x52, 0x45, 0x43, + 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, + 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x15, + 0x12, 0x32, 0x0a, 0x2e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, + 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x10, 0x16, 0x12, 0x34, 0x0a, 0x30, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, + 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, + 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x1f, 0x12, 0x31, 0x0a, 0x2d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, 0x10, 0x05, - 0x12, 0x2b, 0x0a, 0x27, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, - 0x56, 0x45, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x12, 0x28, 0x0a, - 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x44, 0x5f, 0x53, 0x41, 0x56, 0x45, 0x44, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, - 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x15, 0x12, 0x32, - 0x0a, 0x2e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, - 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x10, 0x16, 0x12, 0x34, 0x0a, 0x30, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, - 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x53, - 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x1f, 0x12, 0x31, 0x0a, 0x2d, 0x52, 0x45, 0x43, 0x4f, - 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, - 0x47, 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x20, 0x12, 0x21, 0x0a, 0x1d, 0x52, - 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x29, 0x12, 0x21, - 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, 0x10, - 0x2a, 0x2a, 0xba, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, - 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, - 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2e, 0x0a, 0x2a, 0x4e, + 0x54, 0x55, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x20, 0x12, 0x21, 0x0a, + 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x29, + 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, + 0x44, 0x10, 0x2a, 0x2a, 0xba, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, + 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2e, 0x0a, + 0x2a, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x44, 0x5a, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3b, 0x0a, + 0x37, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x5a, 0x5f, + 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, + 0x5f, 0x4e, 0x4f, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, - 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, - 0x5a, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3b, 0x0a, 0x37, 0x4e, - 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, - 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x5a, 0x5f, 0x4d, 0x41, - 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, - 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2f, 0x0a, 0x2b, 0x4e, 0x4f, 0x44, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, - 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4e, - 0x4f, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x03, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, - 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, - 0x52, 0x45, 0x44, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, - 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x2a, 0xba, - 0x01, 0x0a, 0x10, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, - 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x52, 0x47, 0x45, - 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, - 0x4d, 0x45, 0x53, 0x50, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x41, + 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x04, 0x12, 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x2a, 0xb5, 0x01, 0x0a, 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x53, 0x45, 0x54, + 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x27, 0x0a, 0x23, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x5f, 0x50, + 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0xb7, 0x02, 0x0a, 0x0f, 0x53, 0x75, 0x67, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x1c, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, + 0x0a, 0x1b, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, + 0x55, 0x50, 0x5f, 0x44, 0x49, 0x53, 0x52, 0x55, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, + 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, + 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x41, 0x50, 0x41, 0x43, 0x49, 0x54, 0x59, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x5a, 0x4f, 0x4e, 0x45, 0x53, + 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x53, 0x10, 0x05, 0x12, + 0x1e, 0x0a, 0x1a, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x10, 0x06, 0x12, + 0x22, 0x0a, 0x1e, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x47, 0x52, + 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, + 0x59, 0x10, 0x07, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, + 0x10, 0x08, 0x2a, 0x81, 0x02, 0x0a, 0x10, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x46, 0x6c, 0x61, 0x76, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, + 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x55, + 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, + 0x43, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x4c, 0x49, + 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x47, + 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x50, + 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, + 0x52, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, + 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4c, 0x41, 0x56, 0x4f, + 0x52, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x50, 0x52, 0x41, 0x43, 0x54, 0x49, 0x43, 0x45, 0x10, + 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x46, 0x4c, 0x41, 0x56, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x49, + 0x4c, 0x49, 0x54, 0x59, 0x10, 0x06, 0x2a, 0x9c, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x67, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x23, 0x0a, + 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x01, + 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x44, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x55, 0x47, 0x47, 0x45, 0x53, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x52, + 0x4f, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x64, 0x0a, 0x0d, 0x45, 0x76, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, + 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, + 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0x01, 0x12, + 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x49, 0x44, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x50, + 0x45, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x10, 0x02, 0x2a, 0xba, 0x01, 0x0a, 0x10, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, + 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, + 0x50, 0x41, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, + 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, + 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x03, 0x12, 0x1c, 0x0a, - 0x18, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x04, 0x2a, 0x36, 0x0a, 0x13, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x41, 0x49, 0x44, - 0x30, 0x10, 0x00, 0x2a, 0x8b, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, - 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, - 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, - 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, - 0x45, 0x52, 0x5f, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x03, 0x2a, 0xa4, 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x21, - 0x0a, 0x1d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, + 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x10, 0x04, 0x2a, 0x36, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x1f, 0x0a, 0x1b, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, + 0x45, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x52, 0x41, 0x49, 0x44, 0x30, 0x10, 0x00, + 0x2a, 0x8b, 0x01, 0x0a, 0x0d, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, + 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, + 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, + 0x1a, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, + 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, + 0x1b, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, + 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa4, + 0x01, 0x0a, 0x18, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, + 0x0a, 0x1e, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, + 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x45, 0x56, + 0x49, 0x43, 0x54, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x19, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x28, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, + 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x54, 0x45, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x44, - 0x5f, 0x45, 0x56, 0x49, 0x43, 0x54, 0x10, 0x03, 0x2a, 0x8f, 0x01, 0x0a, 0x19, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x28, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, - 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x44, 0x0a, 0x40, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, - 0x55, 0x50, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, - 0x47, 0x47, 0x45, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x43, 0x48, 0x45, - 0x44, 0x55, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x43, 0x48, - 0x45, 0x44, 0x55, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0xd2, 0x02, 0x0a, 0x17, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, + 0x00, 0x12, 0x44, 0x0a, 0x40, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, + 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, + 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, + 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x2a, 0xd2, 0x02, 0x0a, 0x17, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x26, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, + 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, + 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, + 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4e, + 0x4f, 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, - 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, - 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, - 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x53, 0x10, 0x0a, 0x12, 0x31, 0x0a, 0x2d, 0x4e, 0x4f, 0x44, + 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x42, 0x0a, 0x3e, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, - 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x42, 0x0a, 0x3e, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, - 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x53, - 0x5f, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x10, 0x14, - 0x12, 0x3d, 0x0a, 0x39, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, - 0x4e, 0x54, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x54, 0x45, 0x52, 0x4e, 0x41, - 0x54, 0x49, 0x56, 0x45, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x49, 0x45, 0x53, 0x10, 0x19, 0x2a, - 0xa5, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x52, - 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x01, 0x12, 0x22, 0x0a, - 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, - 0x02, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x52, 0x56, - 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x2a, 0xc3, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, - 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, - 0x4f, 0x41, 0x44, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, - 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, - 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x52, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x49, + 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x53, 0x5f, 0x57, 0x49, + 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x10, 0x14, 0x12, 0x3d, 0x0a, + 0x39, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x53, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x54, 0x52, + 0x4f, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x41, 0x4c, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x49, 0x45, 0x53, 0x10, 0x19, 0x2a, 0xa5, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, + 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, + 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x44, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, + 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, + 0x45, 0x5f, 0x41, 0x47, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x24, + 0x0a, 0x20, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x52, 0x56, 0x41, 0x54, 0x49, + 0x56, 0x45, 0x10, 0x03, 0x2a, 0xe9, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, - 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x56, 0x43, - 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x05, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, - 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, - 0x06, 0x12, 0x2a, 0x0a, 0x26, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, - 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x07, 0x2a, 0xc7, 0x01, - 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1f, 0x0a, 0x1b, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x48, 0x50, 0x41, - 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x4d, - 0x4f, 0x52, 0x59, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, - 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x50, 0x55, 0x10, 0x03, 0x12, 0x23, - 0x0a, 0x1f, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, - 0x53, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, - 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x45, - 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x2a, 0x74, 0x0a, 0x10, 0x50, 0x76, 0x63, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x50, - 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x52, 0x49, 0x4e, 0x4b, 0x10, 0x02, 0x2a, 0xe8, 0x02, - 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, + 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x03, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, + 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x47, 0x45, 0x4e, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x56, 0x43, 0x5f, 0x53, 0x54, + 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x05, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, + 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, + 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x06, 0x12, 0x2a, + 0x0a, 0x26, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x41, 0x52, 0x50, 0x45, 0x4e, 0x54, 0x45, 0x52, 0x5f, + 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x53, 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, + 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x08, + 0x12, 0x2d, 0x0a, 0x29, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x45, 0x4e, 0x53, 0x49, 0x43, + 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x43, 0x52, 0x44, 0x10, 0x09, 0x12, + 0x25, 0x0a, 0x21, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x50, 0x41, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x10, 0x0a, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x43, + 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x0b, + 0x2a, 0xc7, 0x01, 0x0a, 0x0d, 0x48, 0x50, 0x41, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x50, 0x55, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, + 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x48, 0x50, 0x41, 0x5f, + 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x50, 0x55, 0x10, + 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x48, 0x50, 0x41, 0x5f, 0x4d, 0x45, + 0x54, 0x52, 0x49, 0x43, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x05, 0x2a, 0x74, 0x0a, 0x10, 0x50, 0x76, + 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, + 0x0a, 0x1e, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x10, + 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x56, 0x43, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x48, 0x52, 0x49, 0x4e, 0x4b, 0x10, 0x02, + 0x2a, 0x9c, 0x01, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, + 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x12, 0x20, 0x0a, + 0x1c, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, + 0xbe, 0x03, 0x0a, 0x25, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x35, 0x57, 0x4f, 0x52, + 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x36, 0x0a, 0x32, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, + 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x4a, 0x0a, 0x46, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, + 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, + 0x59, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x48, 0x49, 0x53, 0x5f, + 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x45, 0x0a, 0x41, 0x57, 0x4f, 0x52, 0x4b, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, + 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x03, 0x12, + 0x42, 0x0a, 0x3e, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x4f, 0x50, 0x54, 0x49, + 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, + 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, + 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x43, 0x52, + 0x44, 0x10, 0x04, 0x12, 0x4b, 0x0a, 0x47, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, + 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x4f, 0x4c, + 0x49, 0x43, 0x59, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x44, 0x5f, 0x42, + 0x59, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x05, + 0x2a, 0xa8, 0x01, 0x0a, 0x18, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x55, 0x6e, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, + 0x26, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, + 0x4c, 0x54, 0x48, 0x59, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2d, 0x0a, 0x29, 0x53, 0x43, 0x48, + 0x45, 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5a, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x31, 0x0a, 0x2d, 0x53, 0x43, 0x48, 0x45, + 0x44, 0x55, 0x4c, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, + 0x4f, 0x44, 0x53, 0x5f, 0x53, 0x54, 0x55, 0x43, 0x4b, 0x10, 0x02, 0x2a, 0xe8, 0x02, 0x0a, 0x12, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x57, 0x4f, 0x52, - 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x41, - 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, + 0x5f, 0x43, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, - 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x24, - 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, 0x41, 0x55, - 0x54, 0x4f, 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, - 0x52, 0x41, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x07, 0x12, - 0x27, 0x0a, 0x23, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, - 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, 0x46, 0x4f, 0x52, - 0x4d, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x08, 0x32, 0x84, 0x6d, 0x0a, 0x18, 0x4b, 0x38, 0x73, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x82, 0x01, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x57, 0x4f, 0x52, 0x4b, 0x4c, + 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4d, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, + 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x55, + 0x41, 0x4c, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, + 0x55, 0x4d, 0x49, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x55, 0x4d, 0x49, 0x5f, 0x41, 0x55, 0x54, 0x4f, + 0x10, 0x06, 0x12, 0x29, 0x0a, 0x25, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, + 0x55, 0x4c, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, + 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x07, 0x12, 0x27, 0x0a, + 0x23, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x52, 0x55, 0x4c, 0x45, 0x5f, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x52, 0x41, 0x46, 0x4f, 0x52, 0x4d, 0x5f, + 0x41, 0x55, 0x54, 0x4f, 0x10, 0x08, 0x2a, 0x91, 0x02, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x27, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, + 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, + 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x27, 0x0a, 0x23, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, + 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, + 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4e, 0x4f, 0x44, 0x45, + 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, + 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, + 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, + 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x05, 0x2a, 0xa1, 0x01, 0x0a, 0x1a, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x4f, 0x52, + 0x45, 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, + 0x48, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x4f, 0x52, 0x45, + 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, + 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, + 0x12, 0x2c, 0x0a, 0x28, 0x46, 0x4f, 0x52, 0x45, 0x4e, 0x53, 0x49, 0x43, 0x5f, 0x50, 0x4f, 0x53, + 0x54, 0x5f, 0x53, 0x4e, 0x41, 0x50, 0x53, 0x48, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x10, 0x02, 0x32, 0xe1, + 0xa5, 0x01, 0x0a, 0x18, 0x4b, 0x38, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, + 0x88, 0x02, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x93, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8a, 0x01, 0x0a, + 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x4c, 0x69, + 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x93, 0x01, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8a, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8b, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, + 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, - 0x01, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x32, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, + 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, - 0x1c, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, - 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x91, 0x01, 0x0a, 0x24, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xac, + 0x01, 0x0a, 0x2d, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, - 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x72, 0x0a, 0x18, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x78, - 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x12, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, + 0x0a, 0x25, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7b, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x12, 0x72, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x27, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x78, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, - 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x7b, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7b, 0x0a, 0x1b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0xb4, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x93, 0x01, 0x0a, 0x23, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0xb4, 0x01, 0x0a, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, - 0x74, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x6e, 0x73, 0x12, 0x3d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x90, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x31, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, - 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x88, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, - 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, - 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, - 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, - 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, + 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x74, 0x0a, 0x19, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x90, 0x01, 0x0a, + 0x22, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x7e, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, + 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, + 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, + 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x67, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x42, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, + 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x61, 0x0a, 0x14, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, - 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, - 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, - 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, + 0x02, 0x01, 0x12, 0x61, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, + 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, + 0x67, 0x73, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x53, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x5b, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x27, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, + 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x6d, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, - 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, 0x2e, 0x61, + 0x46, 0x72, 0x6f, 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, + 0x6d, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, + 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, - 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x46, 0x72, 0x6f, - 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, + 0x0a, 0x1c, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, + 0x61, 0x62, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, - 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, - 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, + 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x47, + 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x30, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x73, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x29, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, + 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, + 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, + 0x69, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, 0x0a, + 0x25, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, + 0x65, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, + 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x47, + 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, + 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4b, 0x61, 0x72, 0x70, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6d, 0x0a, 0x18, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x55, 0x70, 0x64, + 0x65, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, + 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x12, + 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, - 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x63, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x64, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x68, 0x61, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x52, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, + 0x55, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x50, 0x55, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, - 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, - 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x33, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, - 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, - 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, + 0x01, 0x0a, 0x24, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, - 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, - 0x01, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x6e, + 0x64, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, + 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x64, 0x44, 0x69, 0x73, 0x72, + 0x75, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x44, 0x42, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x61, 0x6c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, + 0x79, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x70, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x28, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, - 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, - 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, - 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, - 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x76, 0x63, 0x53, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, + 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x50, 0x76, 0x63, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, - 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, - 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, - 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x43, 0x72, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x4f, 0x4d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, + 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x43, 0x50, 0x55, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x85, 0x01, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9a, 0x01, + 0x0a, 0x27, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x28, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x55, 0x70, 0x73, 0x65, 0x72, - 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, - 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, - 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x28, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x64, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, + 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x15, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7c, 0x0a, 0x1d, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, + 0x6f, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x6e, 0x72, 0x6f, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6d, 0x0a, 0x18, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, + 0x0a, 0x1a, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x42, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, - 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, - 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x28, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x79, 0x49, 0x44, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x44, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x42, 0x79, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, - 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x28, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x28, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x79, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, - 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x12, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x17, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x41, 0x75, 0x74, 0x6f, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, + 0x0a, 0x1e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, + 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, + 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x70, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x4f, 0x6e, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x85, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, + 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x41, 0x6e, 0x64, 0x41, 0x70, 0x70, + 0x6c, 0x79, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x91, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x13, - 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, 0x63, 0x2f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x67, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, + 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x14, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x61, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x76, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x73, 0x0a, 0x1a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x73, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7f, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x79, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, + 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x2b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x21, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, + 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x73, 0x0a, 0x1a, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x29, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, + 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, + 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7c, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x8b, 0x01, 0x0a, 0x22, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0xa3, 0x01, 0x0a, 0x2a, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, + 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa9, 0x01, 0x0a, 0x2c, + 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x3b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, + 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x82, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9a, 0x01, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x6f, 0x72, + 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x23, 0x50, 0x72, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x2b, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, + 0x73, 0x69, 0x63, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x46, 0x6f, 0x72, 0x65, 0x6e, 0x73, 0x69, 0x63, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x42, 0x91, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x42, 0x13, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x7a, 0x65, 0x72, 0x6f, 0x2d, 0x69, 0x6e, + 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x64, 0x61, 0x6b, 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 ( @@ -35813,1183 +55504,1768 @@ func file_api_v1_recommendation_proto_rawDescGZIP() []byte { return file_api_v1_recommendation_proto_rawDescData } -var file_api_v1_recommendation_proto_enumTypes = make([]protoimpl.EnumInfo, 17) -var file_api_v1_recommendation_proto_msgTypes = make([]protoimpl.MessageInfo, 402) +var file_api_v1_recommendation_proto_enumTypes = make([]protoimpl.EnumInfo, 35) +var file_api_v1_recommendation_proto_msgTypes = make([]protoimpl.MessageInfo, 602) var file_api_v1_recommendation_proto_goTypes = []interface{}{ (ReconcileStatus)(0), // 0: api.v1.ReconcileStatus (ActionToTake)(0), // 1: api.v1.ActionToTake - (CostPeriod)(0), // 2: api.v1.CostPeriod - (LiveMigDeletionPropagation)(0), // 3: api.v1.LiveMigDeletionPropagation - (RecommendationStatus)(0), // 4: api.v1.RecommendationStatus - (NodeGroupCheckpointState)(0), // 5: api.v1.NodeGroupCheckpointState - (TargetFilterType)(0), // 6: api.v1.TargetFilterType - (InstanceStorePolicy)(0), // 7: api.v1.InstanceStorePolicy - (ActionTrigger)(0), // 8: api.v1.ActionTrigger - (WorkloadDetectionTrigger)(0), // 9: api.v1.WorkloadDetectionTrigger - (NodeGroupDetectionTrigger)(0), // 10: api.v1.NodeGroupDetectionTrigger - (NodeGroupActionsAllowed)(0), // 11: api.v1.NodeGroupActionsAllowed - (RecommendationMode)(0), // 12: api.v1.RecommendationMode - (RecommendationType)(0), // 13: api.v1.RecommendationType - (HPAMetricType)(0), // 14: api.v1.HPAMetricType - (PvcOperationType)(0), // 15: api.v1.PvcOperationType - (WorkloadRuleSource)(0), // 16: api.v1.WorkloadRuleSource - (*GetRecommendationsRequest)(nil), // 17: api.v1.GetRecommendationsRequest - (*GetRecommendationsResponse)(nil), // 18: api.v1.GetRecommendationsResponse - (*GetRecommendationsForWorkloadRequest)(nil), // 19: api.v1.GetRecommendationsForWorkloadRequest - (*GetRecommendationsForWorkloadResponse)(nil), // 20: api.v1.GetRecommendationsForWorkloadResponse - (*GetNodeGroupStatsRequest)(nil), // 21: api.v1.GetNodeGroupStatsRequest - (*GetNodeGroupStatsResponse)(nil), // 22: api.v1.GetNodeGroupStatsResponse - (*GetOptimalInstanceTypeForNodeGroupRequest)(nil), // 23: api.v1.GetOptimalInstanceTypeForNodeGroupRequest - (*GetOptimalInstanceTypeForNodeGroupResponse)(nil), // 24: api.v1.GetOptimalInstanceTypeForNodeGroupResponse - (*GetLatestNodeGroupRecommendationRequest)(nil), // 25: api.v1.GetLatestNodeGroupRecommendationRequest - (*GetLatestNodeGroupRecommendationResponse)(nil), // 26: api.v1.GetLatestNodeGroupRecommendationResponse - (*GetLatestWorkloadRecommendationRequest)(nil), // 27: api.v1.GetLatestWorkloadRecommendationRequest - (*GetLatestWorkloadRecommendationResponse)(nil), // 28: api.v1.GetLatestWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationRequest)(nil), // 29: api.v1.GetPreviewWorkloadRecommendationRequest - (*GetPreviewWorkloadRecommendationResponse)(nil), // 30: api.v1.GetPreviewWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationsRequest)(nil), // 31: api.v1.GetPreviewWorkloadRecommendationsRequest - (*WorkloadIdentifier)(nil), // 32: api.v1.WorkloadIdentifier - (*GetPreviewWorkloadRecommendationsResponse)(nil), // 33: api.v1.GetPreviewWorkloadRecommendationsResponse - (*CreateClusterRecommendationPolicyRequest)(nil), // 34: api.v1.CreateClusterRecommendationPolicyRequest - (*CreateClusterRecommendationPolicyResponse)(nil), // 35: api.v1.CreateClusterRecommendationPolicyResponse - (*GetClusterRecommendationPolicyRequest)(nil), // 36: api.v1.GetClusterRecommendationPolicyRequest - (*GetClusterRecommendationPolicyResponse)(nil), // 37: api.v1.GetClusterRecommendationPolicyResponse - (*ListClusterRecommendationPoliciesRequest)(nil), // 38: api.v1.ListClusterRecommendationPoliciesRequest - (*ListClusterRecommendationPoliciesResponse)(nil), // 39: api.v1.ListClusterRecommendationPoliciesResponse - (*UpdateClusterRecommendationPolicyRequest)(nil), // 40: api.v1.UpdateClusterRecommendationPolicyRequest - (*UpdateClusterRecommendationPolicyResponse)(nil), // 41: api.v1.UpdateClusterRecommendationPolicyResponse - (*DeleteClusterRecommendationPolicyRequest)(nil), // 42: api.v1.DeleteClusterRecommendationPolicyRequest - (*DeleteClusterRecommendationPolicyResponse)(nil), // 43: api.v1.DeleteClusterRecommendationPolicyResponse - (*AttachClusterRecommendationPolicyRequest)(nil), // 44: api.v1.AttachClusterRecommendationPolicyRequest - (*AttachClusterRecommendationPolicyResponse)(nil), // 45: api.v1.AttachClusterRecommendationPolicyResponse - (*GetWorkloadsWithAttachedPolicyTargetsRequest)(nil), // 46: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - (*GetWorkloadsWithAttachedPolicyTargetsResponse)(nil), // 47: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - (*TargetIdList)(nil), // 48: api.v1.TargetIdList - (*CreateNodeGroupRecommendationPolicyRequest)(nil), // 49: api.v1.CreateNodeGroupRecommendationPolicyRequest - (*CreateNodeGroupRecommendationPolicyResponse)(nil), // 50: api.v1.CreateNodeGroupRecommendationPolicyResponse - (*GetNodeGroupRecommendationPolicyRequest)(nil), // 51: api.v1.GetNodeGroupRecommendationPolicyRequest - (*GetNodeGroupRecommendationPolicyResponse)(nil), // 52: api.v1.GetNodeGroupRecommendationPolicyResponse - (*ListNodeGroupRecommendationPoliciesRequest)(nil), // 53: api.v1.ListNodeGroupRecommendationPoliciesRequest - (*ListNodeGroupRecommendationPoliciesResponse)(nil), // 54: api.v1.ListNodeGroupRecommendationPoliciesResponse - (*UpdateNodeGroupRecommendationPolicyRequest)(nil), // 55: api.v1.UpdateNodeGroupRecommendationPolicyRequest - (*UpdateNodeGroupRecommendationPolicyResponse)(nil), // 56: api.v1.UpdateNodeGroupRecommendationPolicyResponse - (*DeleteNodeGroupRecommendationPolicyRequest)(nil), // 57: api.v1.DeleteNodeGroupRecommendationPolicyRequest - (*DeleteNodeGroupRecommendationPolicyResponse)(nil), // 58: api.v1.DeleteNodeGroupRecommendationPolicyResponse - (*AttachNodeGroupRecommendationPolicyRequest)(nil), // 59: api.v1.AttachNodeGroupRecommendationPolicyRequest - (*AttachNodeGroupRecommendationPolicyResponse)(nil), // 60: api.v1.AttachNodeGroupRecommendationPolicyResponse - (*CreateWorkloadRecommendationPolicyRequest)(nil), // 61: api.v1.CreateWorkloadRecommendationPolicyRequest - (*CreateWorkloadRecommendationPolicyResponse)(nil), // 62: api.v1.CreateWorkloadRecommendationPolicyResponse - (*GetWorkloadRecommendationPolicyRequest)(nil), // 63: api.v1.GetWorkloadRecommendationPolicyRequest - (*GetWorkloadRecommendationPolicyResponse)(nil), // 64: api.v1.GetWorkloadRecommendationPolicyResponse - (*ListWorkloadRecommendationPoliciesRequest)(nil), // 65: api.v1.ListWorkloadRecommendationPoliciesRequest - (*ListWorkloadRecommendationPoliciesResponse)(nil), // 66: api.v1.ListWorkloadRecommendationPoliciesResponse - (*UpdateWorkloadRecommendationPolicyRequest)(nil), // 67: api.v1.UpdateWorkloadRecommendationPolicyRequest - (*UpdateWorkloadRecommendationPolicyResponse)(nil), // 68: api.v1.UpdateWorkloadRecommendationPolicyResponse - (*DeleteWorkloadRecommendationPolicyRequest)(nil), // 69: api.v1.DeleteWorkloadRecommendationPolicyRequest - (*DeleteWorkloadRecommendationPolicyResponse)(nil), // 70: api.v1.DeleteWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPolicyRequest)(nil), // 71: api.v1.AttachWorkloadRecommendationPolicyRequest - (*AttachWorkloadRecommendationPolicyResponse)(nil), // 72: api.v1.AttachWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPoliciesRequest)(nil), // 73: api.v1.AttachWorkloadRecommendationPoliciesRequest - (*AttachWorkloadRecommendationPoliciesResponse)(nil), // 74: api.v1.AttachWorkloadRecommendationPoliciesResponse - (*WorkloadPolicyAttachment)(nil), // 75: api.v1.WorkloadPolicyAttachment - (*WorkloadPolicyTarget)(nil), // 76: api.v1.WorkloadPolicyTarget - (*CreateWorkloadPolicyTargetRequest)(nil), // 77: api.v1.CreateWorkloadPolicyTargetRequest - (*CreateWorkloadPolicyTargetResponse)(nil), // 78: api.v1.CreateWorkloadPolicyTargetResponse - (*GetWorkloadPolicyTargetRequest)(nil), // 79: api.v1.GetWorkloadPolicyTargetRequest - (*GetWorkloadPolicyTargetResponse)(nil), // 80: api.v1.GetWorkloadPolicyTargetResponse - (*ListWorkloadPolicyTargetsRequest)(nil), // 81: api.v1.ListWorkloadPolicyTargetsRequest - (*ListWorkloadPolicyTargetsResponse)(nil), // 82: api.v1.ListWorkloadPolicyTargetsResponse - (*UpdateWorkloadPolicyTargetRequest)(nil), // 83: api.v1.UpdateWorkloadPolicyTargetRequest - (*UpdateWorkloadPolicyTargetResponse)(nil), // 84: api.v1.UpdateWorkloadPolicyTargetResponse - (*DeleteWorkloadPolicyTargetRequest)(nil), // 85: api.v1.DeleteWorkloadPolicyTargetRequest - (*ToggleWorkloadPolicyTargetsRequest)(nil), // 86: api.v1.ToggleWorkloadPolicyTargetsRequest - (*ToggleWorkloadPolicyTargetsResponse)(nil), // 87: api.v1.ToggleWorkloadPolicyTargetsResponse - (*DeleteWorkloadPolicyTargetResponse)(nil), // 88: api.v1.DeleteWorkloadPolicyTargetResponse - (*RemoveClusterOptimizationsRequest)(nil), // 89: api.v1.RemoveClusterOptimizationsRequest - (*RemoveClusterOptimizationsResponse)(nil), // 90: api.v1.RemoveClusterOptimizationsResponse - (*PreviewWorkloadPolicyTargetMatchesRequest)(nil), // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest - (*PreviewWorkloadPolicyTargetMatchesResponse)(nil), // 92: api.v1.PreviewWorkloadPolicyTargetMatchesResponse - (*GetPreviewWorkloadPolicyTargetRecommendationsRequest)(nil), // 93: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - (*GetPreviewWorkloadPolicyTargetRecommendationsResponse)(nil), // 94: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - (*WorkloadPercentileSummary)(nil), // 95: api.v1.WorkloadPercentileSummary - (*NodeGroupPolicyTarget)(nil), // 96: api.v1.NodeGroupPolicyTarget - (*CreateNodeGroupPolicyTargetRequest)(nil), // 97: api.v1.CreateNodeGroupPolicyTargetRequest - (*CreateNodeGroupPolicyTargetResponse)(nil), // 98: api.v1.CreateNodeGroupPolicyTargetResponse - (*GetNodeGroupPolicyTargetRequest)(nil), // 99: api.v1.GetNodeGroupPolicyTargetRequest - (*GetNodeGroupPolicyTargetResponse)(nil), // 100: api.v1.GetNodeGroupPolicyTargetResponse - (*ListNodeGroupPolicyTargetsRequest)(nil), // 101: api.v1.ListNodeGroupPolicyTargetsRequest - (*ListNodeGroupPolicyTargetsResponse)(nil), // 102: api.v1.ListNodeGroupPolicyTargetsResponse - (*UpdateNodeGroupPolicyTargetRequest)(nil), // 103: api.v1.UpdateNodeGroupPolicyTargetRequest - (*UpdateNodeGroupPolicyTargetResponse)(nil), // 104: api.v1.UpdateNodeGroupPolicyTargetResponse - (*DeleteNodeGroupPolicyTargetRequest)(nil), // 105: api.v1.DeleteNodeGroupPolicyTargetRequest - (*ToggleNodeGroupPolicyTargetsRequest)(nil), // 106: api.v1.ToggleNodeGroupPolicyTargetsRequest - (*ToggleNodeGroupPolicyTargetsResponse)(nil), // 107: api.v1.ToggleNodeGroupPolicyTargetsResponse - (*DeleteNodeGroupPolicyTargetResponse)(nil), // 108: api.v1.DeleteNodeGroupPolicyTargetResponse - (*PreviewNodeGroupPolicyTargetMatchesRequest)(nil), // 109: api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - (*PreviewNodeGroupPolicyTargetMatchesResponse)(nil), // 110: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest)(nil), // 111: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse)(nil), // 112: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - (*BalanceGetRecommendationsRequest)(nil), // 113: api.v1.BalanceGetRecommendationsRequest - (*BalanceGetRecommendationsResponse)(nil), // 114: api.v1.BalanceGetRecommendationsResponse - (*BatchNodeGroupRecommendations)(nil), // 115: api.v1.BatchNodeGroupRecommendations - (*BatchWorkloadRecommendations)(nil), // 116: api.v1.BatchWorkloadRecommendations - (*WorkloadRule)(nil), // 117: api.v1.WorkloadRule - (*ResourceRuleConfig)(nil), // 118: api.v1.ResourceRuleConfig - (*HPAMetricTrigger)(nil), // 119: api.v1.HPAMetricTrigger - (*HPAFallback)(nil), // 120: api.v1.HPAFallback - (*ContainerResourceConfig)(nil), // 121: api.v1.ContainerResourceConfig - (*ContainerResourceRuleConfig)(nil), // 122: api.v1.ContainerResourceRuleConfig - (*HPARuleConfig)(nil), // 123: api.v1.HPARuleConfig - (*EmergencyResponseConfig)(nil), // 124: api.v1.EmergencyResponseConfig - (*PercentileValues)(nil), // 125: api.v1.PercentileValues - (*ResourcePercentiles)(nil), // 126: api.v1.ResourcePercentiles - (*BurstinessRatios)(nil), // 127: api.v1.BurstinessRatios - (*WorkloadClassification)(nil), // 128: api.v1.WorkloadClassification - (*BatchWorkloadRules)(nil), // 129: api.v1.BatchWorkloadRules - (*WorkloadWithActiveRecommendations)(nil), // 130: api.v1.WorkloadWithActiveRecommendations - (*GenericResourceRecommendation)(nil), // 131: api.v1.GenericResourceRecommendation - (*BatchGenericResourceRecommendations)(nil), // 132: api.v1.BatchGenericResourceRecommendations - (*BatchPvcStorageRecommendations)(nil), // 133: api.v1.BatchPvcStorageRecommendations - (*GeneratePodDisruptionBudgetRequest)(nil), // 134: api.v1.GeneratePodDisruptionBudgetRequest - (*GeneratePodDisruptionBudgetResponse)(nil), // 135: api.v1.GeneratePodDisruptionBudgetResponse - (*GenerateAndCreatePodDisruptionBudgetRequest)(nil), // 136: api.v1.GenerateAndCreatePodDisruptionBudgetRequest - (*GenerateAndCreatePodDisruptionBudgetResponse)(nil), // 137: api.v1.GenerateAndCreatePodDisruptionBudgetResponse - (*CreatePodDisruptionBudgetRequest)(nil), // 138: api.v1.CreatePodDisruptionBudgetRequest - (*CreatePodDisruptionBudgetResponse)(nil), // 139: api.v1.CreatePodDisruptionBudgetResponse - (*GetPDBRecommendationForWorkloadRequest)(nil), // 140: api.v1.GetPDBRecommendationForWorkloadRequest - (*GetPDBRecommendationForWorkloadResponse)(nil), // 141: api.v1.GetPDBRecommendationForWorkloadResponse - (*ReconcileWorkload)(nil), // 142: api.v1.ReconcileWorkload - (*ReconcileResponse)(nil), // 143: api.v1.ReconcileResponse - (*OperatorHealth)(nil), // 144: api.v1.OperatorHealth - (*AgentHealth)(nil), // 145: api.v1.AgentHealth - (*AgentHealthMeta)(nil), // 146: api.v1.AgentHealthMeta - (*HealthReport)(nil), // 147: api.v1.HealthReport - (*NodeStats)(nil), // 148: api.v1.NodeStats - (*NodeMetric)(nil), // 149: api.v1.NodeMetric - (*ContainerStats)(nil), // 150: api.v1.ContainerStats - (*ContainerMetric)(nil), // 151: api.v1.ContainerMetric - (*ContainerSummarizedMetric)(nil), // 152: api.v1.ContainerSummarizedMetric - (*Metric)(nil), // 153: api.v1.Metric - (*ContainerRecommendation)(nil), // 154: api.v1.ContainerRecommendation - (*KedaScaledObjectRecommendation)(nil), // 155: api.v1.KedaScaledObjectRecommendation - (*ResourceRecommendation)(nil), // 156: api.v1.ResourceRecommendation - (*Toleration)(nil), // 157: api.v1.Toleration - (*ClusterRecommendationPolicy)(nil), // 158: api.v1.ClusterRecommendationPolicy - (*NodeGroupRecommendationPolicy)(nil), // 159: api.v1.NodeGroupRecommendationPolicy - (*VerticalScalingOptimizationTarget)(nil), // 160: api.v1.VerticalScalingOptimizationTarget - (*HorizontalScalingOptimizationTarget)(nil), // 161: api.v1.HorizontalScalingOptimizationTarget - (*WorkloadRecommendationPolicy)(nil), // 162: api.v1.WorkloadRecommendationPolicy - (*GetPolicyRecommendedDefaultsRequest)(nil), // 163: api.v1.GetPolicyRecommendedDefaultsRequest - (*GetPolicyRecommendedDefaultsResponse)(nil), // 164: api.v1.GetPolicyRecommendedDefaultsResponse - (*BalanceRegisterRequest)(nil), // 165: api.v1.BalanceRegisterRequest - (*BalanceFeatures)(nil), // 166: api.v1.BalanceFeatures - (*BalanceApplyRecommendationResponse)(nil), // 167: api.v1.BalanceApplyRecommendationResponse - (*LiveMigrationResult)(nil), // 168: api.v1.LiveMigrationResult - (*NodeGroupReference)(nil), // 169: api.v1.NodeGroupReference - (*NodeGroupRecommendation)(nil), // 170: api.v1.NodeGroupRecommendation - (*CostImpact)(nil), // 171: api.v1.CostImpact - (*WorkloadRecommendation)(nil), // 172: api.v1.WorkloadRecommendation - (*GetAttachedNodeGroupPoliciesRequest)(nil), // 173: api.v1.GetAttachedNodeGroupPoliciesRequest - (*GetAttachedNodeGroupPoliciesResponse)(nil), // 174: api.v1.GetAttachedNodeGroupPoliciesResponse - (*GetAttachedWorkloadPoliciesRequest)(nil), // 175: api.v1.GetAttachedWorkloadPoliciesRequest - (*GetAttachedWorkloadPoliciesResponse)(nil), // 176: api.v1.GetAttachedWorkloadPoliciesResponse - (*WorkloadRecommendationPolicyGroup)(nil), // 177: api.v1.WorkloadRecommendationPolicyGroup - (*WorkloadPolicyTargetGroup)(nil), // 178: api.v1.WorkloadPolicyTargetGroup - (*WorkloadIdentifiers)(nil), // 179: api.v1.WorkloadIdentifiers - (*WorkloadPolicies)(nil), // 180: api.v1.WorkloadPolicies - (*ListAttachedWorkloadPoliciesRequest)(nil), // 181: api.v1.ListAttachedWorkloadPoliciesRequest - (*ListAttachedWorkloadPoliciesResponse)(nil), // 182: api.v1.ListAttachedWorkloadPoliciesResponse - (*ListAttachedNodeGroupPoliciesRequest)(nil), // 183: api.v1.ListAttachedNodeGroupPoliciesRequest - (*ListAttachedNodeGroupPoliciesResponse)(nil), // 184: api.v1.ListAttachedNodeGroupPoliciesResponse - (*NodeGroupItem)(nil), // 185: api.v1.NodeGroupItem - (*RecommendationAppliedRequest)(nil), // 186: api.v1.RecommendationAppliedRequest - (*RecommendationAppliedResponse)(nil), // 187: api.v1.RecommendationAppliedResponse - (*ApplyRecommendationRequest)(nil), // 188: api.v1.ApplyRecommendationRequest - (*ApplyRecommendationResponse)(nil), // 189: api.v1.ApplyRecommendationResponse - (*RecommendationEventsRequest)(nil), // 190: api.v1.RecommendationEventsRequest - (*RecommendationEventsResponse)(nil), // 191: api.v1.RecommendationEventsResponse - (*RetrieveSavingsForWorkloadRequest)(nil), // 192: api.v1.RetrieveSavingsForWorkloadRequest - (*RetrieveSavingsForWorkloadResponse)(nil), // 193: api.v1.RetrieveSavingsForWorkloadResponse - (*CreateNodePoliciesRequest)(nil), // 194: api.v1.CreateNodePoliciesRequest - (*CreateNodePoliciesResponse)(nil), // 195: api.v1.CreateNodePoliciesResponse - (*SuggestedNodePolicyRequest)(nil), // 196: api.v1.SuggestedNodePolicyRequest - (*SuggestedNodePolicyResponse)(nil), // 197: api.v1.SuggestedNodePolicyResponse - (*GenerateNodePoliciesFromKarpenterRequest)(nil), // 198: api.v1.GenerateNodePoliciesFromKarpenterRequest - (*GenerateNodePoliciesFromKarpenterResponse)(nil), // 199: api.v1.GenerateNodePoliciesFromKarpenterResponse - (*GenerateNodePoliciesFromNodeGroupsRequest)(nil), // 200: api.v1.GenerateNodePoliciesFromNodeGroupsRequest - (*GenerateNodePoliciesFromNodeGroupsResponse)(nil), // 201: api.v1.GenerateNodePoliciesFromNodeGroupsResponse - (*NodeGroupMigrationEligibility)(nil), // 202: api.v1.NodeGroupMigrationEligibility - (*GetNodeAnnotationReadinessRequest)(nil), // 203: api.v1.GetNodeAnnotationReadinessRequest - (*GetNodeAnnotationReadinessResponse)(nil), // 204: api.v1.GetNodeAnnotationReadinessResponse - (*GetMigrationStateRequest)(nil), // 205: api.v1.GetMigrationStateRequest - (*GetMigrationStateResponse)(nil), // 206: api.v1.GetMigrationStateResponse - (*UpdateMigrationStateRequest)(nil), // 207: api.v1.UpdateMigrationStateRequest - (*UpdateMigrationStateResponse)(nil), // 208: api.v1.UpdateMigrationStateResponse - (*ReportNodePoolValidationRequest)(nil), // 209: api.v1.ReportNodePoolValidationRequest - (*ReportNodePoolValidationResponse)(nil), // 210: api.v1.ReportNodePoolValidationResponse - (*GetNodePoolValidationsRequest)(nil), // 211: api.v1.GetNodePoolValidationsRequest - (*NodePoolValidationReport)(nil), // 212: api.v1.NodePoolValidationReport - (*GetNodePoolValidationsResponse)(nil), // 213: api.v1.GetNodePoolValidationsResponse - (*WorkloadCompatibilityWarning)(nil), // 214: api.v1.WorkloadCompatibilityWarning - (*ListNodePoliciesRequest)(nil), // 215: api.v1.ListNodePoliciesRequest - (*ListNodePoliciesResponse)(nil), // 216: api.v1.ListNodePoliciesResponse - (*UpdateNodePolicyRequest)(nil), // 217: api.v1.UpdateNodePolicyRequest - (*UpdateNodePolicyResponse)(nil), // 218: api.v1.UpdateNodePolicyResponse - (*NodeGroupCheckpointStatus)(nil), // 219: api.v1.NodeGroupCheckpointStatus - (*GetNodeGroupsCheckpointStatusRequest)(nil), // 220: api.v1.GetNodeGroupsCheckpointStatusRequest - (*GetNodeGroupsCheckpointStatusResponse)(nil), // 221: api.v1.GetNodeGroupsCheckpointStatusResponse - (*SetNodePolicyCheckpointLabelRequest)(nil), // 222: api.v1.SetNodePolicyCheckpointLabelRequest - (*SetNodePolicyCheckpointLabelResponse)(nil), // 223: api.v1.SetNodePolicyCheckpointLabelResponse - (*DeleteNodePolicyRequest)(nil), // 224: api.v1.DeleteNodePolicyRequest - (*DeleteNodePolicyResponse)(nil), // 225: api.v1.DeleteNodePolicyResponse - (*NodePolicy)(nil), // 226: api.v1.NodePolicy - (*PreviewNodeRecommendationConfigRequest)(nil), // 227: api.v1.PreviewNodeRecommendationConfigRequest - (*PreviewNodeRecommendationConfigResponse)(nil), // 228: api.v1.PreviewNodeRecommendationConfigResponse - (*NodeRecommendationConfig)(nil), // 229: api.v1.NodeRecommendationConfig - (*SuggestedKarpenterConfigRequest)(nil), // 230: api.v1.SuggestedKarpenterConfigRequest - (*SuggestedKarpenterConfigResponse)(nil), // 231: api.v1.SuggestedKarpenterConfigResponse - (*GetAvailableKindsByTargetingFiltersRequest)(nil), // 232: api.v1.GetAvailableKindsByTargetingFiltersRequest - (*SearchResourcesByTargetingFiltersRequest)(nil), // 233: api.v1.SearchResourcesByTargetingFiltersRequest - (*TargetFilters)(nil), // 234: api.v1.TargetFilters - (*GetAvailableKindsByTargetingFiltersResponse)(nil), // 235: api.v1.GetAvailableKindsByTargetingFiltersResponse - (*SearchResourcesByTargetingFiltersResponse)(nil), // 236: api.v1.SearchResourcesByTargetingFiltersResponse - (*NamespaceSearchResult)(nil), // 237: api.v1.NamespaceSearchResult - (*WorkloadSearchResult)(nil), // 238: api.v1.WorkloadSearchResult - (*NodeGroupSearchResult)(nil), // 239: api.v1.NodeGroupSearchResult - (*LabelSearchResult)(nil), // 240: api.v1.LabelSearchResult - (*CreateNodePolicyTargetsRequest)(nil), // 241: api.v1.CreateNodePolicyTargetsRequest - (*CreateNodePolicyTargetsResponse)(nil), // 242: api.v1.CreateNodePolicyTargetsResponse - (*ListNodePolicyTargetsRequest)(nil), // 243: api.v1.ListNodePolicyTargetsRequest - (*ListNodePolicyTargetsResponse)(nil), // 244: api.v1.ListNodePolicyTargetsResponse - (*UpdateNodePolicyTargetRequest)(nil), // 245: api.v1.UpdateNodePolicyTargetRequest - (*UpdateNodePolicyTargetResponse)(nil), // 246: api.v1.UpdateNodePolicyTargetResponse - (*NodePolicyTarget)(nil), // 247: api.v1.NodePolicyTarget - (*NodePolicyCondition)(nil), // 248: api.v1.NodePolicyCondition - (*NodePolicyTargetStatus)(nil), // 249: api.v1.NodePolicyTargetStatus - (*ZonalShiftConfig)(nil), // 250: api.v1.ZonalShiftConfig - (*Taint)(nil), // 251: api.v1.Taint - (*DisruptionBudget)(nil), // 252: api.v1.DisruptionBudget - (*DisruptionPolicy)(nil), // 253: api.v1.DisruptionPolicy - (*ResourceLimits)(nil), // 254: api.v1.ResourceLimits - (*AWSNodeClassSpec)(nil), // 255: api.v1.AWSNodeClassSpec - (*GetInstanceFamiliesRequest)(nil), // 256: api.v1.GetInstanceFamiliesRequest - (*GetInstanceFamiliesResponse)(nil), // 257: api.v1.GetInstanceFamiliesResponse - (*GetInstanceSizesRequest)(nil), // 258: api.v1.GetInstanceSizesRequest - (*GetInstanceSizesResponse)(nil), // 259: api.v1.GetInstanceSizesResponse - (*InstanceFamily)(nil), // 260: api.v1.InstanceFamily - (*InstanceSize)(nil), // 261: api.v1.InstanceSize - (*InstanceCategory)(nil), // 262: api.v1.InstanceCategory - (*InstanceCPU)(nil), // 263: api.v1.InstanceCPU - (*InstanceTypeName)(nil), // 264: api.v1.InstanceTypeName - (*GetInstanceCategoriesRequest)(nil), // 265: api.v1.GetInstanceCategoriesRequest - (*GetInstanceCategoriesResponse)(nil), // 266: api.v1.GetInstanceCategoriesResponse - (*GetInstanceCPUsRequest)(nil), // 267: api.v1.GetInstanceCPUsRequest - (*GetInstanceCPUsResponse)(nil), // 268: api.v1.GetInstanceCPUsResponse - (*GetInstanceTypeNamesRequest)(nil), // 269: api.v1.GetInstanceTypeNamesRequest - (*GetInstanceTypeNamesResponse)(nil), // 270: api.v1.GetInstanceTypeNamesResponse - (*SubnetSelectorTerm)(nil), // 271: api.v1.SubnetSelectorTerm - (*SecurityGroupSelectorTerm)(nil), // 272: api.v1.SecurityGroupSelectorTerm - (*CapacityReservationSelectorTerm)(nil), // 273: api.v1.CapacityReservationSelectorTerm - (*AMISelectorTerm)(nil), // 274: api.v1.AMISelectorTerm - (*KubeletConfiguration)(nil), // 275: api.v1.KubeletConfiguration - (*BlockDeviceMapping)(nil), // 276: api.v1.BlockDeviceMapping - (*BlockDevice)(nil), // 277: api.v1.BlockDevice - (*MetadataOptions)(nil), // 278: api.v1.MetadataOptions - (*GCPNodeClassSpec)(nil), // 279: api.v1.GCPNodeClassSpec - (*GCPImageSelectorTerm)(nil), // 280: api.v1.GCPImageSelectorTerm - (*GCPDisk)(nil), // 281: api.v1.GCPDisk - (*AzureNodeClassSpec)(nil), // 282: api.v1.AzureNodeClassSpec - (*AzureKubeletConfiguration)(nil), // 283: api.v1.AzureKubeletConfiguration - (*OCIImageSelectorTerm)(nil), // 284: api.v1.OCIImageSelectorTerm - (*OCISubnetSelectorTerm)(nil), // 285: api.v1.OCISubnetSelectorTerm - (*OCISecurityGroupSelectorTerm)(nil), // 286: api.v1.OCISecurityGroupSelectorTerm - (*OCIBootConfig)(nil), // 287: api.v1.OCIBootConfig - (*OCILaunchOptions)(nil), // 288: api.v1.OCILaunchOptions - (*OCIVolumeAttributes)(nil), // 289: api.v1.OCIVolumeAttributes - (*OCINodeClassSpec)(nil), // 290: api.v1.OCINodeClassSpec - (*KarpenterSettingsRecommendation)(nil), // 291: api.v1.KarpenterSettingsRecommendation - (*RawKarpenterSpec)(nil), // 292: api.v1.RawKarpenterSpec - (*NodeRecommendation)(nil), // 293: api.v1.NodeRecommendation - (*AWSKarpenterSpec)(nil), // 294: api.v1.AWSKarpenterSpec - (*AKSKarpenterSpec)(nil), // 295: api.v1.AKSKarpenterSpec - (*NodePool)(nil), // 296: api.v1.NodePool - (*EC2NodeClass)(nil), // 297: api.v1.EC2NodeClass - (*AKSNodeClass)(nil), // 298: api.v1.AKSNodeClass - (*GCPKarpenterSpec)(nil), // 299: api.v1.GCPKarpenterSpec - (*GCENodeClass)(nil), // 300: api.v1.GCENodeClass - (*OCIKarpenterSpec)(nil), // 301: api.v1.OCIKarpenterSpec - (*OCINodeClass)(nil), // 302: api.v1.OCINodeClass - (*StorageRecommendationPolicy)(nil), // 303: api.v1.StorageRecommendationPolicy - (*CreateStorageRecommendationPolicyRequest)(nil), // 304: api.v1.CreateStorageRecommendationPolicyRequest - (*CreateStorageRecommendationPolicyResponse)(nil), // 305: api.v1.CreateStorageRecommendationPolicyResponse - (*GetStorageRecommendationPolicyRequest)(nil), // 306: api.v1.GetStorageRecommendationPolicyRequest - (*GetStorageRecommendationPolicyResponse)(nil), // 307: api.v1.GetStorageRecommendationPolicyResponse - (*ListStorageRecommendationPoliciesRequest)(nil), // 308: api.v1.ListStorageRecommendationPoliciesRequest - (*ListStorageRecommendationPoliciesResponse)(nil), // 309: api.v1.ListStorageRecommendationPoliciesResponse - (*UpdateStorageRecommendationPolicyRequest)(nil), // 310: api.v1.UpdateStorageRecommendationPolicyRequest - (*UpdateStorageRecommendationPolicyResponse)(nil), // 311: api.v1.UpdateStorageRecommendationPolicyResponse - (*DeleteStorageRecommendationPolicyRequest)(nil), // 312: api.v1.DeleteStorageRecommendationPolicyRequest - (*DeleteStorageRecommendationPolicyResponse)(nil), // 313: api.v1.DeleteStorageRecommendationPolicyResponse - (*StoragePolicyTarget)(nil), // 314: api.v1.StoragePolicyTarget - (*CreateStoragePolicyTargetRequest)(nil), // 315: api.v1.CreateStoragePolicyTargetRequest - (*CreateStoragePolicyTargetResponse)(nil), // 316: api.v1.CreateStoragePolicyTargetResponse - (*ListStoragePolicyTargetsRequest)(nil), // 317: api.v1.ListStoragePolicyTargetsRequest - (*ListStoragePolicyTargetsResponse)(nil), // 318: api.v1.ListStoragePolicyTargetsResponse - (*UpdateStoragePolicyTargetRequest)(nil), // 319: api.v1.UpdateStoragePolicyTargetRequest - (*UpdateStoragePolicyTargetResponse)(nil), // 320: api.v1.UpdateStoragePolicyTargetResponse - (*DeleteStoragePolicyTargetRequest)(nil), // 321: api.v1.DeleteStoragePolicyTargetRequest - (*DeleteStoragePolicyTargetResponse)(nil), // 322: api.v1.DeleteStoragePolicyTargetResponse - (*PvcStorageRecommendation)(nil), // 323: api.v1.PvcStorageRecommendation - (*GetPvcStorageRecommendationRequest)(nil), // 324: api.v1.GetPvcStorageRecommendationRequest - (*GetPvcStorageRecommendationResponse)(nil), // 325: api.v1.GetPvcStorageRecommendationResponse - (*ListPvcStorageRecommendationsRequest)(nil), // 326: api.v1.ListPvcStorageRecommendationsRequest - (*ListPvcStorageRecommendationsResponse)(nil), // 327: api.v1.ListPvcStorageRecommendationsResponse - (*GeneratePvcStorageRecommendationRequest)(nil), // 328: api.v1.GeneratePvcStorageRecommendationRequest - (*GeneratePvcStorageRecommendationResponse)(nil), // 329: api.v1.GeneratePvcStorageRecommendationResponse - (*PreviewPvcStorageRecommendationRequest)(nil), // 330: api.v1.PreviewPvcStorageRecommendationRequest - (*PreviewPvcStorageRecommendationResponse)(nil), // 331: api.v1.PreviewPvcStorageRecommendationResponse - (*WorkloadRuleOOMEvent)(nil), // 332: api.v1.WorkloadRuleOOMEvent - (*ListWorkloadRuleOOMEventsRequest)(nil), // 333: api.v1.ListWorkloadRuleOOMEventsRequest - (*ListWorkloadRuleOOMEventsResponse)(nil), // 334: api.v1.ListWorkloadRuleOOMEventsResponse - (*ListWorkloadOOMEventsRequest)(nil), // 335: api.v1.ListWorkloadOOMEventsRequest - (*ListWorkloadOOMEventsResponse)(nil), // 336: api.v1.ListWorkloadOOMEventsResponse - (*WorkloadRuleCPUThrottleEvent)(nil), // 337: api.v1.WorkloadRuleCPUThrottleEvent - (*ListWorkloadRuleCPUThrottleEventsRequest)(nil), // 338: api.v1.ListWorkloadRuleCPUThrottleEventsRequest - (*ListWorkloadRuleCPUThrottleEventsResponse)(nil), // 339: api.v1.ListWorkloadRuleCPUThrottleEventsResponse - (*ListWorkloadCPUThrottleEventsRequest)(nil), // 340: api.v1.ListWorkloadCPUThrottleEventsRequest - (*ListWorkloadCPUThrottleEventsResponse)(nil), // 341: api.v1.ListWorkloadCPUThrottleEventsResponse - (*WorkloadOptimizationPolicyProto)(nil), // 342: api.v1.WorkloadOptimizationPolicyProto - (*CreateWorkloadOptimizationPolicyRequest)(nil), // 343: api.v1.CreateWorkloadOptimizationPolicyRequest - (*CreateWorkloadOptimizationPolicyResponse)(nil), // 344: api.v1.CreateWorkloadOptimizationPolicyResponse - (*ListWorkloadOptimizationPoliciesRequest)(nil), // 345: api.v1.ListWorkloadOptimizationPoliciesRequest - (*ListWorkloadOptimizationPoliciesResponse)(nil), // 346: api.v1.ListWorkloadOptimizationPoliciesResponse - (*GetWorkloadOptimizationPolicyRequest)(nil), // 347: api.v1.GetWorkloadOptimizationPolicyRequest - (*GetWorkloadOptimizationPolicyResponse)(nil), // 348: api.v1.GetWorkloadOptimizationPolicyResponse - (*UpdateWorkloadOptimizationPolicyRequest)(nil), // 349: api.v1.UpdateWorkloadOptimizationPolicyRequest - (*UpdateWorkloadOptimizationPolicyResponse)(nil), // 350: api.v1.UpdateWorkloadOptimizationPolicyResponse - (*DeleteWorkloadOptimizationPolicyRequest)(nil), // 351: api.v1.DeleteWorkloadOptimizationPolicyRequest - (*DeleteWorkloadOptimizationPolicyResponse)(nil), // 352: api.v1.DeleteWorkloadOptimizationPolicyResponse - (*GetWorkloadRulesByPolicyRequest)(nil), // 353: api.v1.GetWorkloadRulesByPolicyRequest - (*GetWorkloadRulesByPolicyResponse)(nil), // 354: api.v1.GetWorkloadRulesByPolicyResponse - (*ListWorkloadRulesRequest)(nil), // 355: api.v1.ListWorkloadRulesRequest - (*ListWorkloadRulesResponse)(nil), // 356: api.v1.ListWorkloadRulesResponse - (*GetWorkloadRuleByIDRequest)(nil), // 357: api.v1.GetWorkloadRuleByIDRequest - (*GetWorkloadRuleByIDResponse)(nil), // 358: api.v1.GetWorkloadRuleByIDResponse - (*GetWorkloadRuleByWorkloadRequest)(nil), // 359: api.v1.GetWorkloadRuleByWorkloadRequest - (*GetWorkloadRuleByWorkloadResponse)(nil), // 360: api.v1.GetWorkloadRuleByWorkloadResponse - (*GetWorkloadByWorkloadRuleRequest)(nil), // 361: api.v1.GetWorkloadByWorkloadRuleRequest - (*GetWorkloadByWorkloadRuleResponse)(nil), // 362: api.v1.GetWorkloadByWorkloadRuleResponse - (*DeleteWorkloadRuleRequest)(nil), // 363: api.v1.DeleteWorkloadRuleRequest - (*DeleteWorkloadRuleResponse)(nil), // 364: api.v1.DeleteWorkloadRuleResponse - (*ManualRuleFields)(nil), // 365: api.v1.ManualRuleFields - (*UpsertManualWorkloadRuleRequest)(nil), // 366: api.v1.UpsertManualWorkloadRuleRequest - (*UpsertManualWorkloadRuleResponse)(nil), // 367: api.v1.UpsertManualWorkloadRuleResponse - (*PreviewWorkloadRuleRequest)(nil), // 368: api.v1.PreviewWorkloadRuleRequest - (*PreviewWorkloadRuleResponse)(nil), // 369: api.v1.PreviewWorkloadRuleResponse - (*GetWorkloadContainerNamesRequest)(nil), // 370: api.v1.GetWorkloadContainerNamesRequest - (*GetWorkloadContainerNamesResponse)(nil), // 371: api.v1.GetWorkloadContainerNamesResponse - (*BatchAutoOptimizeWorkload)(nil), // 372: api.v1.BatchAutoOptimizeWorkload - (*BatchAutoOptimizeWorkloadsRequest)(nil), // 373: api.v1.BatchAutoOptimizeWorkloadsRequest - (*BatchAutoOptimizeWorkloadResult)(nil), // 374: api.v1.BatchAutoOptimizeWorkloadResult - (*BatchAutoOptimizeWorkloadsResponse)(nil), // 375: api.v1.BatchAutoOptimizeWorkloadsResponse - (*WorkloadProfileManifest)(nil), // 376: api.v1.WorkloadProfileManifest - (*BatchWorkloadProfiles)(nil), // 377: api.v1.BatchWorkloadProfiles - (*NodeConfigApplyEvent)(nil), // 378: api.v1.NodeConfigApplyEvent - (*GetNodeRecommendationStatusRequest)(nil), // 379: api.v1.GetNodeRecommendationStatusRequest - (*GetNodeRecommendationStatusResponse)(nil), // 380: api.v1.GetNodeRecommendationStatusResponse - (*EnableCheckpointForPolicyRequest)(nil), // 381: api.v1.EnableCheckpointForPolicyRequest - (*EnableCheckpointForPolicyResponse)(nil), // 382: api.v1.EnableCheckpointForPolicyResponse - (*GetCheckpointApplyStatusRequest)(nil), // 383: api.v1.GetCheckpointApplyStatusRequest - (*GetCheckpointApplyStatusResponse)(nil), // 384: api.v1.GetCheckpointApplyStatusResponse - (*NodeApplyFailure)(nil), // 385: api.v1.NodeApplyFailure - nil, // 386: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - nil, // 387: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - nil, // 388: api.v1.HPAMetricTrigger.MetadataEntry - nil, // 389: api.v1.AgentHealth.NodeNameToAgentEntry - nil, // 390: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - nil, // 391: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - nil, // 392: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - nil, // 393: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - nil, // 394: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - nil, // 395: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry - nil, // 396: api.v1.NodePolicy.LabelsEntry - nil, // 397: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - nil, // 398: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - nil, // 399: api.v1.AWSNodeClassSpec.TagsEntry - nil, // 400: api.v1.SubnetSelectorTerm.TagsEntry - nil, // 401: api.v1.SecurityGroupSelectorTerm.TagsEntry - nil, // 402: api.v1.CapacityReservationSelectorTerm.TagsEntry - nil, // 403: api.v1.AMISelectorTerm.TagsEntry - nil, // 404: api.v1.KubeletConfiguration.SystemReservedEntry - nil, // 405: api.v1.KubeletConfiguration.KubeReservedEntry - nil, // 406: api.v1.KubeletConfiguration.EvictionHardEntry - nil, // 407: api.v1.KubeletConfiguration.EvictionSoftEntry - nil, // 408: api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - nil, // 409: api.v1.GCPNodeClassSpec.LabelsEntry - nil, // 410: api.v1.GCPNodeClassSpec.MetadataEntry - nil, // 411: api.v1.AzureNodeClassSpec.TagsEntry - nil, // 412: api.v1.OCINodeClassSpec.MetaDataEntry - nil, // 413: api.v1.OCINodeClassSpec.TagsEntry - nil, // 414: api.v1.OCINodeClassSpec.FreeFormTagsEntry - nil, // 415: api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - nil, // 416: api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - nil, // 417: api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - nil, // 418: api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - (*timestamppb.Timestamp)(nil), // 419: google.protobuf.Timestamp - (*WorkloadFilters)(nil), // 420: api.v1.WorkloadFilters - (*Pagination)(nil), // 421: api.v1.Pagination - (K8SObjectKind)(0), // 422: api.v1.K8sObjectKind - (*durationpb.Duration)(nil), // 423: google.protobuf.Duration - (*LabelSelector)(nil), // 424: api.v1.LabelSelector - (*RegexPattern)(nil), // 425: api.v1.RegexPattern - (*WorkloadItem)(nil), // 426: api.v1.WorkloadItem - (*MetricPercentiles)(nil), // 427: api.v1.MetricPercentiles - (*NodeGroup)(nil), // 428: api.v1.NodeGroup - (*HPABehavior)(nil), // 429: api.v1.HPABehavior - (*money.Money)(nil), // 430: google.type.Money - (*SavingsTimeSeries)(nil), // 431: api.v1.SavingsTimeSeries - (*GetWorkloadResponse)(nil), // 432: api.v1.GetWorkloadResponse - (*CloudProvider)(nil), // 433: api.v1.CloudProvider - (*WorkloadProfileResult)(nil), // 434: api.v1.WorkloadProfileResult - (ProfileWindow)(0), // 435: api.v1.ProfileWindow - (*ProfileKey)(nil), // 436: api.v1.ProfileKey - (*WorkloadProfileSnapshot)(nil), // 437: api.v1.WorkloadProfileSnapshot + (MutationAction)(0), // 2: api.v1.MutationAction + (ArgTarget)(0), // 3: api.v1.ArgTarget + (CostPeriod)(0), // 4: api.v1.CostPeriod + (ReasoningInsightSeverity)(0), // 5: api.v1.ReasoningInsightSeverity + (ReasoningInsightType)(0), // 6: api.v1.ReasoningInsightType + (ReasoningDecisionKind)(0), // 7: api.v1.ReasoningDecisionKind + (LiveMigDeletionPropagation)(0), // 8: api.v1.LiveMigDeletionPropagation + (RecommendationStatus)(0), // 9: api.v1.RecommendationStatus + (NodeGroupCheckpointState)(0), // 10: api.v1.NodeGroupCheckpointState + (CheckpointReason)(0), // 11: api.v1.CheckpointReason + (SuggestionGroup)(0), // 12: api.v1.SuggestionGroup + (SuggestionFlavor)(0), // 13: api.v1.SuggestionFlavor + (SuggestionSeverity)(0), // 14: api.v1.SuggestionSeverity + (EvidenceScope)(0), // 15: api.v1.EvidenceScope + (TargetFilterType)(0), // 16: api.v1.TargetFilterType + (InstanceStorePolicy)(0), // 17: api.v1.InstanceStorePolicy + (ActionTrigger)(0), // 18: api.v1.ActionTrigger + (WorkloadDetectionTrigger)(0), // 19: api.v1.WorkloadDetectionTrigger + (NodeGroupDetectionTrigger)(0), // 20: api.v1.NodeGroupDetectionTrigger + (NodeGroupActionsAllowed)(0), // 21: api.v1.NodeGroupActionsAllowed + (RecommendationMode)(0), // 22: api.v1.RecommendationMode + (RecommendationType)(0), // 23: api.v1.RecommendationType + (HPAMetricType)(0), // 24: api.v1.HPAMetricType + (PvcOperationType)(0), // 25: api.v1.PvcOperationType + (WorkloadRuleAction)(0), // 26: api.v1.WorkloadRuleAction + (WorkloadOptimizationPolicyMatchStatus)(0), // 27: api.v1.WorkloadOptimizationPolicyMatchStatus + (SchedulerUnhealthyReason)(0), // 28: api.v1.SchedulerUnhealthyReason + (WorkloadRuleSource)(0), // 29: api.v1.WorkloadRuleSource + (NodeCheckpointLabelState)(0), // 30: api.v1.NodeCheckpointLabelState + (ForensicPostSnapshotAction)(0), // 31: api.v1.ForensicPostSnapshotAction + (DeleteSchedulerPolicyResponse_Outcome)(0), // 32: api.v1.DeleteSchedulerPolicyResponse.Outcome + (SchedulerPolicyTargetMatch_Status)(0), // 33: api.v1.SchedulerPolicyTargetMatch.Status + (SchedulerPolicyEnrollment_State)(0), // 34: api.v1.SchedulerPolicyEnrollment.State + (*GetRecommendationsRequest)(nil), // 35: api.v1.GetRecommendationsRequest + (*GetRecommendationsResponse)(nil), // 36: api.v1.GetRecommendationsResponse + (*GetRecommendationsForWorkloadRequest)(nil), // 37: api.v1.GetRecommendationsForWorkloadRequest + (*GetRecommendationsForWorkloadResponse)(nil), // 38: api.v1.GetRecommendationsForWorkloadResponse + (*GetNodeGroupStatsRequest)(nil), // 39: api.v1.GetNodeGroupStatsRequest + (*GetNodeGroupStatsResponse)(nil), // 40: api.v1.GetNodeGroupStatsResponse + (*GetOptimalInstanceTypeForNodeGroupRequest)(nil), // 41: api.v1.GetOptimalInstanceTypeForNodeGroupRequest + (*GetOptimalInstanceTypeForNodeGroupResponse)(nil), // 42: api.v1.GetOptimalInstanceTypeForNodeGroupResponse + (*GetLatestNodeGroupRecommendationRequest)(nil), // 43: api.v1.GetLatestNodeGroupRecommendationRequest + (*GetLatestNodeGroupRecommendationResponse)(nil), // 44: api.v1.GetLatestNodeGroupRecommendationResponse + (*GetLatestWorkloadRecommendationRequest)(nil), // 45: api.v1.GetLatestWorkloadRecommendationRequest + (*GetLatestWorkloadRecommendationResponse)(nil), // 46: api.v1.GetLatestWorkloadRecommendationResponse + (*GetPreviewWorkloadRecommendationRequest)(nil), // 47: api.v1.GetPreviewWorkloadRecommendationRequest + (*GetPreviewWorkloadRecommendationResponse)(nil), // 48: api.v1.GetPreviewWorkloadRecommendationResponse + (*GetPreviewWorkloadRecommendationsRequest)(nil), // 49: api.v1.GetPreviewWorkloadRecommendationsRequest + (*WorkloadIdentifier)(nil), // 50: api.v1.WorkloadIdentifier + (*GetPreviewWorkloadRecommendationsResponse)(nil), // 51: api.v1.GetPreviewWorkloadRecommendationsResponse + (*CreateClusterRecommendationPolicyRequest)(nil), // 52: api.v1.CreateClusterRecommendationPolicyRequest + (*CreateClusterRecommendationPolicyResponse)(nil), // 53: api.v1.CreateClusterRecommendationPolicyResponse + (*GetClusterRecommendationPolicyRequest)(nil), // 54: api.v1.GetClusterRecommendationPolicyRequest + (*GetClusterRecommendationPolicyResponse)(nil), // 55: api.v1.GetClusterRecommendationPolicyResponse + (*ListClusterRecommendationPoliciesRequest)(nil), // 56: api.v1.ListClusterRecommendationPoliciesRequest + (*ListClusterRecommendationPoliciesResponse)(nil), // 57: api.v1.ListClusterRecommendationPoliciesResponse + (*UpdateClusterRecommendationPolicyRequest)(nil), // 58: api.v1.UpdateClusterRecommendationPolicyRequest + (*UpdateClusterRecommendationPolicyResponse)(nil), // 59: api.v1.UpdateClusterRecommendationPolicyResponse + (*DeleteClusterRecommendationPolicyRequest)(nil), // 60: api.v1.DeleteClusterRecommendationPolicyRequest + (*DeleteClusterRecommendationPolicyResponse)(nil), // 61: api.v1.DeleteClusterRecommendationPolicyResponse + (*AttachClusterRecommendationPolicyRequest)(nil), // 62: api.v1.AttachClusterRecommendationPolicyRequest + (*AttachClusterRecommendationPolicyResponse)(nil), // 63: api.v1.AttachClusterRecommendationPolicyResponse + (*GetWorkloadsWithAttachedPolicyTargetsRequest)(nil), // 64: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest + (*GetWorkloadsWithAttachedPolicyTargetsResponse)(nil), // 65: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse + (*TargetIdList)(nil), // 66: api.v1.TargetIdList + (*CreateNodeGroupRecommendationPolicyRequest)(nil), // 67: api.v1.CreateNodeGroupRecommendationPolicyRequest + (*CreateNodeGroupRecommendationPolicyResponse)(nil), // 68: api.v1.CreateNodeGroupRecommendationPolicyResponse + (*GetNodeGroupRecommendationPolicyRequest)(nil), // 69: api.v1.GetNodeGroupRecommendationPolicyRequest + (*GetNodeGroupRecommendationPolicyResponse)(nil), // 70: api.v1.GetNodeGroupRecommendationPolicyResponse + (*ListNodeGroupRecommendationPoliciesRequest)(nil), // 71: api.v1.ListNodeGroupRecommendationPoliciesRequest + (*ListNodeGroupRecommendationPoliciesResponse)(nil), // 72: api.v1.ListNodeGroupRecommendationPoliciesResponse + (*UpdateNodeGroupRecommendationPolicyRequest)(nil), // 73: api.v1.UpdateNodeGroupRecommendationPolicyRequest + (*UpdateNodeGroupRecommendationPolicyResponse)(nil), // 74: api.v1.UpdateNodeGroupRecommendationPolicyResponse + (*DeleteNodeGroupRecommendationPolicyRequest)(nil), // 75: api.v1.DeleteNodeGroupRecommendationPolicyRequest + (*DeleteNodeGroupRecommendationPolicyResponse)(nil), // 76: api.v1.DeleteNodeGroupRecommendationPolicyResponse + (*AttachNodeGroupRecommendationPolicyRequest)(nil), // 77: api.v1.AttachNodeGroupRecommendationPolicyRequest + (*AttachNodeGroupRecommendationPolicyResponse)(nil), // 78: api.v1.AttachNodeGroupRecommendationPolicyResponse + (*CreateWorkloadRecommendationPolicyRequest)(nil), // 79: api.v1.CreateWorkloadRecommendationPolicyRequest + (*CreateWorkloadRecommendationPolicyResponse)(nil), // 80: api.v1.CreateWorkloadRecommendationPolicyResponse + (*GetWorkloadRecommendationPolicyRequest)(nil), // 81: api.v1.GetWorkloadRecommendationPolicyRequest + (*GetWorkloadRecommendationPolicyResponse)(nil), // 82: api.v1.GetWorkloadRecommendationPolicyResponse + (*ListWorkloadRecommendationPoliciesRequest)(nil), // 83: api.v1.ListWorkloadRecommendationPoliciesRequest + (*ListWorkloadRecommendationPoliciesResponse)(nil), // 84: api.v1.ListWorkloadRecommendationPoliciesResponse + (*UpdateWorkloadRecommendationPolicyRequest)(nil), // 85: api.v1.UpdateWorkloadRecommendationPolicyRequest + (*UpdateWorkloadRecommendationPolicyResponse)(nil), // 86: api.v1.UpdateWorkloadRecommendationPolicyResponse + (*DeleteWorkloadRecommendationPolicyRequest)(nil), // 87: api.v1.DeleteWorkloadRecommendationPolicyRequest + (*DeleteWorkloadRecommendationPolicyResponse)(nil), // 88: api.v1.DeleteWorkloadRecommendationPolicyResponse + (*AttachWorkloadRecommendationPolicyRequest)(nil), // 89: api.v1.AttachWorkloadRecommendationPolicyRequest + (*AttachWorkloadRecommendationPolicyResponse)(nil), // 90: api.v1.AttachWorkloadRecommendationPolicyResponse + (*AttachWorkloadRecommendationPoliciesRequest)(nil), // 91: api.v1.AttachWorkloadRecommendationPoliciesRequest + (*AttachWorkloadRecommendationPoliciesResponse)(nil), // 92: api.v1.AttachWorkloadRecommendationPoliciesResponse + (*WorkloadPolicyAttachment)(nil), // 93: api.v1.WorkloadPolicyAttachment + (*WorkloadPolicyTarget)(nil), // 94: api.v1.WorkloadPolicyTarget + (*CreateWorkloadPolicyTargetRequest)(nil), // 95: api.v1.CreateWorkloadPolicyTargetRequest + (*CreateWorkloadPolicyTargetResponse)(nil), // 96: api.v1.CreateWorkloadPolicyTargetResponse + (*GetWorkloadPolicyTargetRequest)(nil), // 97: api.v1.GetWorkloadPolicyTargetRequest + (*GetWorkloadPolicyTargetResponse)(nil), // 98: api.v1.GetWorkloadPolicyTargetResponse + (*ListWorkloadPolicyTargetsRequest)(nil), // 99: api.v1.ListWorkloadPolicyTargetsRequest + (*ListWorkloadPolicyTargetsResponse)(nil), // 100: api.v1.ListWorkloadPolicyTargetsResponse + (*UpdateWorkloadPolicyTargetRequest)(nil), // 101: api.v1.UpdateWorkloadPolicyTargetRequest + (*UpdateWorkloadPolicyTargetResponse)(nil), // 102: api.v1.UpdateWorkloadPolicyTargetResponse + (*DeleteWorkloadPolicyTargetRequest)(nil), // 103: api.v1.DeleteWorkloadPolicyTargetRequest + (*ToggleWorkloadPolicyTargetsRequest)(nil), // 104: api.v1.ToggleWorkloadPolicyTargetsRequest + (*ToggleWorkloadPolicyTargetsResponse)(nil), // 105: api.v1.ToggleWorkloadPolicyTargetsResponse + (*DeleteWorkloadPolicyTargetResponse)(nil), // 106: api.v1.DeleteWorkloadPolicyTargetResponse + (*RemoveClusterOptimizationsRequest)(nil), // 107: api.v1.RemoveClusterOptimizationsRequest + (*RemoveClusterOptimizationsResponse)(nil), // 108: api.v1.RemoveClusterOptimizationsResponse + (*PreviewWorkloadPolicyTargetMatchesRequest)(nil), // 109: api.v1.PreviewWorkloadPolicyTargetMatchesRequest + (*PreviewWorkloadPolicyTargetMatchesResponse)(nil), // 110: api.v1.PreviewWorkloadPolicyTargetMatchesResponse + (*GetPreviewWorkloadPolicyTargetRecommendationsRequest)(nil), // 111: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest + (*WorkloadCollisionInfo)(nil), // 112: api.v1.WorkloadCollisionInfo + (*GetPreviewWorkloadPolicyTargetRecommendationsResponse)(nil), // 113: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse + (*WorkloadPercentileSummary)(nil), // 114: api.v1.WorkloadPercentileSummary + (*NodeGroupPolicyTarget)(nil), // 115: api.v1.NodeGroupPolicyTarget + (*CreateNodeGroupPolicyTargetRequest)(nil), // 116: api.v1.CreateNodeGroupPolicyTargetRequest + (*CreateNodeGroupPolicyTargetResponse)(nil), // 117: api.v1.CreateNodeGroupPolicyTargetResponse + (*GetNodeGroupPolicyTargetRequest)(nil), // 118: api.v1.GetNodeGroupPolicyTargetRequest + (*GetNodeGroupPolicyTargetResponse)(nil), // 119: api.v1.GetNodeGroupPolicyTargetResponse + (*ListNodeGroupPolicyTargetsRequest)(nil), // 120: api.v1.ListNodeGroupPolicyTargetsRequest + (*ListNodeGroupPolicyTargetsResponse)(nil), // 121: api.v1.ListNodeGroupPolicyTargetsResponse + (*UpdateNodeGroupPolicyTargetRequest)(nil), // 122: api.v1.UpdateNodeGroupPolicyTargetRequest + (*UpdateNodeGroupPolicyTargetResponse)(nil), // 123: api.v1.UpdateNodeGroupPolicyTargetResponse + (*DeleteNodeGroupPolicyTargetRequest)(nil), // 124: api.v1.DeleteNodeGroupPolicyTargetRequest + (*ToggleNodeGroupPolicyTargetsRequest)(nil), // 125: api.v1.ToggleNodeGroupPolicyTargetsRequest + (*ToggleNodeGroupPolicyTargetsResponse)(nil), // 126: api.v1.ToggleNodeGroupPolicyTargetsResponse + (*DeleteNodeGroupPolicyTargetResponse)(nil), // 127: api.v1.DeleteNodeGroupPolicyTargetResponse + (*PreviewNodeGroupPolicyTargetMatchesRequest)(nil), // 128: api.v1.PreviewNodeGroupPolicyTargetMatchesRequest + (*PreviewNodeGroupPolicyTargetMatchesResponse)(nil), // 129: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse + (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest)(nil), // 130: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest + (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse)(nil), // 131: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse + (*BalanceGetRecommendationsRequest)(nil), // 132: api.v1.BalanceGetRecommendationsRequest + (*BalanceGetRecommendationsResponse)(nil), // 133: api.v1.BalanceGetRecommendationsResponse + (*BatchNodeGroupRecommendations)(nil), // 134: api.v1.BatchNodeGroupRecommendations + (*BatchWorkloadRecommendations)(nil), // 135: api.v1.BatchWorkloadRecommendations + (*WorkloadRule)(nil), // 136: api.v1.WorkloadRule + (*ResourceRuleConfig)(nil), // 137: api.v1.ResourceRuleConfig + (*HPAMetricTrigger)(nil), // 138: api.v1.HPAMetricTrigger + (*HPAFallback)(nil), // 139: api.v1.HPAFallback + (*ContainerResourceConfig)(nil), // 140: api.v1.ContainerResourceConfig + (*ContainerResourceRuleConfig)(nil), // 141: api.v1.ContainerResourceRuleConfig + (*JVMHeapRuleConfig)(nil), // 142: api.v1.JVMHeapRuleConfig + (*HPARuleConfig)(nil), // 143: api.v1.HPARuleConfig + (*EmergencyResponseConfig)(nil), // 144: api.v1.EmergencyResponseConfig + (*KEDAScaledObjectTemplate)(nil), // 145: api.v1.KEDAScaledObjectTemplate + (*KEDATrigger)(nil), // 146: api.v1.KEDATrigger + (*KEDAAuthenticationRef)(nil), // 147: api.v1.KEDAAuthenticationRef + (*KEDAFallback)(nil), // 148: api.v1.KEDAFallback + (*KEDAAdvanced)(nil), // 149: api.v1.KEDAAdvanced + (*PercentileValues)(nil), // 150: api.v1.PercentileValues + (*ResourcePercentiles)(nil), // 151: api.v1.ResourcePercentiles + (*BurstinessRatios)(nil), // 152: api.v1.BurstinessRatios + (*WorkloadClassification)(nil), // 153: api.v1.WorkloadClassification + (*BatchWorkloadRules)(nil), // 154: api.v1.BatchWorkloadRules + (*BatchHPAConnectors)(nil), // 155: api.v1.BatchHPAConnectors + (*WorkloadWithActiveRecommendations)(nil), // 156: api.v1.WorkloadWithActiveRecommendations + (*GenericResourceRecommendation)(nil), // 157: api.v1.GenericResourceRecommendation + (*BatchGenericResourceRecommendations)(nil), // 158: api.v1.BatchGenericResourceRecommendations + (*BatchPvcStorageRecommendations)(nil), // 159: api.v1.BatchPvcStorageRecommendations + (*GeneratePodDisruptionBudgetRequest)(nil), // 160: api.v1.GeneratePodDisruptionBudgetRequest + (*GeneratePodDisruptionBudgetResponse)(nil), // 161: api.v1.GeneratePodDisruptionBudgetResponse + (*GenerateAndCreatePodDisruptionBudgetRequest)(nil), // 162: api.v1.GenerateAndCreatePodDisruptionBudgetRequest + (*GenerateAndCreatePodDisruptionBudgetResponse)(nil), // 163: api.v1.GenerateAndCreatePodDisruptionBudgetResponse + (*CreatePodDisruptionBudgetRequest)(nil), // 164: api.v1.CreatePodDisruptionBudgetRequest + (*CreatePodDisruptionBudgetResponse)(nil), // 165: api.v1.CreatePodDisruptionBudgetResponse + (*GetPDBRecommendationForWorkloadRequest)(nil), // 166: api.v1.GetPDBRecommendationForWorkloadRequest + (*GetPDBRecommendationForWorkloadResponse)(nil), // 167: api.v1.GetPDBRecommendationForWorkloadResponse + (*StructuralHealthFinding)(nil), // 168: api.v1.StructuralHealthFinding + (*WorkloadStructuralHealth)(nil), // 169: api.v1.WorkloadStructuralHealth + (*ListWorkloadStructuralHealthRequest)(nil), // 170: api.v1.ListWorkloadStructuralHealthRequest + (*ListWorkloadStructuralHealthResponse)(nil), // 171: api.v1.ListWorkloadStructuralHealthResponse + (*ReconcileWorkload)(nil), // 172: api.v1.ReconcileWorkload + (*ReconcileResponse)(nil), // 173: api.v1.ReconcileResponse + (*OperatorHealth)(nil), // 174: api.v1.OperatorHealth + (*AgentHealth)(nil), // 175: api.v1.AgentHealth + (*AgentHealthMeta)(nil), // 176: api.v1.AgentHealthMeta + (*HealthReport)(nil), // 177: api.v1.HealthReport + (*NodeStats)(nil), // 178: api.v1.NodeStats + (*NodeMetric)(nil), // 179: api.v1.NodeMetric + (*ContainerStats)(nil), // 180: api.v1.ContainerStats + (*ContainerMetric)(nil), // 181: api.v1.ContainerMetric + (*ContainerSummarizedMetric)(nil), // 182: api.v1.ContainerSummarizedMetric + (*Metric)(nil), // 183: api.v1.Metric + (*ContainerRecommendation)(nil), // 184: api.v1.ContainerRecommendation + (*KedaScaledObjectRecommendation)(nil), // 185: api.v1.KedaScaledObjectRecommendation + (*ResourceRecommendation)(nil), // 186: api.v1.ResourceRecommendation + (*EnvVarMutation)(nil), // 187: api.v1.EnvVarMutation + (*CommandArgMutation)(nil), // 188: api.v1.CommandArgMutation + (*NodeSelectorMutation)(nil), // 189: api.v1.NodeSelectorMutation + (*TolerationMutation)(nil), // 190: api.v1.TolerationMutation + (*Toleration)(nil), // 191: api.v1.Toleration + (*ClusterRecommendationPolicy)(nil), // 192: api.v1.ClusterRecommendationPolicy + (*NodeGroupRecommendationPolicy)(nil), // 193: api.v1.NodeGroupRecommendationPolicy + (*VerticalScalingOptimizationTarget)(nil), // 194: api.v1.VerticalScalingOptimizationTarget + (*HorizontalScalingOptimizationTarget)(nil), // 195: api.v1.HorizontalScalingOptimizationTarget + (*WorkloadRecommendationPolicy)(nil), // 196: api.v1.WorkloadRecommendationPolicy + (*GetPolicyRecommendedDefaultsRequest)(nil), // 197: api.v1.GetPolicyRecommendedDefaultsRequest + (*GetPolicyRecommendedDefaultsResponse)(nil), // 198: api.v1.GetPolicyRecommendedDefaultsResponse + (*BalanceRegisterRequest)(nil), // 199: api.v1.BalanceRegisterRequest + (*BalanceFeatures)(nil), // 200: api.v1.BalanceFeatures + (*BalanceApplyRecommendationResponse)(nil), // 201: api.v1.BalanceApplyRecommendationResponse + (*LiveMigrationResult)(nil), // 202: api.v1.LiveMigrationResult + (*NodeGroupReference)(nil), // 203: api.v1.NodeGroupReference + (*NodeGroupRecommendation)(nil), // 204: api.v1.NodeGroupRecommendation + (*CostImpact)(nil), // 205: api.v1.CostImpact + (*WorkloadRecommendation)(nil), // 206: api.v1.WorkloadRecommendation + (*ReasoningDetails)(nil), // 207: api.v1.ReasoningDetails + (*ReasoningEvidence)(nil), // 208: api.v1.ReasoningEvidence + (*ReasoningInsight)(nil), // 209: api.v1.ReasoningInsight + (*ReasoningResourceEdge)(nil), // 210: api.v1.ReasoningResourceEdge + (*ReasoningContainerChange)(nil), // 211: api.v1.ReasoningContainerChange + (*ReasoningUtilization)(nil), // 212: api.v1.ReasoningUtilization + (*ReasoningHistoricalPattern)(nil), // 213: api.v1.ReasoningHistoricalPattern + (*ReasoningReplicas)(nil), // 214: api.v1.ReasoningReplicas + (*ReasoningDecision)(nil), // 215: api.v1.ReasoningDecision + (*GetAttachedNodeGroupPoliciesRequest)(nil), // 216: api.v1.GetAttachedNodeGroupPoliciesRequest + (*GetAttachedNodeGroupPoliciesResponse)(nil), // 217: api.v1.GetAttachedNodeGroupPoliciesResponse + (*GetAttachedWorkloadPoliciesRequest)(nil), // 218: api.v1.GetAttachedWorkloadPoliciesRequest + (*GetAttachedWorkloadPoliciesResponse)(nil), // 219: api.v1.GetAttachedWorkloadPoliciesResponse + (*WorkloadRecommendationPolicyGroup)(nil), // 220: api.v1.WorkloadRecommendationPolicyGroup + (*WorkloadPolicyTargetGroup)(nil), // 221: api.v1.WorkloadPolicyTargetGroup + (*WorkloadIdentifiers)(nil), // 222: api.v1.WorkloadIdentifiers + (*WorkloadPolicies)(nil), // 223: api.v1.WorkloadPolicies + (*ListAttachedWorkloadPoliciesRequest)(nil), // 224: api.v1.ListAttachedWorkloadPoliciesRequest + (*ListAttachedWorkloadPoliciesResponse)(nil), // 225: api.v1.ListAttachedWorkloadPoliciesResponse + (*ListAttachedNodeGroupPoliciesRequest)(nil), // 226: api.v1.ListAttachedNodeGroupPoliciesRequest + (*ListAttachedNodeGroupPoliciesResponse)(nil), // 227: api.v1.ListAttachedNodeGroupPoliciesResponse + (*NodeGroupItem)(nil), // 228: api.v1.NodeGroupItem + (*RecommendationAppliedRequest)(nil), // 229: api.v1.RecommendationAppliedRequest + (*RecommendationAppliedResponse)(nil), // 230: api.v1.RecommendationAppliedResponse + (*ApplyRecommendationRequest)(nil), // 231: api.v1.ApplyRecommendationRequest + (*ApplyRecommendationResponse)(nil), // 232: api.v1.ApplyRecommendationResponse + (*RecommendationEventsRequest)(nil), // 233: api.v1.RecommendationEventsRequest + (*RecommendationEventsResponse)(nil), // 234: api.v1.RecommendationEventsResponse + (*RetrieveSavingsForWorkloadRequest)(nil), // 235: api.v1.RetrieveSavingsForWorkloadRequest + (*RetrieveSavingsForWorkloadResponse)(nil), // 236: api.v1.RetrieveSavingsForWorkloadResponse + (*CreateNodePoliciesRequest)(nil), // 237: api.v1.CreateNodePoliciesRequest + (*CreateNodePoliciesResponse)(nil), // 238: api.v1.CreateNodePoliciesResponse + (*SuggestedNodePolicyRequest)(nil), // 239: api.v1.SuggestedNodePolicyRequest + (*SuggestedNodePolicyResponse)(nil), // 240: api.v1.SuggestedNodePolicyResponse + (*GenerateNodePoliciesFromKarpenterRequest)(nil), // 241: api.v1.GenerateNodePoliciesFromKarpenterRequest + (*GenerateNodePoliciesFromKarpenterResponse)(nil), // 242: api.v1.GenerateNodePoliciesFromKarpenterResponse + (*GenerateNodePoliciesFromNodeGroupsRequest)(nil), // 243: api.v1.GenerateNodePoliciesFromNodeGroupsRequest + (*GenerateNodePoliciesFromNodeGroupsResponse)(nil), // 244: api.v1.GenerateNodePoliciesFromNodeGroupsResponse + (*NodeGroupMigrationEligibility)(nil), // 245: api.v1.NodeGroupMigrationEligibility + (*GetNodeAnnotationReadinessRequest)(nil), // 246: api.v1.GetNodeAnnotationReadinessRequest + (*GetNodeAnnotationReadinessResponse)(nil), // 247: api.v1.GetNodeAnnotationReadinessResponse + (*DetectClusterAutoscalerRequest)(nil), // 248: api.v1.DetectClusterAutoscalerRequest + (*DetectClusterAutoscalerResponse)(nil), // 249: api.v1.DetectClusterAutoscalerResponse + (*GetMigrationStateRequest)(nil), // 250: api.v1.GetMigrationStateRequest + (*GetMigrationStateResponse)(nil), // 251: api.v1.GetMigrationStateResponse + (*UpdateMigrationStateRequest)(nil), // 252: api.v1.UpdateMigrationStateRequest + (*UpdateMigrationStateResponse)(nil), // 253: api.v1.UpdateMigrationStateResponse + (*GetKarpenterMigrationStateRequest)(nil), // 254: api.v1.GetKarpenterMigrationStateRequest + (*GetKarpenterMigrationStateResponse)(nil), // 255: api.v1.GetKarpenterMigrationStateResponse + (*UpdateKarpenterMigrationStateRequest)(nil), // 256: api.v1.UpdateKarpenterMigrationStateRequest + (*UpdateKarpenterMigrationStateResponse)(nil), // 257: api.v1.UpdateKarpenterMigrationStateResponse + (*KarpenterOwnershipConflict)(nil), // 258: api.v1.KarpenterOwnershipConflict + (*DetectKarpenterOwnershipConflictsRequest)(nil), // 259: api.v1.DetectKarpenterOwnershipConflictsRequest + (*DetectKarpenterOwnershipConflictsResponse)(nil), // 260: api.v1.DetectKarpenterOwnershipConflictsResponse + (*AcknowledgeKarpenterOwnershipConflictRequest)(nil), // 261: api.v1.AcknowledgeKarpenterOwnershipConflictRequest + (*AcknowledgeKarpenterOwnershipConflictResponse)(nil), // 262: api.v1.AcknowledgeKarpenterOwnershipConflictResponse + (*KarpenterSourceResource)(nil), // 263: api.v1.KarpenterSourceResource + (*GetKarpenterSourceResourcesRequest)(nil), // 264: api.v1.GetKarpenterSourceResourcesRequest + (*GetKarpenterSourceResourcesResponse)(nil), // 265: api.v1.GetKarpenterSourceResourcesResponse + (*NodePoolAdoptionStatus)(nil), // 266: api.v1.NodePoolAdoptionStatus + (*GetKarpenterAdoptionStatusRequest)(nil), // 267: api.v1.GetKarpenterAdoptionStatusRequest + (*GetKarpenterAdoptionStatusResponse)(nil), // 268: api.v1.GetKarpenterAdoptionStatusResponse + (*ReportNodePoolValidationRequest)(nil), // 269: api.v1.ReportNodePoolValidationRequest + (*ReportNodePoolValidationResponse)(nil), // 270: api.v1.ReportNodePoolValidationResponse + (*GetNodePoolValidationsRequest)(nil), // 271: api.v1.GetNodePoolValidationsRequest + (*NodePoolValidationReport)(nil), // 272: api.v1.NodePoolValidationReport + (*GetNodePoolValidationsResponse)(nil), // 273: api.v1.GetNodePoolValidationsResponse + (*WorkloadCompatibilityWarning)(nil), // 274: api.v1.WorkloadCompatibilityWarning + (*ListNodePoliciesRequest)(nil), // 275: api.v1.ListNodePoliciesRequest + (*ListNodePoliciesResponse)(nil), // 276: api.v1.ListNodePoliciesResponse + (*UpdateNodePolicyRequest)(nil), // 277: api.v1.UpdateNodePolicyRequest + (*UpdateNodePolicyResponse)(nil), // 278: api.v1.UpdateNodePolicyResponse + (*NodeGroupCheckpointStatus)(nil), // 279: api.v1.NodeGroupCheckpointStatus + (*GetNodeGroupsCheckpointStatusRequest)(nil), // 280: api.v1.GetNodeGroupsCheckpointStatusRequest + (*GetNodeGroupsCheckpointStatusResponse)(nil), // 281: api.v1.GetNodeGroupsCheckpointStatusResponse + (*SetNodePolicyCheckpointLabelRequest)(nil), // 282: api.v1.SetNodePolicyCheckpointLabelRequest + (*SetNodePolicyCheckpointLabelResponse)(nil), // 283: api.v1.SetNodePolicyCheckpointLabelResponse + (*DeleteNodePolicyRequest)(nil), // 284: api.v1.DeleteNodePolicyRequest + (*DeleteNodePolicyResponse)(nil), // 285: api.v1.DeleteNodePolicyResponse + (*NodePolicy)(nil), // 286: api.v1.NodePolicy + (*PreviewNodeRecommendationConfigRequest)(nil), // 287: api.v1.PreviewNodeRecommendationConfigRequest + (*PreviewNodeRecommendationConfigResponse)(nil), // 288: api.v1.PreviewNodeRecommendationConfigResponse + (*NodeRecommendationConfig)(nil), // 289: api.v1.NodeRecommendationConfig + (*SuggestedKarpenterConfigRequest)(nil), // 290: api.v1.SuggestedKarpenterConfigRequest + (*SuggestedKarpenterConfigResponse)(nil), // 291: api.v1.SuggestedKarpenterConfigResponse + (*SuggestNodePolicyImprovementsRequest)(nil), // 292: api.v1.SuggestNodePolicyImprovementsRequest + (*SuggestNodePolicyImprovementsResponse)(nil), // 293: api.v1.SuggestNodePolicyImprovementsResponse + (*ListClusterNodePolicySuggestionsRequest)(nil), // 294: api.v1.ListClusterNodePolicySuggestionsRequest + (*ListClusterNodePolicySuggestionsResponse)(nil), // 295: api.v1.ListClusterNodePolicySuggestionsResponse + (*NodePolicySuggestionsForPolicy)(nil), // 296: api.v1.NodePolicySuggestionsForPolicy + (*NodePolicySuggestion)(nil), // 297: api.v1.NodePolicySuggestion + (*SuggestionFieldChange)(nil), // 298: api.v1.SuggestionFieldChange + (*SuggestionEvidence)(nil), // 299: api.v1.SuggestionEvidence + (*SuggestionWorkloadRef)(nil), // 300: api.v1.SuggestionWorkloadRef + (*SuggestionContext)(nil), // 301: api.v1.SuggestionContext + (*GetAvailableKindsByTargetingFiltersRequest)(nil), // 302: api.v1.GetAvailableKindsByTargetingFiltersRequest + (*SearchResourcesByTargetingFiltersRequest)(nil), // 303: api.v1.SearchResourcesByTargetingFiltersRequest + (*TargetFilters)(nil), // 304: api.v1.TargetFilters + (*GetAvailableKindsByTargetingFiltersResponse)(nil), // 305: api.v1.GetAvailableKindsByTargetingFiltersResponse + (*SearchResourcesByTargetingFiltersResponse)(nil), // 306: api.v1.SearchResourcesByTargetingFiltersResponse + (*NamespaceSearchResult)(nil), // 307: api.v1.NamespaceSearchResult + (*WorkloadSearchResult)(nil), // 308: api.v1.WorkloadSearchResult + (*NodeGroupSearchResult)(nil), // 309: api.v1.NodeGroupSearchResult + (*LabelSearchResult)(nil), // 310: api.v1.LabelSearchResult + (*CreateNodePolicyTargetsRequest)(nil), // 311: api.v1.CreateNodePolicyTargetsRequest + (*CreateNodePolicyTargetsResponse)(nil), // 312: api.v1.CreateNodePolicyTargetsResponse + (*ListNodePolicyTargetsRequest)(nil), // 313: api.v1.ListNodePolicyTargetsRequest + (*ListNodePolicyTargetsResponse)(nil), // 314: api.v1.ListNodePolicyTargetsResponse + (*UpdateNodePolicyTargetRequest)(nil), // 315: api.v1.UpdateNodePolicyTargetRequest + (*UpdateNodePolicyTargetResponse)(nil), // 316: api.v1.UpdateNodePolicyTargetResponse + (*NodePolicyTarget)(nil), // 317: api.v1.NodePolicyTarget + (*NodePolicyCondition)(nil), // 318: api.v1.NodePolicyCondition + (*NodePolicyTargetStatus)(nil), // 319: api.v1.NodePolicyTargetStatus + (*ZonalShiftConfig)(nil), // 320: api.v1.ZonalShiftConfig + (*Taint)(nil), // 321: api.v1.Taint + (*DisruptionBudget)(nil), // 322: api.v1.DisruptionBudget + (*DisruptionPolicy)(nil), // 323: api.v1.DisruptionPolicy + (*ResourceLimits)(nil), // 324: api.v1.ResourceLimits + (*AWSNodeClassSpec)(nil), // 325: api.v1.AWSNodeClassSpec + (*GetInstanceFamiliesRequest)(nil), // 326: api.v1.GetInstanceFamiliesRequest + (*GetInstanceFamiliesResponse)(nil), // 327: api.v1.GetInstanceFamiliesResponse + (*GetInstanceSizesRequest)(nil), // 328: api.v1.GetInstanceSizesRequest + (*GetInstanceSizesResponse)(nil), // 329: api.v1.GetInstanceSizesResponse + (*GetInstanceShapesRequest)(nil), // 330: api.v1.GetInstanceShapesRequest + (*GetInstanceShapesResponse)(nil), // 331: api.v1.GetInstanceShapesResponse + (*InstanceFamily)(nil), // 332: api.v1.InstanceFamily + (*InstanceShape)(nil), // 333: api.v1.InstanceShape + (*InstanceSize)(nil), // 334: api.v1.InstanceSize + (*InstanceCategory)(nil), // 335: api.v1.InstanceCategory + (*InstanceCPU)(nil), // 336: api.v1.InstanceCPU + (*InstanceTypeName)(nil), // 337: api.v1.InstanceTypeName + (*GetInstanceCategoriesRequest)(nil), // 338: api.v1.GetInstanceCategoriesRequest + (*GetInstanceCategoriesResponse)(nil), // 339: api.v1.GetInstanceCategoriesResponse + (*GetInstanceCPUsRequest)(nil), // 340: api.v1.GetInstanceCPUsRequest + (*GetInstanceCPUsResponse)(nil), // 341: api.v1.GetInstanceCPUsResponse + (*GetInstanceTypeNamesRequest)(nil), // 342: api.v1.GetInstanceTypeNamesRequest + (*GetInstanceTypeNamesResponse)(nil), // 343: api.v1.GetInstanceTypeNamesResponse + (*SubnetSelectorTerm)(nil), // 344: api.v1.SubnetSelectorTerm + (*SecurityGroupSelectorTerm)(nil), // 345: api.v1.SecurityGroupSelectorTerm + (*CapacityReservationSelectorTerm)(nil), // 346: api.v1.CapacityReservationSelectorTerm + (*AMISelectorTerm)(nil), // 347: api.v1.AMISelectorTerm + (*KubeletConfiguration)(nil), // 348: api.v1.KubeletConfiguration + (*BlockDeviceMapping)(nil), // 349: api.v1.BlockDeviceMapping + (*BlockDevice)(nil), // 350: api.v1.BlockDevice + (*MetadataOptions)(nil), // 351: api.v1.MetadataOptions + (*GCPNodeClassSpec)(nil), // 352: api.v1.GCPNodeClassSpec + (*GCPImageSelectorTerm)(nil), // 353: api.v1.GCPImageSelectorTerm + (*GCPDisk)(nil), // 354: api.v1.GCPDisk + (*AzureNodeClassSpec)(nil), // 355: api.v1.AzureNodeClassSpec + (*AzureKubeletConfiguration)(nil), // 356: api.v1.AzureKubeletConfiguration + (*OCIImageSelectorTerm)(nil), // 357: api.v1.OCIImageSelectorTerm + (*OCISubnetSelectorTerm)(nil), // 358: api.v1.OCISubnetSelectorTerm + (*OCISecurityGroupSelectorTerm)(nil), // 359: api.v1.OCISecurityGroupSelectorTerm + (*OCIBootConfig)(nil), // 360: api.v1.OCIBootConfig + (*OCILaunchOptions)(nil), // 361: api.v1.OCILaunchOptions + (*OCIVolumeAttributes)(nil), // 362: api.v1.OCIVolumeAttributes + (*OCINodeClassSpec)(nil), // 363: api.v1.OCINodeClassSpec + (*KarpenterSettingsRecommendation)(nil), // 364: api.v1.KarpenterSettingsRecommendation + (*RawKarpenterSpec)(nil), // 365: api.v1.RawKarpenterSpec + (*SnapshotRecommendation)(nil), // 366: api.v1.SnapshotRecommendation + (*ForensicSnapshotRecommendation)(nil), // 367: api.v1.ForensicSnapshotRecommendation + (*SnapshotCRStatusReport)(nil), // 368: api.v1.SnapshotCRStatusReport + (*SnapshotCRStatus)(nil), // 369: api.v1.SnapshotCRStatus + (*SnapshotCRRuntimeStatus)(nil), // 370: api.v1.SnapshotCRRuntimeStatus + (*SnapshotPolicyTargetStatus)(nil), // 371: api.v1.SnapshotPolicyTargetStatus + (*SnapshotPrereqs)(nil), // 372: api.v1.SnapshotPrereqs + (*NodeRecommendation)(nil), // 373: api.v1.NodeRecommendation + (*AWSKarpenterSpec)(nil), // 374: api.v1.AWSKarpenterSpec + (*AKSKarpenterSpec)(nil), // 375: api.v1.AKSKarpenterSpec + (*NodePool)(nil), // 376: api.v1.NodePool + (*EC2NodeClass)(nil), // 377: api.v1.EC2NodeClass + (*AKSNodeClass)(nil), // 378: api.v1.AKSNodeClass + (*GCPKarpenterSpec)(nil), // 379: api.v1.GCPKarpenterSpec + (*GCENodeClass)(nil), // 380: api.v1.GCENodeClass + (*OCIKarpenterSpec)(nil), // 381: api.v1.OCIKarpenterSpec + (*OCINodeClass)(nil), // 382: api.v1.OCINodeClass + (*StorageRecommendationPolicy)(nil), // 383: api.v1.StorageRecommendationPolicy + (*CreateStorageRecommendationPolicyRequest)(nil), // 384: api.v1.CreateStorageRecommendationPolicyRequest + (*CreateStorageRecommendationPolicyResponse)(nil), // 385: api.v1.CreateStorageRecommendationPolicyResponse + (*GetStorageRecommendationPolicyRequest)(nil), // 386: api.v1.GetStorageRecommendationPolicyRequest + (*GetStorageRecommendationPolicyResponse)(nil), // 387: api.v1.GetStorageRecommendationPolicyResponse + (*ListStorageRecommendationPoliciesRequest)(nil), // 388: api.v1.ListStorageRecommendationPoliciesRequest + (*ListStorageRecommendationPoliciesResponse)(nil), // 389: api.v1.ListStorageRecommendationPoliciesResponse + (*UpdateStorageRecommendationPolicyRequest)(nil), // 390: api.v1.UpdateStorageRecommendationPolicyRequest + (*UpdateStorageRecommendationPolicyResponse)(nil), // 391: api.v1.UpdateStorageRecommendationPolicyResponse + (*DeleteStorageRecommendationPolicyRequest)(nil), // 392: api.v1.DeleteStorageRecommendationPolicyRequest + (*DeleteStorageRecommendationPolicyResponse)(nil), // 393: api.v1.DeleteStorageRecommendationPolicyResponse + (*StoragePolicyTarget)(nil), // 394: api.v1.StoragePolicyTarget + (*CreateStoragePolicyTargetRequest)(nil), // 395: api.v1.CreateStoragePolicyTargetRequest + (*CreateStoragePolicyTargetResponse)(nil), // 396: api.v1.CreateStoragePolicyTargetResponse + (*ListStoragePolicyTargetsRequest)(nil), // 397: api.v1.ListStoragePolicyTargetsRequest + (*ListStoragePolicyTargetsResponse)(nil), // 398: api.v1.ListStoragePolicyTargetsResponse + (*UpdateStoragePolicyTargetRequest)(nil), // 399: api.v1.UpdateStoragePolicyTargetRequest + (*UpdateStoragePolicyTargetResponse)(nil), // 400: api.v1.UpdateStoragePolicyTargetResponse + (*DeleteStoragePolicyTargetRequest)(nil), // 401: api.v1.DeleteStoragePolicyTargetRequest + (*DeleteStoragePolicyTargetResponse)(nil), // 402: api.v1.DeleteStoragePolicyTargetResponse + (*PvcStorageRecommendation)(nil), // 403: api.v1.PvcStorageRecommendation + (*GetPvcStorageRecommendationRequest)(nil), // 404: api.v1.GetPvcStorageRecommendationRequest + (*GetPvcStorageRecommendationResponse)(nil), // 405: api.v1.GetPvcStorageRecommendationResponse + (*ListPvcStorageRecommendationsRequest)(nil), // 406: api.v1.ListPvcStorageRecommendationsRequest + (*ListPvcStorageRecommendationsResponse)(nil), // 407: api.v1.ListPvcStorageRecommendationsResponse + (*GeneratePvcStorageRecommendationRequest)(nil), // 408: api.v1.GeneratePvcStorageRecommendationRequest + (*GeneratePvcStorageRecommendationResponse)(nil), // 409: api.v1.GeneratePvcStorageRecommendationResponse + (*PreviewPvcStorageRecommendationRequest)(nil), // 410: api.v1.PreviewPvcStorageRecommendationRequest + (*PreviewPvcStorageRecommendationResponse)(nil), // 411: api.v1.PreviewPvcStorageRecommendationResponse + (*WorkloadRuleOOMEvent)(nil), // 412: api.v1.WorkloadRuleOOMEvent + (*ListWorkloadRuleOOMEventsRequest)(nil), // 413: api.v1.ListWorkloadRuleOOMEventsRequest + (*ListWorkloadRuleOOMEventsResponse)(nil), // 414: api.v1.ListWorkloadRuleOOMEventsResponse + (*ListWorkloadOOMEventsRequest)(nil), // 415: api.v1.ListWorkloadOOMEventsRequest + (*ListWorkloadOOMEventsResponse)(nil), // 416: api.v1.ListWorkloadOOMEventsResponse + (*WorkloadRuleCPUThrottleEvent)(nil), // 417: api.v1.WorkloadRuleCPUThrottleEvent + (*ListWorkloadRuleCPUThrottleEventsRequest)(nil), // 418: api.v1.ListWorkloadRuleCPUThrottleEventsRequest + (*ListWorkloadRuleCPUThrottleEventsResponse)(nil), // 419: api.v1.ListWorkloadRuleCPUThrottleEventsResponse + (*ListWorkloadCPUThrottleEventsRequest)(nil), // 420: api.v1.ListWorkloadCPUThrottleEventsRequest + (*ListWorkloadCPUThrottleEventsResponse)(nil), // 421: api.v1.ListWorkloadCPUThrottleEventsResponse + (*StringSetSelector)(nil), // 422: api.v1.StringSetSelector + (*WorkloadOptimizationPolicyProto)(nil), // 423: api.v1.WorkloadOptimizationPolicyProto + (*GenericOptimizationSettings)(nil), // 424: api.v1.GenericOptimizationSettings + (*CreateWorkloadOptimizationPolicyRequest)(nil), // 425: api.v1.CreateWorkloadOptimizationPolicyRequest + (*CreateWorkloadOptimizationPolicyResponse)(nil), // 426: api.v1.CreateWorkloadOptimizationPolicyResponse + (*ListWorkloadOptimizationPoliciesRequest)(nil), // 427: api.v1.ListWorkloadOptimizationPoliciesRequest + (*ListWorkloadOptimizationPoliciesResponse)(nil), // 428: api.v1.ListWorkloadOptimizationPoliciesResponse + (*GetWorkloadOptimizationPolicyRequest)(nil), // 429: api.v1.GetWorkloadOptimizationPolicyRequest + (*GetWorkloadOptimizationPolicyResponse)(nil), // 430: api.v1.GetWorkloadOptimizationPolicyResponse + (*GetWorkloadOptimizationPolicyByWorkloadRequest)(nil), // 431: api.v1.GetWorkloadOptimizationPolicyByWorkloadRequest + (*GetWorkloadOptimizationPolicyByWorkloadResponse)(nil), // 432: api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse + (*UpdateWorkloadOptimizationPolicyRequest)(nil), // 433: api.v1.UpdateWorkloadOptimizationPolicyRequest + (*ToggleWorkloadOptimizationPolicyDisabledRequest)(nil), // 434: api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest + (*ToggleWorkloadOptimizationPolicyDisabledResponse)(nil), // 435: api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse + (*UpdateWorkloadOptimizationPolicyResponse)(nil), // 436: api.v1.UpdateWorkloadOptimizationPolicyResponse + (*DeleteWorkloadOptimizationPolicyRequest)(nil), // 437: api.v1.DeleteWorkloadOptimizationPolicyRequest + (*DeleteWorkloadOptimizationPolicyResponse)(nil), // 438: api.v1.DeleteWorkloadOptimizationPolicyResponse + (*PreviewWorkloadOptimizationPolicyMatchesRequest)(nil), // 439: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest + (*WorkloadOptimizationPolicyMatch)(nil), // 440: api.v1.WorkloadOptimizationPolicyMatch + (*PreviewWorkloadOptimizationPolicyMatchesResponse)(nil), // 441: api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse + (*SchedulerPolicyTargetProto)(nil), // 442: api.v1.SchedulerPolicyTargetProto + (*SchedulerPolicyProto)(nil), // 443: api.v1.SchedulerPolicyProto + (*CreateSchedulerPolicyRequest)(nil), // 444: api.v1.CreateSchedulerPolicyRequest + (*CreateSchedulerPolicyResponse)(nil), // 445: api.v1.CreateSchedulerPolicyResponse + (*ListSchedulerPoliciesRequest)(nil), // 446: api.v1.ListSchedulerPoliciesRequest + (*ListSchedulerPoliciesResponse)(nil), // 447: api.v1.ListSchedulerPoliciesResponse + (*UpdateSchedulerPolicyRequest)(nil), // 448: api.v1.UpdateSchedulerPolicyRequest + (*UpdateSchedulerPolicyResponse)(nil), // 449: api.v1.UpdateSchedulerPolicyResponse + (*ToggleSchedulerPolicyDisabledRequest)(nil), // 450: api.v1.ToggleSchedulerPolicyDisabledRequest + (*ToggleSchedulerPolicyDisabledResponse)(nil), // 451: api.v1.ToggleSchedulerPolicyDisabledResponse + (*DeleteSchedulerPolicyRequest)(nil), // 452: api.v1.DeleteSchedulerPolicyRequest + (*DeleteSchedulerPolicyResponse)(nil), // 453: api.v1.DeleteSchedulerPolicyResponse + (*PreviewSchedulerPolicyTargetsRequest)(nil), // 454: api.v1.PreviewSchedulerPolicyTargetsRequest + (*SchedulerPolicyTargetMatch)(nil), // 455: api.v1.SchedulerPolicyTargetMatch + (*PreviewSchedulerPolicyTargetsResponse)(nil), // 456: api.v1.PreviewSchedulerPolicyTargetsResponse + (*ListSchedulerPolicyEnrollmentsRequest)(nil), // 457: api.v1.ListSchedulerPolicyEnrollmentsRequest + (*SchedulerPolicyEnrollment)(nil), // 458: api.v1.SchedulerPolicyEnrollment + (*ListSchedulerPolicyEnrollmentsResponse)(nil), // 459: api.v1.ListSchedulerPolicyEnrollmentsResponse + (*SchedulerPolicySync)(nil), // 460: api.v1.SchedulerPolicySync + (*SchedulerConfigPayload)(nil), // 461: api.v1.SchedulerConfigPayload + (*SchedulerRevertInstruction)(nil), // 462: api.v1.SchedulerRevertInstruction + (*SchedulerEnrollmentReport)(nil), // 463: api.v1.SchedulerEnrollmentReport + (*SchedulerRevertEventReport)(nil), // 464: api.v1.SchedulerRevertEventReport + (*GetWorkloadRulesByPolicyRequest)(nil), // 465: api.v1.GetWorkloadRulesByPolicyRequest + (*GetWorkloadRulesByPolicyResponse)(nil), // 466: api.v1.GetWorkloadRulesByPolicyResponse + (*ListWorkloadRulesRequest)(nil), // 467: api.v1.ListWorkloadRulesRequest + (*ListWorkloadRulesResponse)(nil), // 468: api.v1.ListWorkloadRulesResponse + (*GetWorkloadRuleByIDRequest)(nil), // 469: api.v1.GetWorkloadRuleByIDRequest + (*GetWorkloadRuleByIDResponse)(nil), // 470: api.v1.GetWorkloadRuleByIDResponse + (*GetWorkloadRuleByWorkloadRequest)(nil), // 471: api.v1.GetWorkloadRuleByWorkloadRequest + (*GetWorkloadRuleByWorkloadResponse)(nil), // 472: api.v1.GetWorkloadRuleByWorkloadResponse + (*GetWorkloadByWorkloadRuleRequest)(nil), // 473: api.v1.GetWorkloadByWorkloadRuleRequest + (*GetWorkloadByWorkloadRuleResponse)(nil), // 474: api.v1.GetWorkloadByWorkloadRuleResponse + (*DeleteWorkloadRuleRequest)(nil), // 475: api.v1.DeleteWorkloadRuleRequest + (*DeleteWorkloadRuleResponse)(nil), // 476: api.v1.DeleteWorkloadRuleResponse + (*DeleteAllWorkloadRulesRequest)(nil), // 477: api.v1.DeleteAllWorkloadRulesRequest + (*DeleteAllWorkloadRulesResponse)(nil), // 478: api.v1.DeleteAllWorkloadRulesResponse + (*BulkDeleteWorkloadRulesRequest)(nil), // 479: api.v1.BulkDeleteWorkloadRulesRequest + (*BulkDeleteWorkloadRulesResponse)(nil), // 480: api.v1.BulkDeleteWorkloadRulesResponse + (*BulkToggleWorkloadRulesDisabledRequest)(nil), // 481: api.v1.BulkToggleWorkloadRulesDisabledRequest + (*BulkToggleWorkloadRulesDisabledResponse)(nil), // 482: api.v1.BulkToggleWorkloadRulesDisabledResponse + (*DeleteRuleAndApplyRecommendationRequest)(nil), // 483: api.v1.DeleteRuleAndApplyRecommendationRequest + (*DeleteRuleAndApplyRecommendationResponse)(nil), // 484: api.v1.DeleteRuleAndApplyRecommendationResponse + (*ManualRuleFields)(nil), // 485: api.v1.ManualRuleFields + (*UpsertManualWorkloadRuleRequest)(nil), // 486: api.v1.UpsertManualWorkloadRuleRequest + (*UpsertManualWorkloadRuleResponse)(nil), // 487: api.v1.UpsertManualWorkloadRuleResponse + (*ToggleWorkloadRuleDisabledRequest)(nil), // 488: api.v1.ToggleWorkloadRuleDisabledRequest + (*ToggleWorkloadRuleDisabledResponse)(nil), // 489: api.v1.ToggleWorkloadRuleDisabledResponse + (*PreviewWorkloadRuleRequest)(nil), // 490: api.v1.PreviewWorkloadRuleRequest + (*PreviewWorkloadRuleResponse)(nil), // 491: api.v1.PreviewWorkloadRuleResponse + (*GetWorkloadContainerNamesRequest)(nil), // 492: api.v1.GetWorkloadContainerNamesRequest + (*GetWorkloadContainerNamesResponse)(nil), // 493: api.v1.GetWorkloadContainerNamesResponse + (*BatchAutoOptimizeWorkload)(nil), // 494: api.v1.BatchAutoOptimizeWorkload + (*BatchAutoOptimizeWorkloadsRequest)(nil), // 495: api.v1.BatchAutoOptimizeWorkloadsRequest + (*BatchAutoOptimizeWorkloadResult)(nil), // 496: api.v1.BatchAutoOptimizeWorkloadResult + (*BatchAutoOptimizeWorkloadsResponse)(nil), // 497: api.v1.BatchAutoOptimizeWorkloadsResponse + (*BatchWorkloadEntry)(nil), // 498: api.v1.BatchWorkloadEntry + (*BatchUpsertManualWorkloadRulesRequest)(nil), // 499: api.v1.BatchUpsertManualWorkloadRulesRequest + (*BatchUpsertManualWorkloadRuleResult)(nil), // 500: api.v1.BatchUpsertManualWorkloadRuleResult + (*BatchUpsertManualWorkloadRulesResponse)(nil), // 501: api.v1.BatchUpsertManualWorkloadRulesResponse + (*BatchPreviewWorkloadRulesRequest)(nil), // 502: api.v1.BatchPreviewWorkloadRulesRequest + (*BatchPreviewWorkloadRuleResult)(nil), // 503: api.v1.BatchPreviewWorkloadRuleResult + (*BatchPreviewWorkloadRulesResponse)(nil), // 504: api.v1.BatchPreviewWorkloadRulesResponse + (*ApplyOneTimeOptimizationRequest)(nil), // 505: api.v1.ApplyOneTimeOptimizationRequest + (*ApplyOneTimeOptimizationResponse)(nil), // 506: api.v1.ApplyOneTimeOptimizationResponse + (*WorkloadProfileManifest)(nil), // 507: api.v1.WorkloadProfileManifest + (*BatchWorkloadProfiles)(nil), // 508: api.v1.BatchWorkloadProfiles + (*NodeConfigApplyEvent)(nil), // 509: api.v1.NodeConfigApplyEvent + (*GetNodeRecommendationStatusRequest)(nil), // 510: api.v1.GetNodeRecommendationStatusRequest + (*GetNodeRecommendationStatusResponse)(nil), // 511: api.v1.GetNodeRecommendationStatusResponse + (*EnableCheckpointForPolicyRequest)(nil), // 512: api.v1.EnableCheckpointForPolicyRequest + (*EnableCheckpointForPolicyResponse)(nil), // 513: api.v1.EnableCheckpointForPolicyResponse + (*GetCheckpointApplyStatusRequest)(nil), // 514: api.v1.GetCheckpointApplyStatusRequest + (*GetCheckpointApplyStatusResponse)(nil), // 515: api.v1.GetCheckpointApplyStatusResponse + (*NodeApplyFailure)(nil), // 516: api.v1.NodeApplyFailure + (*GetClusterCheckpointLabelCoverageRequest)(nil), // 517: api.v1.GetClusterCheckpointLabelCoverageRequest + (*NodeGroupCheckpointLabelCoverage)(nil), // 518: api.v1.NodeGroupCheckpointLabelCoverage + (*GetClusterCheckpointLabelCoverageResponse)(nil), // 519: api.v1.GetClusterCheckpointLabelCoverageResponse + (*ListNodeGroupCheckpointLabelStateRequest)(nil), // 520: api.v1.ListNodeGroupCheckpointLabelStateRequest + (*NodeCheckpointLabelEntry)(nil), // 521: api.v1.NodeCheckpointLabelEntry + (*ListNodeGroupCheckpointLabelStateResponse)(nil), // 522: api.v1.ListNodeGroupCheckpointLabelStateResponse + (*SnapshotPercentBounds)(nil), // 523: api.v1.SnapshotPercentBounds + (*SnapshotResourceThreshold)(nil), // 524: api.v1.SnapshotResourceThreshold + (*SnapshotSchedulePolicySpec)(nil), // 525: api.v1.SnapshotSchedulePolicySpec + (*SnapshotGlobalRetention)(nil), // 526: api.v1.SnapshotGlobalRetention + (*SnapshotContainerRetentionPolicy)(nil), // 527: api.v1.SnapshotContainerRetentionPolicy + (*SnapshotPodRetentionPolicy)(nil), // 528: api.v1.SnapshotPodRetentionPolicy + (*SnapshotNamespaceRetentionPolicy)(nil), // 529: api.v1.SnapshotNamespaceRetentionPolicy + (*SnapshotRetentionPolicySpec)(nil), // 530: api.v1.SnapshotRetentionPolicySpec + (*SnapshotPolicy)(nil), // 531: api.v1.SnapshotPolicy + (*ForensicSnapshotPolicy)(nil), // 532: api.v1.ForensicSnapshotPolicy + (*SnapshotTargetScope)(nil), // 533: api.v1.SnapshotTargetScope + (*SnapshotPolicyTarget)(nil), // 534: api.v1.SnapshotPolicyTarget + (*ForensicSnapshotPolicyTarget)(nil), // 535: api.v1.ForensicSnapshotPolicyTarget + (*CreateSnapshotPoliciesRequest)(nil), // 536: api.v1.CreateSnapshotPoliciesRequest + (*CreateSnapshotPoliciesResponse)(nil), // 537: api.v1.CreateSnapshotPoliciesResponse + (*ListSnapshotPoliciesRequest)(nil), // 538: api.v1.ListSnapshotPoliciesRequest + (*ListSnapshotPoliciesResponse)(nil), // 539: api.v1.ListSnapshotPoliciesResponse + (*UpdateSnapshotPolicyRequest)(nil), // 540: api.v1.UpdateSnapshotPolicyRequest + (*UpdateSnapshotPolicyResponse)(nil), // 541: api.v1.UpdateSnapshotPolicyResponse + (*DeleteSnapshotPolicyRequest)(nil), // 542: api.v1.DeleteSnapshotPolicyRequest + (*DeleteSnapshotPolicyResponse)(nil), // 543: api.v1.DeleteSnapshotPolicyResponse + (*CreateSnapshotPolicyTargetsRequest)(nil), // 544: api.v1.CreateSnapshotPolicyTargetsRequest + (*CreateSnapshotPolicyTargetsResponse)(nil), // 545: api.v1.CreateSnapshotPolicyTargetsResponse + (*ListSnapshotPolicyTargetsRequest)(nil), // 546: api.v1.ListSnapshotPolicyTargetsRequest + (*ListSnapshotPolicyTargetsResponse)(nil), // 547: api.v1.ListSnapshotPolicyTargetsResponse + (*UpdateSnapshotPolicyTargetRequest)(nil), // 548: api.v1.UpdateSnapshotPolicyTargetRequest + (*UpdateSnapshotPolicyTargetResponse)(nil), // 549: api.v1.UpdateSnapshotPolicyTargetResponse + (*DeleteSnapshotPolicyTargetRequest)(nil), // 550: api.v1.DeleteSnapshotPolicyTargetRequest + (*DeleteSnapshotPolicyTargetResponse)(nil), // 551: api.v1.DeleteSnapshotPolicyTargetResponse + (*CreateForensicSnapshotPoliciesRequest)(nil), // 552: api.v1.CreateForensicSnapshotPoliciesRequest + (*CreateForensicSnapshotPoliciesResponse)(nil), // 553: api.v1.CreateForensicSnapshotPoliciesResponse + (*ListForensicSnapshotPoliciesRequest)(nil), // 554: api.v1.ListForensicSnapshotPoliciesRequest + (*ListForensicSnapshotPoliciesResponse)(nil), // 555: api.v1.ListForensicSnapshotPoliciesResponse + (*UpdateForensicSnapshotPolicyRequest)(nil), // 556: api.v1.UpdateForensicSnapshotPolicyRequest + (*UpdateForensicSnapshotPolicyResponse)(nil), // 557: api.v1.UpdateForensicSnapshotPolicyResponse + (*DeleteForensicSnapshotPolicyRequest)(nil), // 558: api.v1.DeleteForensicSnapshotPolicyRequest + (*DeleteForensicSnapshotPolicyResponse)(nil), // 559: api.v1.DeleteForensicSnapshotPolicyResponse + (*CreateForensicSnapshotPolicyTargetsRequest)(nil), // 560: api.v1.CreateForensicSnapshotPolicyTargetsRequest + (*CreateForensicSnapshotPolicyTargetsResponse)(nil), // 561: api.v1.CreateForensicSnapshotPolicyTargetsResponse + (*ListForensicSnapshotPolicyTargetsRequest)(nil), // 562: api.v1.ListForensicSnapshotPolicyTargetsRequest + (*ListForensicSnapshotPolicyTargetsResponse)(nil), // 563: api.v1.ListForensicSnapshotPolicyTargetsResponse + (*UpdateForensicSnapshotPolicyTargetRequest)(nil), // 564: api.v1.UpdateForensicSnapshotPolicyTargetRequest + (*UpdateForensicSnapshotPolicyTargetResponse)(nil), // 565: api.v1.UpdateForensicSnapshotPolicyTargetResponse + (*DeleteForensicSnapshotPolicyTargetRequest)(nil), // 566: api.v1.DeleteForensicSnapshotPolicyTargetRequest + (*DeleteForensicSnapshotPolicyTargetResponse)(nil), // 567: api.v1.DeleteForensicSnapshotPolicyTargetResponse + (*TriggerForensicSnapshotRunRequest)(nil), // 568: api.v1.TriggerForensicSnapshotRunRequest + (*TriggerForensicSnapshotRunResponse)(nil), // 569: api.v1.TriggerForensicSnapshotRunResponse + (*SnapshotResolvedWorkload)(nil), // 570: api.v1.SnapshotResolvedWorkload + (*SnapshotResolvedNamespace)(nil), // 571: api.v1.SnapshotResolvedNamespace + (*SnapshotClusterScopePreview)(nil), // 572: api.v1.SnapshotClusterScopePreview + (*PreviewSnapshotPolicyTargetMatchesRequest)(nil), // 573: api.v1.PreviewSnapshotPolicyTargetMatchesRequest + (*PreviewSnapshotPolicyTargetMatchesResponse)(nil), // 574: api.v1.PreviewSnapshotPolicyTargetMatchesResponse + (*ForensicTargetOverlap)(nil), // 575: api.v1.ForensicTargetOverlap + (*PreviewForensicSnapshotPolicyTargetMatchesRequest)(nil), // 576: api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest + (*PreviewForensicSnapshotPolicyTargetMatchesResponse)(nil), // 577: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse + (*SnapshotRenderedScopeRow)(nil), // 578: api.v1.SnapshotRenderedScopeRow + (*GetSnapshotPolicyTargetRenderedScopeRequest)(nil), // 579: api.v1.GetSnapshotPolicyTargetRenderedScopeRequest + (*GetSnapshotPolicyTargetRenderedScopeResponse)(nil), // 580: api.v1.GetSnapshotPolicyTargetRenderedScopeResponse + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest)(nil), // 581: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest + (*GetForensicSnapshotPolicyTargetRenderedScopeResponse)(nil), // 582: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse + (*SnapshotConfigInfo)(nil), // 583: api.v1.SnapshotConfigInfo + (*SnapshotConfigApplyEventInfo)(nil), // 584: api.v1.SnapshotConfigApplyEventInfo + (*GetSnapshotRecommendationStatusRequest)(nil), // 585: api.v1.GetSnapshotRecommendationStatusRequest + (*GetSnapshotRecommendationStatusResponse)(nil), // 586: api.v1.GetSnapshotRecommendationStatusResponse + (*GetForensicSnapshotRecommendationStatusRequest)(nil), // 587: api.v1.GetForensicSnapshotRecommendationStatusRequest + (*GetForensicSnapshotRecommendationStatusResponse)(nil), // 588: api.v1.GetForensicSnapshotRecommendationStatusResponse + (*PreviewSnapshotRecommendationConfigRequest)(nil), // 589: api.v1.PreviewSnapshotRecommendationConfigRequest + (*PreviewSnapshotRecommendationConfigResponse)(nil), // 590: api.v1.PreviewSnapshotRecommendationConfigResponse + (*PreviewForensicSnapshotRecommendationConfigRequest)(nil), // 591: api.v1.PreviewForensicSnapshotRecommendationConfigRequest + (*PreviewForensicSnapshotRecommendationConfigResponse)(nil), // 592: api.v1.PreviewForensicSnapshotRecommendationConfigResponse + (*ListReferencedAuthenticationsRequest)(nil), // 593: api.v1.ListReferencedAuthenticationsRequest + (*ReferencedAuthentication)(nil), // 594: api.v1.ReferencedAuthentication + (*ListReferencedAuthenticationsResponse)(nil), // 595: api.v1.ListReferencedAuthenticationsResponse + nil, // 596: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry + nil, // 597: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry + nil, // 598: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry + nil, // 599: api.v1.HPAMetricTrigger.MetadataEntry + nil, // 600: api.v1.KEDATrigger.MetadataEntry + nil, // 601: api.v1.AgentHealth.NodeNameToAgentEntry + nil, // 602: api.v1.WorkloadRecommendation.SourceImagesEntry + nil, // 603: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry + nil, // 604: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry + nil, // 605: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry + nil, // 606: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry + nil, // 607: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry + nil, // 608: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry + nil, // 609: api.v1.NodePolicy.LabelsEntry + nil, // 610: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry + nil, // 611: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry + nil, // 612: api.v1.AWSNodeClassSpec.TagsEntry + nil, // 613: api.v1.SubnetSelectorTerm.TagsEntry + nil, // 614: api.v1.SecurityGroupSelectorTerm.TagsEntry + nil, // 615: api.v1.CapacityReservationSelectorTerm.TagsEntry + nil, // 616: api.v1.AMISelectorTerm.TagsEntry + nil, // 617: api.v1.KubeletConfiguration.SystemReservedEntry + nil, // 618: api.v1.KubeletConfiguration.KubeReservedEntry + nil, // 619: api.v1.KubeletConfiguration.EvictionHardEntry + nil, // 620: api.v1.KubeletConfiguration.EvictionSoftEntry + nil, // 621: api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry + nil, // 622: api.v1.GCPNodeClassSpec.LabelsEntry + nil, // 623: api.v1.GCPNodeClassSpec.MetadataEntry + nil, // 624: api.v1.AzureNodeClassSpec.TagsEntry + nil, // 625: api.v1.OCINodeClassSpec.MetaDataEntry + nil, // 626: api.v1.OCINodeClassSpec.TagsEntry + nil, // 627: api.v1.OCINodeClassSpec.FreeFormTagsEntry + nil, // 628: api.v1.SnapshotCRStatus.AnnotationsEntry + nil, // 629: api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry + nil, // 630: api.v1.SchedulerPolicyProto.ClusterNamesEntry + nil, // 631: api.v1.ListSchedulerPolicyEnrollmentsResponse.ClusterNamesEntry + (*SchedulerEnrollmentReport_Observation)(nil), // 632: api.v1.SchedulerEnrollmentReport.Observation + (*SchedulerRevertEventReport_Event)(nil), // 633: api.v1.SchedulerRevertEventReport.Event + nil, // 634: api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry + nil, // 635: api.v1.ListWorkloadRulesResponse.ClusterNamesEntry + nil, // 636: api.v1.ListWorkloadRulesResponse.PolicyNamesEntry + (*timestamppb.Timestamp)(nil), // 637: google.protobuf.Timestamp + (*WorkloadFilters)(nil), // 638: api.v1.WorkloadFilters + (*Pagination)(nil), // 639: api.v1.Pagination + (K8SObjectKind)(0), // 640: api.v1.K8sObjectKind + (*LabelSelector)(nil), // 641: api.v1.LabelSelector + (*RegexPattern)(nil), // 642: api.v1.RegexPattern + (*WorkloadItem)(nil), // 643: api.v1.WorkloadItem + (*MetricPercentiles)(nil), // 644: api.v1.MetricPercentiles + (*NodeGroup)(nil), // 645: api.v1.NodeGroup + (*HPABehavior)(nil), // 646: api.v1.HPABehavior + (*HPAConnector)(nil), // 647: api.v1.HPAConnector + (*money.Money)(nil), // 648: google.type.Money + (*SavingsTimeSeries)(nil), // 649: api.v1.SavingsTimeSeries + (*GetWorkloadResponse)(nil), // 650: api.v1.GetWorkloadResponse + (*CloudProvider)(nil), // 651: api.v1.CloudProvider + (ProfileWindow)(0), // 652: api.v1.ProfileWindow + (*WorkloadProfileResult)(nil), // 653: api.v1.WorkloadProfileResult + (*ProfileKey)(nil), // 654: api.v1.ProfileKey + (*WorkloadProfileSnapshot)(nil), // 655: api.v1.WorkloadProfileSnapshot } var file_api_v1_recommendation_proto_depIdxs = []int32{ - 419, // 0: api.v1.GetRecommendationsRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 1: api.v1.GetRecommendationsRequest.end_time:type_name -> google.protobuf.Timestamp - 420, // 2: api.v1.GetRecommendationsRequest.filters:type_name -> api.v1.WorkloadFilters - 421, // 3: api.v1.GetRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 172, // 4: api.v1.GetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 421, // 5: api.v1.GetRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 419, // 6: api.v1.GetRecommendationsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 7: api.v1.GetRecommendationsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 172, // 8: api.v1.GetRecommendationsForWorkloadResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 419, // 9: api.v1.GetNodeGroupStatsRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 10: api.v1.GetNodeGroupStatsRequest.end_time:type_name -> google.protobuf.Timestamp - 148, // 11: api.v1.GetNodeGroupStatsResponse.node_stats:type_name -> api.v1.NodeStats - 419, // 12: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 13: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp - 12, // 14: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.mode:type_name -> api.v1.RecommendationMode - 422, // 15: api.v1.GetLatestWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 422, // 16: api.v1.GetLatestWorkloadRecommendationResponse.kind:type_name -> api.v1.K8sObjectKind - 154, // 17: api.v1.GetLatestWorkloadRecommendationResponse.container_recommendations:type_name -> api.v1.ContainerRecommendation - 157, // 18: api.v1.GetLatestWorkloadRecommendationResponse.current_tolerations:type_name -> api.v1.Toleration - 157, // 19: api.v1.GetLatestWorkloadRecommendationResponse.recommended_tolerations:type_name -> api.v1.Toleration - 422, // 20: api.v1.GetPreviewWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 419, // 21: api.v1.GetPreviewWorkloadRecommendationRequest.timestamp:type_name -> google.protobuf.Timestamp - 423, // 22: api.v1.GetPreviewWorkloadRecommendationRequest.vpa_lookback:type_name -> google.protobuf.Duration - 423, // 23: api.v1.GetPreviewWorkloadRecommendationRequest.hpa_lookback:type_name -> google.protobuf.Duration - 172, // 24: api.v1.GetPreviewWorkloadRecommendationResponse.rec:type_name -> api.v1.WorkloadRecommendation - 32, // 25: api.v1.GetPreviewWorkloadRecommendationsRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 419, // 26: api.v1.GetPreviewWorkloadRecommendationsRequest.timestamp:type_name -> google.protobuf.Timestamp - 423, // 27: api.v1.GetPreviewWorkloadRecommendationsRequest.vpa_lookback:type_name -> google.protobuf.Duration - 423, // 28: api.v1.GetPreviewWorkloadRecommendationsRequest.hpa_lookback:type_name -> google.protobuf.Duration - 422, // 29: api.v1.WorkloadIdentifier.kind:type_name -> api.v1.K8sObjectKind - 30, // 30: api.v1.GetPreviewWorkloadRecommendationsResponse.recommendations:type_name -> api.v1.GetPreviewWorkloadRecommendationResponse - 12, // 31: api.v1.CreateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 8, // 32: api.v1.CreateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 33: api.v1.CreateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 158, // 34: api.v1.GetClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 158, // 35: api.v1.ListClusterRecommendationPoliciesResponse.policies:type_name -> api.v1.ClusterRecommendationPolicy - 12, // 36: api.v1.UpdateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 8, // 37: api.v1.UpdateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 38: api.v1.UpdateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 419, // 39: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 40: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.end_time:type_name -> google.protobuf.Timestamp - 32, // 41: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workloads:type_name -> api.v1.WorkloadIdentifier - 386, // 42: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workload_target_map:type_name -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - 10, // 43: api.v1.CreateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 12, // 44: api.v1.CreateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 11, // 45: api.v1.CreateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 8, // 46: api.v1.CreateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 159, // 47: api.v1.CreateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 159, // 48: api.v1.GetNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 159, // 49: api.v1.ListNodeGroupRecommendationPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 10, // 50: api.v1.UpdateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 12, // 51: api.v1.UpdateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 11, // 52: api.v1.UpdateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 8, // 53: api.v1.UpdateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 159, // 54: api.v1.UpdateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 162, // 55: api.v1.CreateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 162, // 56: api.v1.CreateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 162, // 57: api.v1.GetWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 162, // 58: api.v1.ListWorkloadRecommendationPoliciesResponse.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 162, // 59: api.v1.UpdateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 162, // 60: api.v1.UpdateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 422, // 61: api.v1.AttachWorkloadRecommendationPolicyRequest.kind:type_name -> api.v1.K8sObjectKind - 32, // 62: api.v1.AttachWorkloadRecommendationPoliciesRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 75, // 63: api.v1.AttachWorkloadRecommendationPoliciesResponse.attachments:type_name -> api.v1.WorkloadPolicyAttachment - 422, // 64: api.v1.WorkloadPolicyAttachment.kind:type_name -> api.v1.K8sObjectKind - 419, // 65: api.v1.WorkloadPolicyAttachment.created_at:type_name -> google.protobuf.Timestamp - 419, // 66: api.v1.WorkloadPolicyAttachment.updated_at:type_name -> google.protobuf.Timestamp - 424, // 67: api.v1.WorkloadPolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 424, // 68: api.v1.WorkloadPolicyTarget.workload_selector:type_name -> api.v1.LabelSelector - 422, // 69: api.v1.WorkloadPolicyTarget.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 70: api.v1.WorkloadPolicyTarget.name_pattern:type_name -> api.v1.RegexPattern - 424, // 71: api.v1.WorkloadPolicyTarget.annotation_selector:type_name -> api.v1.LabelSelector - 425, // 72: api.v1.WorkloadPolicyTarget.namespace_pattern:type_name -> api.v1.RegexPattern - 419, // 73: api.v1.WorkloadPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 419, // 74: api.v1.WorkloadPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 424, // 75: api.v1.CreateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 424, // 76: api.v1.CreateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 422, // 77: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 78: api.v1.CreateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 424, // 79: api.v1.CreateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 425, // 80: api.v1.CreateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 76, // 81: api.v1.CreateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 76, // 82: api.v1.GetWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 76, // 83: api.v1.ListWorkloadPolicyTargetsResponse.targets:type_name -> api.v1.WorkloadPolicyTarget - 424, // 84: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 424, // 85: api.v1.UpdateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 422, // 86: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 87: api.v1.UpdateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 424, // 88: api.v1.UpdateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 425, // 89: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 76, // 90: api.v1.UpdateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 424, // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_selector:type_name -> api.v1.LabelSelector - 424, // 92: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.workload_selector:type_name -> api.v1.LabelSelector - 422, // 93: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 94: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern - 424, // 95: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.annotation_selector:type_name -> api.v1.LabelSelector - 425, // 96: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 426, // 97: api.v1.PreviewWorkloadPolicyTargetMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadItem - 424, // 98: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_selector:type_name -> api.v1.LabelSelector - 424, // 99: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.workload_selector:type_name -> api.v1.LabelSelector - 422, // 100: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 101: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.name_pattern:type_name -> api.v1.RegexPattern - 424, // 102: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.annotation_selector:type_name -> api.v1.LabelSelector - 425, // 103: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 172, // 104: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 426, // 105: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_items:type_name -> api.v1.WorkloadItem - 387, // 106: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_percentiles:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - 427, // 107: api.v1.WorkloadPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles - 427, // 108: api.v1.WorkloadPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles - 427, // 109: api.v1.WorkloadPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles - 427, // 110: api.v1.WorkloadPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles - 427, // 111: api.v1.WorkloadPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles - 419, // 112: api.v1.NodeGroupPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 419, // 113: api.v1.NodeGroupPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 96, // 114: api.v1.CreateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 96, // 115: api.v1.GetNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 96, // 116: api.v1.ListNodeGroupPolicyTargetsResponse.targets:type_name -> api.v1.NodeGroupPolicyTarget - 96, // 117: api.v1.UpdateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 428, // 118: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse.matched_node_groups:type_name -> api.v1.NodeGroup - 170, // 119: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.NodeGroupRecommendation - 165, // 120: api.v1.BalanceGetRecommendationsRequest.register:type_name -> api.v1.BalanceRegisterRequest - 167, // 121: api.v1.BalanceGetRecommendationsRequest.apply:type_name -> api.v1.BalanceApplyRecommendationResponse - 142, // 122: api.v1.BalanceGetRecommendationsRequest.workload_meta:type_name -> api.v1.ReconcileWorkload - 172, // 123: api.v1.BalanceGetRecommendationsRequest.in_cluster_recommendation:type_name -> api.v1.WorkloadRecommendation - 144, // 124: api.v1.BalanceGetRecommendationsRequest.operator_health:type_name -> api.v1.OperatorHealth - 145, // 125: api.v1.BalanceGetRecommendationsRequest.agent_health:type_name -> api.v1.AgentHealth - 170, // 126: api.v1.BalanceGetRecommendationsResponse.node_group_recommendation:type_name -> api.v1.NodeGroupRecommendation - 172, // 127: api.v1.BalanceGetRecommendationsResponse.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 293, // 128: api.v1.BalanceGetRecommendationsResponse.node_recommendation:type_name -> api.v1.NodeRecommendation - 115, // 129: api.v1.BalanceGetRecommendationsResponse.batch_node_group_recommendations:type_name -> api.v1.BatchNodeGroupRecommendations - 116, // 130: api.v1.BalanceGetRecommendationsResponse.batch_workload_recommendations:type_name -> api.v1.BatchWorkloadRecommendations - 130, // 131: api.v1.BalanceGetRecommendationsResponse.kind_to_namespace_to_workloads:type_name -> api.v1.WorkloadWithActiveRecommendations - 143, // 132: api.v1.BalanceGetRecommendationsResponse.workload_reconcile_response:type_name -> api.v1.ReconcileResponse - 376, // 133: api.v1.BalanceGetRecommendationsResponse.workload_profile_manifest:type_name -> api.v1.WorkloadProfileManifest - 377, // 134: api.v1.BalanceGetRecommendationsResponse.batch_workload_profiles:type_name -> api.v1.BatchWorkloadProfiles - 147, // 135: api.v1.BalanceGetRecommendationsResponse.health_update_requested:type_name -> api.v1.HealthReport - 132, // 136: api.v1.BalanceGetRecommendationsResponse.batch_generic_resource_recommendations:type_name -> api.v1.BatchGenericResourceRecommendations - 133, // 137: api.v1.BalanceGetRecommendationsResponse.batch_pvc_storage_recommendations:type_name -> api.v1.BatchPvcStorageRecommendations - 129, // 138: api.v1.BalanceGetRecommendationsResponse.batch_workload_rules:type_name -> api.v1.BatchWorkloadRules - 291, // 139: api.v1.BalanceGetRecommendationsResponse.karpenter_settings:type_name -> api.v1.KarpenterSettingsRecommendation - 170, // 140: api.v1.BatchNodeGroupRecommendations.recommendations:type_name -> api.v1.NodeGroupRecommendation - 172, // 141: api.v1.BatchWorkloadRecommendations.recommendations:type_name -> api.v1.WorkloadRecommendation - 118, // 142: api.v1.WorkloadRule.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 118, // 143: api.v1.WorkloadRule.memory_rule:type_name -> api.v1.ResourceRuleConfig - 118, // 144: api.v1.WorkloadRule.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 123, // 145: api.v1.WorkloadRule.hpa_rule:type_name -> api.v1.HPARuleConfig - 8, // 146: api.v1.WorkloadRule.action_triggers:type_name -> api.v1.ActionTrigger - 9, // 147: api.v1.WorkloadRule.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 124, // 148: api.v1.WorkloadRule.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 126, // 149: api.v1.WorkloadRule.percentiles:type_name -> api.v1.ResourcePercentiles - 128, // 150: api.v1.WorkloadRule.classification:type_name -> api.v1.WorkloadClassification - 419, // 151: api.v1.WorkloadRule.created_at:type_name -> google.protobuf.Timestamp - 419, // 152: api.v1.WorkloadRule.updated_at:type_name -> google.protobuf.Timestamp - 122, // 153: api.v1.WorkloadRule.containers:type_name -> api.v1.ContainerResourceRuleConfig - 388, // 154: api.v1.HPAMetricTrigger.metadata:type_name -> api.v1.HPAMetricTrigger.MetadataEntry - 121, // 155: api.v1.ContainerResourceRuleConfig.cpu_rule:type_name -> api.v1.ContainerResourceConfig - 121, // 156: api.v1.ContainerResourceRuleConfig.memory_rule:type_name -> api.v1.ContainerResourceConfig - 121, // 157: api.v1.ContainerResourceRuleConfig.gpu_rule:type_name -> api.v1.ContainerResourceConfig - 14, // 158: api.v1.HPARuleConfig.primary_metric:type_name -> api.v1.HPAMetricType - 119, // 159: api.v1.HPARuleConfig.metrics:type_name -> api.v1.HPAMetricTrigger - 429, // 160: api.v1.HPARuleConfig.behavior:type_name -> api.v1.HPABehavior - 120, // 161: api.v1.HPARuleConfig.fallback:type_name -> api.v1.HPAFallback - 125, // 162: api.v1.ResourcePercentiles.cpu:type_name -> api.v1.PercentileValues - 125, // 163: api.v1.ResourcePercentiles.memory:type_name -> api.v1.PercentileValues - 125, // 164: api.v1.ResourcePercentiles.network:type_name -> api.v1.PercentileValues - 125, // 165: api.v1.ResourcePercentiles.disk:type_name -> api.v1.PercentileValues - 127, // 166: api.v1.WorkloadClassification.burstiness:type_name -> api.v1.BurstinessRatios - 117, // 167: api.v1.BatchWorkloadRules.rules:type_name -> api.v1.WorkloadRule - 32, // 168: api.v1.WorkloadWithActiveRecommendations.workloads:type_name -> api.v1.WorkloadIdentifier - 419, // 169: api.v1.GenericResourceRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 4, // 170: api.v1.GenericResourceRecommendation.status:type_name -> api.v1.RecommendationStatus - 419, // 171: api.v1.GenericResourceRecommendation.created_at:type_name -> google.protobuf.Timestamp - 419, // 172: api.v1.GenericResourceRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 131, // 173: api.v1.BatchGenericResourceRecommendations.recommendations:type_name -> api.v1.GenericResourceRecommendation - 323, // 174: api.v1.BatchPvcStorageRecommendations.recommendations:type_name -> api.v1.PvcStorageRecommendation - 32, // 175: api.v1.GeneratePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 131, // 176: api.v1.GeneratePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 32, // 177: api.v1.GenerateAndCreatePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 131, // 178: api.v1.GenerateAndCreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 131, // 179: api.v1.CreatePodDisruptionBudgetRequest.recommendation:type_name -> api.v1.GenericResourceRecommendation - 131, // 180: api.v1.CreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 32, // 181: api.v1.GetPDBRecommendationForWorkloadRequest.workload:type_name -> api.v1.WorkloadIdentifier - 131, // 182: api.v1.GetPDBRecommendationForWorkloadResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 422, // 183: api.v1.ReconcileWorkload.kind:type_name -> api.v1.K8sObjectKind - 0, // 184: api.v1.ReconcileResponse.status:type_name -> api.v1.ReconcileStatus - 172, // 185: api.v1.ReconcileResponse.updated_recommendation:type_name -> api.v1.WorkloadRecommendation - 389, // 186: api.v1.AgentHealth.node_name_to_agent:type_name -> api.v1.AgentHealth.NodeNameToAgentEntry - 149, // 187: api.v1.NodeStats.metrics:type_name -> api.v1.NodeMetric - 419, // 188: api.v1.NodeMetric.timestamp:type_name -> google.protobuf.Timestamp - 422, // 189: api.v1.ContainerStats.kind:type_name -> api.v1.K8sObjectKind - 151, // 190: api.v1.ContainerStats.metrics:type_name -> api.v1.ContainerMetric - 152, // 191: api.v1.ContainerStats.summarized_metrics:type_name -> api.v1.ContainerSummarizedMetric - 419, // 192: api.v1.ContainerMetric.timestamp:type_name -> google.protobuf.Timestamp - 419, // 193: api.v1.ContainerSummarizedMetric.timestamp:type_name -> google.protobuf.Timestamp - 153, // 194: api.v1.ContainerSummarizedMetric.cpu:type_name -> api.v1.Metric - 153, // 195: api.v1.ContainerSummarizedMetric.memory:type_name -> api.v1.Metric - 153, // 196: api.v1.ContainerSummarizedMetric.gpu:type_name -> api.v1.Metric - 153, // 197: api.v1.ContainerSummarizedMetric.gpu_vram:type_name -> api.v1.Metric - 156, // 198: api.v1.ContainerRecommendation.current_request:type_name -> api.v1.ResourceRecommendation - 156, // 199: api.v1.ContainerRecommendation.recommended_request:type_name -> api.v1.ResourceRecommendation - 156, // 200: api.v1.ContainerRecommendation.current_limit:type_name -> api.v1.ResourceRecommendation - 156, // 201: api.v1.ContainerRecommendation.recommended_limit:type_name -> api.v1.ResourceRecommendation - 1, // 202: api.v1.ResourceRecommendation.cpu_action:type_name -> api.v1.ActionToTake - 1, // 203: api.v1.ResourceRecommendation.mem_action:type_name -> api.v1.ActionToTake - 1, // 204: api.v1.ResourceRecommendation.gpu_action:type_name -> api.v1.ActionToTake - 1, // 205: api.v1.ResourceRecommendation.gpu_vram_action:type_name -> api.v1.ActionToTake - 8, // 206: api.v1.ClusterRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 12, // 207: api.v1.ClusterRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 8, // 208: api.v1.ClusterRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 209: api.v1.NodeGroupRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 10, // 210: api.v1.NodeGroupRecommendationPolicy.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 12, // 211: api.v1.NodeGroupRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 11, // 212: api.v1.NodeGroupRecommendationPolicy.actions:type_name -> api.v1.NodeGroupActionsAllowed - 8, // 213: api.v1.NodeGroupRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 14, // 214: api.v1.HorizontalScalingOptimizationTarget.primary_metric:type_name -> api.v1.HPAMetricType - 8, // 215: api.v1.WorkloadRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 9, // 216: api.v1.WorkloadRecommendationPolicy.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 12, // 217: api.v1.WorkloadRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 160, // 218: api.v1.WorkloadRecommendationPolicy.cpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 160, // 219: api.v1.WorkloadRecommendationPolicy.memory_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 160, // 220: api.v1.WorkloadRecommendationPolicy.gpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 160, // 221: api.v1.WorkloadRecommendationPolicy.gpu_vram_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 161, // 222: api.v1.WorkloadRecommendationPolicy.horizontal_scaling:type_name -> api.v1.HorizontalScalingOptimizationTarget - 8, // 223: api.v1.WorkloadRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 124, // 224: api.v1.WorkloadRecommendationPolicy.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 419, // 225: api.v1.WorkloadRecommendationPolicy.deleted_at:type_name -> google.protobuf.Timestamp - 12, // 226: api.v1.GetPolicyRecommendedDefaultsRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 162, // 227: api.v1.GetPolicyRecommendedDefaultsResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 166, // 228: api.v1.BalanceRegisterRequest.features:type_name -> api.v1.BalanceFeatures - 13, // 229: api.v1.BalanceApplyRecommendationResponse.type:type_name -> api.v1.RecommendationType - 168, // 230: api.v1.BalanceApplyRecommendationResponse.live_migration_result:type_name -> api.v1.LiveMigrationResult - 419, // 231: api.v1.NodeGroupRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 159, // 232: api.v1.NodeGroupRecommendation.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 430, // 233: api.v1.CostImpact.current_cost_per_month:type_name -> google.type.Money - 430, // 234: api.v1.CostImpact.recommended_cost_per_month:type_name -> google.type.Money - 430, // 235: api.v1.CostImpact.current_cpu_cost_per_month:type_name -> google.type.Money - 430, // 236: api.v1.CostImpact.current_memory_cost_per_month:type_name -> google.type.Money - 430, // 237: api.v1.CostImpact.recommended_cpu_cost_per_month:type_name -> google.type.Money - 430, // 238: api.v1.CostImpact.recommended_memory_cost_per_month:type_name -> google.type.Money - 430, // 239: api.v1.CostImpact.current_gpu_cost_per_month:type_name -> google.type.Money - 430, // 240: api.v1.CostImpact.recommended_gpu_cost_per_month:type_name -> google.type.Money - 2, // 241: api.v1.CostImpact.cost_period:type_name -> api.v1.CostPeriod - 422, // 242: api.v1.WorkloadRecommendation.kind:type_name -> api.v1.K8sObjectKind - 154, // 243: api.v1.WorkloadRecommendation.container_recommendations:type_name -> api.v1.ContainerRecommendation - 419, // 244: api.v1.WorkloadRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 155, // 245: api.v1.WorkloadRecommendation.keda_scaled_object_recommendation:type_name -> api.v1.KedaScaledObjectRecommendation - 424, // 246: api.v1.WorkloadRecommendation.label_selector:type_name -> api.v1.LabelSelector - 3, // 247: api.v1.WorkloadRecommendation.del_prop:type_name -> api.v1.LiveMigDeletionPropagation - 157, // 248: api.v1.WorkloadRecommendation.current_tolerations:type_name -> api.v1.Toleration - 157, // 249: api.v1.WorkloadRecommendation.recommended_tolerations:type_name -> api.v1.Toleration - 4, // 250: api.v1.WorkloadRecommendation.status:type_name -> api.v1.RecommendationStatus - 162, // 251: api.v1.WorkloadRecommendation.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 76, // 252: api.v1.WorkloadRecommendation.policy_target:type_name -> api.v1.WorkloadPolicyTarget - 1, // 253: api.v1.WorkloadRecommendation.replica_count_action:type_name -> api.v1.ActionToTake - 168, // 254: api.v1.WorkloadRecommendation.live_migration_result:type_name -> api.v1.LiveMigrationResult - 171, // 255: api.v1.WorkloadRecommendation.cost_impact:type_name -> api.v1.CostImpact - 159, // 256: api.v1.GetAttachedNodeGroupPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 422, // 257: api.v1.GetAttachedWorkloadPoliciesRequest.kind:type_name -> api.v1.K8sObjectKind - 177, // 258: api.v1.GetAttachedWorkloadPoliciesResponse.relevant_policies:type_name -> api.v1.WorkloadRecommendationPolicyGroup - 390, // 259: api.v1.GetAttachedWorkloadPoliciesResponse.policy_id_to_matched_targets:type_name -> api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - 162, // 260: api.v1.WorkloadRecommendationPolicyGroup.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 76, // 261: api.v1.WorkloadPolicyTargetGroup.targets:type_name -> api.v1.WorkloadPolicyTarget - 32, // 262: api.v1.WorkloadIdentifiers.workloads:type_name -> api.v1.WorkloadIdentifier - 32, // 263: api.v1.WorkloadPolicies.workload:type_name -> api.v1.WorkloadIdentifier - 162, // 264: api.v1.WorkloadPolicies.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 391, // 265: api.v1.ListAttachedWorkloadPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - 392, // 266: api.v1.ListAttachedWorkloadPoliciesResponse.workload_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - 393, // 267: api.v1.ListAttachedNodeGroupPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - 394, // 268: api.v1.ListAttachedNodeGroupPoliciesResponse.node_group_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - 422, // 269: api.v1.RecommendationAppliedRequest.kind:type_name -> api.v1.K8sObjectKind - 422, // 270: api.v1.ApplyRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 172, // 271: api.v1.ApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 419, // 272: api.v1.RetrieveSavingsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 419, // 273: api.v1.RetrieveSavingsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 431, // 274: api.v1.RetrieveSavingsForWorkloadResponse.savings:type_name -> api.v1.SavingsTimeSeries - 432, // 275: api.v1.RetrieveSavingsForWorkloadResponse.get_workload_resp:type_name -> api.v1.GetWorkloadResponse - 226, // 276: api.v1.CreateNodePoliciesRequest.policies:type_name -> api.v1.NodePolicy - 226, // 277: api.v1.CreateNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 226, // 278: api.v1.SuggestedNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 226, // 279: api.v1.GenerateNodePoliciesFromKarpenterResponse.policies:type_name -> api.v1.NodePolicy - 247, // 280: api.v1.GenerateNodePoliciesFromKarpenterResponse.targets:type_name -> api.v1.NodePolicyTarget - 226, // 281: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.policies:type_name -> api.v1.NodePolicy - 247, // 282: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.targets:type_name -> api.v1.NodePolicyTarget - 214, // 283: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.warnings:type_name -> api.v1.WorkloadCompatibilityWarning - 202, // 284: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.eligibility:type_name -> api.v1.NodeGroupMigrationEligibility - 419, // 285: api.v1.GetMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp - 419, // 286: api.v1.GetMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp - 419, // 287: api.v1.NodePoolValidationReport.reported_at:type_name -> google.protobuf.Timestamp - 212, // 288: api.v1.GetNodePoolValidationsResponse.validations:type_name -> api.v1.NodePoolValidationReport - 226, // 289: api.v1.ListNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 226, // 290: api.v1.UpdateNodePolicyRequest.policy:type_name -> api.v1.NodePolicy - 226, // 291: api.v1.UpdateNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 5, // 292: api.v1.NodeGroupCheckpointStatus.state:type_name -> api.v1.NodeGroupCheckpointState - 395, // 293: api.v1.GetNodeGroupsCheckpointStatusResponse.by_node_group:type_name -> api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry - 424, // 294: api.v1.NodePolicy.instance_categories:type_name -> api.v1.LabelSelector - 424, // 295: api.v1.NodePolicy.instance_families:type_name -> api.v1.LabelSelector - 424, // 296: api.v1.NodePolicy.instance_cpus:type_name -> api.v1.LabelSelector - 424, // 297: api.v1.NodePolicy.instance_hypervisors:type_name -> api.v1.LabelSelector - 424, // 298: api.v1.NodePolicy.instance_generations:type_name -> api.v1.LabelSelector - 424, // 299: api.v1.NodePolicy.instance_sizes:type_name -> api.v1.LabelSelector - 424, // 300: api.v1.NodePolicy.instance_types:type_name -> api.v1.LabelSelector - 424, // 301: api.v1.NodePolicy.instance_local_nvme:type_name -> api.v1.LabelSelector - 424, // 302: api.v1.NodePolicy.zones:type_name -> api.v1.LabelSelector - 424, // 303: api.v1.NodePolicy.architectures:type_name -> api.v1.LabelSelector - 424, // 304: api.v1.NodePolicy.capacity_types:type_name -> api.v1.LabelSelector - 424, // 305: api.v1.NodePolicy.operating_systems:type_name -> api.v1.LabelSelector - 396, // 306: api.v1.NodePolicy.labels:type_name -> api.v1.NodePolicy.LabelsEntry - 251, // 307: api.v1.NodePolicy.taints:type_name -> api.v1.Taint - 253, // 308: api.v1.NodePolicy.disruption:type_name -> api.v1.DisruptionPolicy - 254, // 309: api.v1.NodePolicy.limits:type_name -> api.v1.ResourceLimits - 251, // 310: api.v1.NodePolicy.startup_taints:type_name -> api.v1.Taint - 255, // 311: api.v1.NodePolicy.aws:type_name -> api.v1.AWSNodeClassSpec - 279, // 312: api.v1.NodePolicy.gcp:type_name -> api.v1.GCPNodeClassSpec - 282, // 313: api.v1.NodePolicy.azure:type_name -> api.v1.AzureNodeClassSpec - 290, // 314: api.v1.NodePolicy.oci:type_name -> api.v1.OCINodeClassSpec - 433, // 315: api.v1.NodePolicy.cloud_provider:type_name -> api.v1.CloudProvider - 250, // 316: api.v1.NodePolicy.zonal_shift:type_name -> api.v1.ZonalShiftConfig - 292, // 317: api.v1.NodePolicy.raw:type_name -> api.v1.RawKarpenterSpec - 419, // 318: api.v1.NodePolicy.created_at:type_name -> google.protobuf.Timestamp - 419, // 319: api.v1.NodePolicy.updated_at:type_name -> google.protobuf.Timestamp - 419, // 320: api.v1.NodePolicy.deleted_at:type_name -> google.protobuf.Timestamp - 226, // 321: api.v1.PreviewNodeRecommendationConfigRequest.policies:type_name -> api.v1.NodePolicy - 229, // 322: api.v1.PreviewNodeRecommendationConfigResponse.nrc:type_name -> api.v1.NodeRecommendationConfig - 4, // 323: api.v1.NodeRecommendationConfig.status:type_name -> api.v1.RecommendationStatus - 419, // 324: api.v1.NodeRecommendationConfig.created_at:type_name -> google.protobuf.Timestamp - 419, // 325: api.v1.NodeRecommendationConfig.updated_at:type_name -> google.protobuf.Timestamp - 419, // 326: api.v1.NodeRecommendationConfig.deleted_at:type_name -> google.protobuf.Timestamp - 397, // 327: api.v1.SuggestedKarpenterConfigResponse.ng_to_original:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - 398, // 328: api.v1.SuggestedKarpenterConfigResponse.ng_to_suggested:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - 234, // 329: api.v1.GetAvailableKindsByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 6, // 330: api.v1.SearchResourcesByTargetingFiltersRequest.target_filter_type:type_name -> api.v1.TargetFilterType - 234, // 331: api.v1.SearchResourcesByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 422, // 332: api.v1.TargetFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 425, // 333: api.v1.TargetFilters.name_pattern:type_name -> api.v1.RegexPattern - 425, // 334: api.v1.TargetFilters.namespace_pattern:type_name -> api.v1.RegexPattern - 422, // 335: api.v1.GetAvailableKindsByTargetingFiltersResponse.kinds:type_name -> api.v1.K8sObjectKind - 237, // 336: api.v1.SearchResourcesByTargetingFiltersResponse.namespaces:type_name -> api.v1.NamespaceSearchResult - 238, // 337: api.v1.SearchResourcesByTargetingFiltersResponse.workloads:type_name -> api.v1.WorkloadSearchResult - 239, // 338: api.v1.SearchResourcesByTargetingFiltersResponse.node_groups:type_name -> api.v1.NodeGroupSearchResult - 240, // 339: api.v1.SearchResourcesByTargetingFiltersResponse.labels:type_name -> api.v1.LabelSearchResult - 247, // 340: api.v1.CreateNodePolicyTargetsRequest.targets:type_name -> api.v1.NodePolicyTarget - 247, // 341: api.v1.CreateNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 247, // 342: api.v1.ListNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 247, // 343: api.v1.UpdateNodePolicyTargetRequest.target:type_name -> api.v1.NodePolicyTarget - 247, // 344: api.v1.UpdateNodePolicyTargetResponse.target:type_name -> api.v1.NodePolicyTarget - 419, // 345: api.v1.NodePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 419, // 346: api.v1.NodePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 419, // 347: api.v1.NodePolicyTarget.deleted_at:type_name -> google.protobuf.Timestamp - 249, // 348: api.v1.NodePolicyTarget.status:type_name -> api.v1.NodePolicyTargetStatus - 419, // 349: api.v1.NodePolicyCondition.last_transition_time:type_name -> google.protobuf.Timestamp - 248, // 350: api.v1.NodePolicyTargetStatus.conditions:type_name -> api.v1.NodePolicyCondition - 252, // 351: api.v1.DisruptionPolicy.budgets:type_name -> api.v1.DisruptionBudget - 271, // 352: api.v1.AWSNodeClassSpec.subnet_selector_terms:type_name -> api.v1.SubnetSelectorTerm - 272, // 353: api.v1.AWSNodeClassSpec.security_group_selector_terms:type_name -> api.v1.SecurityGroupSelectorTerm - 273, // 354: api.v1.AWSNodeClassSpec.capacity_reservation_selector_terms:type_name -> api.v1.CapacityReservationSelectorTerm - 274, // 355: api.v1.AWSNodeClassSpec.ami_selector_terms:type_name -> api.v1.AMISelectorTerm - 399, // 356: api.v1.AWSNodeClassSpec.tags:type_name -> api.v1.AWSNodeClassSpec.TagsEntry - 275, // 357: api.v1.AWSNodeClassSpec.kubelet:type_name -> api.v1.KubeletConfiguration - 276, // 358: api.v1.AWSNodeClassSpec.block_device_mappings:type_name -> api.v1.BlockDeviceMapping - 7, // 359: api.v1.AWSNodeClassSpec.instance_store_policy:type_name -> api.v1.InstanceStorePolicy - 278, // 360: api.v1.AWSNodeClassSpec.metadata_options:type_name -> api.v1.MetadataOptions - 260, // 361: api.v1.GetInstanceFamiliesResponse.instance_families:type_name -> api.v1.InstanceFamily - 261, // 362: api.v1.GetInstanceSizesResponse.instance_sizes:type_name -> api.v1.InstanceSize - 262, // 363: api.v1.GetInstanceCategoriesResponse.instance_categories:type_name -> api.v1.InstanceCategory - 263, // 364: api.v1.GetInstanceCPUsResponse.instance_cpus:type_name -> api.v1.InstanceCPU - 264, // 365: api.v1.GetInstanceTypeNamesResponse.instance_types:type_name -> api.v1.InstanceTypeName - 400, // 366: api.v1.SubnetSelectorTerm.tags:type_name -> api.v1.SubnetSelectorTerm.TagsEntry - 401, // 367: api.v1.SecurityGroupSelectorTerm.tags:type_name -> api.v1.SecurityGroupSelectorTerm.TagsEntry - 402, // 368: api.v1.CapacityReservationSelectorTerm.tags:type_name -> api.v1.CapacityReservationSelectorTerm.TagsEntry - 403, // 369: api.v1.AMISelectorTerm.tags:type_name -> api.v1.AMISelectorTerm.TagsEntry - 404, // 370: api.v1.KubeletConfiguration.system_reserved:type_name -> api.v1.KubeletConfiguration.SystemReservedEntry - 405, // 371: api.v1.KubeletConfiguration.kube_reserved:type_name -> api.v1.KubeletConfiguration.KubeReservedEntry - 406, // 372: api.v1.KubeletConfiguration.eviction_hard:type_name -> api.v1.KubeletConfiguration.EvictionHardEntry - 407, // 373: api.v1.KubeletConfiguration.eviction_soft:type_name -> api.v1.KubeletConfiguration.EvictionSoftEntry - 408, // 374: api.v1.KubeletConfiguration.eviction_soft_grace_period:type_name -> api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - 277, // 375: api.v1.BlockDeviceMapping.ebs:type_name -> api.v1.BlockDevice - 280, // 376: api.v1.GCPNodeClassSpec.image_selector_terms:type_name -> api.v1.GCPImageSelectorTerm - 275, // 377: api.v1.GCPNodeClassSpec.kubelet_configuration:type_name -> api.v1.KubeletConfiguration - 409, // 378: api.v1.GCPNodeClassSpec.labels:type_name -> api.v1.GCPNodeClassSpec.LabelsEntry - 410, // 379: api.v1.GCPNodeClassSpec.metadata:type_name -> api.v1.GCPNodeClassSpec.MetadataEntry - 281, // 380: api.v1.GCPNodeClassSpec.disks:type_name -> api.v1.GCPDisk - 411, // 381: api.v1.AzureNodeClassSpec.tags:type_name -> api.v1.AzureNodeClassSpec.TagsEntry - 283, // 382: api.v1.AzureNodeClassSpec.kubelet:type_name -> api.v1.AzureKubeletConfiguration - 284, // 383: api.v1.OCINodeClassSpec.image_selector:type_name -> api.v1.OCIImageSelectorTerm - 285, // 384: api.v1.OCINodeClassSpec.subnet_selector:type_name -> api.v1.OCISubnetSelectorTerm - 286, // 385: api.v1.OCINodeClassSpec.security_group_selector:type_name -> api.v1.OCISecurityGroupSelectorTerm - 412, // 386: api.v1.OCINodeClassSpec.meta_data:type_name -> api.v1.OCINodeClassSpec.MetaDataEntry - 413, // 387: api.v1.OCINodeClassSpec.tags:type_name -> api.v1.OCINodeClassSpec.TagsEntry - 414, // 388: api.v1.OCINodeClassSpec.free_form_tags:type_name -> api.v1.OCINodeClassSpec.FreeFormTagsEntry - 287, // 389: api.v1.OCINodeClassSpec.boot_config:type_name -> api.v1.OCIBootConfig - 288, // 390: api.v1.OCINodeClassSpec.launch_options:type_name -> api.v1.OCILaunchOptions - 289, // 391: api.v1.OCINodeClassSpec.block_devices:type_name -> api.v1.OCIVolumeAttributes - 294, // 392: api.v1.NodeRecommendation.aws:type_name -> api.v1.AWSKarpenterSpec - 295, // 393: api.v1.NodeRecommendation.aks:type_name -> api.v1.AKSKarpenterSpec - 299, // 394: api.v1.NodeRecommendation.gcp:type_name -> api.v1.GCPKarpenterSpec - 301, // 395: api.v1.NodeRecommendation.oci:type_name -> api.v1.OCIKarpenterSpec - 296, // 396: api.v1.AWSKarpenterSpec.np:type_name -> api.v1.NodePool - 297, // 397: api.v1.AWSKarpenterSpec.ec2nc:type_name -> api.v1.EC2NodeClass - 296, // 398: api.v1.AKSKarpenterSpec.np:type_name -> api.v1.NodePool - 298, // 399: api.v1.AKSKarpenterSpec.aksnc:type_name -> api.v1.AKSNodeClass - 296, // 400: api.v1.GCPKarpenterSpec.np:type_name -> api.v1.NodePool - 300, // 401: api.v1.GCPKarpenterSpec.node_classes:type_name -> api.v1.GCENodeClass - 296, // 402: api.v1.OCIKarpenterSpec.np:type_name -> api.v1.NodePool - 302, // 403: api.v1.OCIKarpenterSpec.node_classes:type_name -> api.v1.OCINodeClass - 8, // 404: api.v1.StorageRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 8, // 405: api.v1.StorageRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 419, // 406: api.v1.StorageRecommendationPolicy.created_at:type_name -> google.protobuf.Timestamp - 419, // 407: api.v1.StorageRecommendationPolicy.updated_at:type_name -> google.protobuf.Timestamp - 8, // 408: api.v1.CreateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 303, // 409: api.v1.CreateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 303, // 410: api.v1.GetStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 303, // 411: api.v1.ListStorageRecommendationPoliciesResponse.policies:type_name -> api.v1.StorageRecommendationPolicy - 8, // 412: api.v1.UpdateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 303, // 413: api.v1.UpdateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 424, // 414: api.v1.StoragePolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 419, // 415: api.v1.StoragePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 419, // 416: api.v1.StoragePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 424, // 417: api.v1.CreateStoragePolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 314, // 418: api.v1.CreateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 314, // 419: api.v1.ListStoragePolicyTargetsResponse.targets:type_name -> api.v1.StoragePolicyTarget - 314, // 420: api.v1.UpdateStoragePolicyTargetRequest.target:type_name -> api.v1.StoragePolicyTarget - 314, // 421: api.v1.UpdateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 4, // 422: api.v1.PvcStorageRecommendation.status:type_name -> api.v1.RecommendationStatus - 419, // 423: api.v1.PvcStorageRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 419, // 424: api.v1.PvcStorageRecommendation.applied_at:type_name -> google.protobuf.Timestamp - 419, // 425: api.v1.PvcStorageRecommendation.created_at:type_name -> google.protobuf.Timestamp - 419, // 426: api.v1.PvcStorageRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 15, // 427: api.v1.PvcStorageRecommendation.operation_type:type_name -> api.v1.PvcOperationType - 323, // 428: api.v1.GetPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 421, // 429: api.v1.ListPvcStorageRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 323, // 430: api.v1.ListPvcStorageRecommendationsResponse.recommendations:type_name -> api.v1.PvcStorageRecommendation - 421, // 431: api.v1.ListPvcStorageRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 323, // 432: api.v1.GeneratePvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 323, // 433: api.v1.PreviewPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 419, // 434: api.v1.WorkloadRuleOOMEvent.timestamp:type_name -> google.protobuf.Timestamp - 419, // 435: api.v1.WorkloadRuleOOMEvent.created_at:type_name -> google.protobuf.Timestamp - 332, // 436: api.v1.ListWorkloadRuleOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 332, // 437: api.v1.ListWorkloadOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 419, // 438: api.v1.WorkloadRuleCPUThrottleEvent.timestamp:type_name -> google.protobuf.Timestamp - 419, // 439: api.v1.WorkloadRuleCPUThrottleEvent.created_at:type_name -> google.protobuf.Timestamp - 337, // 440: api.v1.ListWorkloadRuleCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 337, // 441: api.v1.ListWorkloadCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 419, // 442: api.v1.WorkloadOptimizationPolicyProto.created_at:type_name -> google.protobuf.Timestamp - 419, // 443: api.v1.WorkloadOptimizationPolicyProto.updated_at:type_name -> google.protobuf.Timestamp - 415, // 444: api.v1.WorkloadOptimizationPolicyProto.cluster_names:type_name -> api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - 8, // 445: api.v1.WorkloadOptimizationPolicyProto.action_triggers:type_name -> api.v1.ActionTrigger - 9, // 446: api.v1.WorkloadOptimizationPolicyProto.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 8, // 447: api.v1.CreateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 9, // 448: api.v1.CreateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 342, // 449: api.v1.CreateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 342, // 450: api.v1.ListWorkloadOptimizationPoliciesResponse.policies:type_name -> api.v1.WorkloadOptimizationPolicyProto - 342, // 451: api.v1.GetWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 8, // 452: api.v1.UpdateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 9, // 453: api.v1.UpdateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 342, // 454: api.v1.UpdateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 117, // 455: api.v1.GetWorkloadRulesByPolicyResponse.managed_rules:type_name -> api.v1.WorkloadRule - 117, // 456: api.v1.GetWorkloadRulesByPolicyResponse.excluded_rules:type_name -> api.v1.WorkloadRule - 416, // 457: api.v1.GetWorkloadRulesByPolicyResponse.cluster_names:type_name -> api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - 117, // 458: api.v1.ListWorkloadRulesResponse.rules:type_name -> api.v1.WorkloadRule - 417, // 459: api.v1.ListWorkloadRulesResponse.cluster_names:type_name -> api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - 418, // 460: api.v1.ListWorkloadRulesResponse.policy_names:type_name -> api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - 117, // 461: api.v1.GetWorkloadRuleByIDResponse.rule:type_name -> api.v1.WorkloadRule - 117, // 462: api.v1.GetWorkloadRuleByWorkloadResponse.rule:type_name -> api.v1.WorkloadRule - 118, // 463: api.v1.ManualRuleFields.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 118, // 464: api.v1.ManualRuleFields.memory_rule:type_name -> api.v1.ResourceRuleConfig - 118, // 465: api.v1.ManualRuleFields.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 123, // 466: api.v1.ManualRuleFields.hpa_rule:type_name -> api.v1.HPARuleConfig - 124, // 467: api.v1.ManualRuleFields.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 8, // 468: api.v1.ManualRuleFields.action_triggers:type_name -> api.v1.ActionTrigger - 9, // 469: api.v1.ManualRuleFields.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 122, // 470: api.v1.ManualRuleFields.containers:type_name -> api.v1.ContainerResourceRuleConfig - 365, // 471: api.v1.UpsertManualWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 16, // 472: api.v1.UpsertManualWorkloadRuleRequest.source:type_name -> api.v1.WorkloadRuleSource - 117, // 473: api.v1.UpsertManualWorkloadRuleResponse.rule:type_name -> api.v1.WorkloadRule - 365, // 474: api.v1.PreviewWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 117, // 475: api.v1.PreviewWorkloadRuleResponse.materialized_rule:type_name -> api.v1.WorkloadRule - 117, // 476: api.v1.PreviewWorkloadRuleResponse.engine_projection:type_name -> api.v1.WorkloadRule - 434, // 477: api.v1.PreviewWorkloadRuleResponse.profile:type_name -> api.v1.WorkloadProfileResult - 372, // 478: api.v1.BatchAutoOptimizeWorkloadsRequest.workloads:type_name -> api.v1.BatchAutoOptimizeWorkload - 117, // 479: api.v1.BatchAutoOptimizeWorkloadResult.rule:type_name -> api.v1.WorkloadRule - 374, // 480: api.v1.BatchAutoOptimizeWorkloadsResponse.results:type_name -> api.v1.BatchAutoOptimizeWorkloadResult - 435, // 481: api.v1.WorkloadProfileManifest.window:type_name -> api.v1.ProfileWindow - 436, // 482: api.v1.WorkloadProfileManifest.keys:type_name -> api.v1.ProfileKey - 419, // 483: api.v1.WorkloadProfileManifest.issued_at:type_name -> google.protobuf.Timestamp - 435, // 484: api.v1.BatchWorkloadProfiles.window:type_name -> api.v1.ProfileWindow - 437, // 485: api.v1.BatchWorkloadProfiles.profiles:type_name -> api.v1.WorkloadProfileSnapshot - 419, // 486: api.v1.NodeConfigApplyEvent.applied_at:type_name -> google.protobuf.Timestamp - 229, // 487: api.v1.GetNodeRecommendationStatusResponse.current_config:type_name -> api.v1.NodeRecommendationConfig - 378, // 488: api.v1.GetNodeRecommendationStatusResponse.history:type_name -> api.v1.NodeConfigApplyEvent - 385, // 489: api.v1.GetCheckpointApplyStatusResponse.failures:type_name -> api.v1.NodeApplyFailure - 48, // 490: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry.value:type_name -> api.v1.TargetIdList - 95, // 491: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry.value:type_name -> api.v1.WorkloadPercentileSummary - 146, // 492: api.v1.AgentHealth.NodeNameToAgentEntry.value:type_name -> api.v1.AgentHealthMeta - 178, // 493: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry.value:type_name -> api.v1.WorkloadPolicyTargetGroup - 162, // 494: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.WorkloadRecommendationPolicy - 426, // 495: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry.value:type_name -> api.v1.WorkloadItem - 159, // 496: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.NodeGroupRecommendationPolicy - 185, // 497: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroupItem - 219, // 498: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry.value:type_name -> api.v1.NodeGroupCheckpointStatus - 229, // 499: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry.value:type_name -> api.v1.NodeRecommendationConfig - 229, // 500: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry.value:type_name -> api.v1.NodeRecommendationConfig - 21, // 501: api.v1.K8sRecommendationService.GetNodeGroupStats:input_type -> api.v1.GetNodeGroupStatsRequest - 25, // 502: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:input_type -> api.v1.GetLatestNodeGroupRecommendationRequest - 27, // 503: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:input_type -> api.v1.GetLatestWorkloadRecommendationRequest - 29, // 504: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:input_type -> api.v1.GetPreviewWorkloadRecommendationRequest - 31, // 505: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:input_type -> api.v1.GetPreviewWorkloadRecommendationsRequest - 19, // 506: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:input_type -> api.v1.GetRecommendationsForWorkloadRequest - 17, // 507: api.v1.K8sRecommendationService.GetRecommendations:input_type -> api.v1.GetRecommendationsRequest - 49, // 508: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:input_type -> api.v1.CreateNodeGroupRecommendationPolicyRequest - 51, // 509: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:input_type -> api.v1.GetNodeGroupRecommendationPolicyRequest - 53, // 510: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:input_type -> api.v1.ListNodeGroupRecommendationPoliciesRequest - 55, // 511: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:input_type -> api.v1.UpdateNodeGroupRecommendationPolicyRequest - 57, // 512: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:input_type -> api.v1.DeleteNodeGroupRecommendationPolicyRequest - 59, // 513: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:input_type -> api.v1.AttachNodeGroupRecommendationPolicyRequest - 61, // 514: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:input_type -> api.v1.CreateWorkloadRecommendationPolicyRequest - 63, // 515: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:input_type -> api.v1.GetWorkloadRecommendationPolicyRequest - 163, // 516: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:input_type -> api.v1.GetPolicyRecommendedDefaultsRequest - 65, // 517: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:input_type -> api.v1.ListWorkloadRecommendationPoliciesRequest - 67, // 518: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:input_type -> api.v1.UpdateWorkloadRecommendationPolicyRequest - 69, // 519: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:input_type -> api.v1.DeleteWorkloadRecommendationPolicyRequest - 71, // 520: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:input_type -> api.v1.AttachWorkloadRecommendationPolicyRequest - 73, // 521: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:input_type -> api.v1.AttachWorkloadRecommendationPoliciesRequest - 77, // 522: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:input_type -> api.v1.CreateWorkloadPolicyTargetRequest - 79, // 523: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:input_type -> api.v1.GetWorkloadPolicyTargetRequest - 81, // 524: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:input_type -> api.v1.ListWorkloadPolicyTargetsRequest - 83, // 525: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:input_type -> api.v1.UpdateWorkloadPolicyTargetRequest - 85, // 526: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:input_type -> api.v1.DeleteWorkloadPolicyTargetRequest - 86, // 527: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:input_type -> api.v1.ToggleWorkloadPolicyTargetsRequest - 91, // 528: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:input_type -> api.v1.PreviewWorkloadPolicyTargetMatchesRequest - 93, // 529: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:input_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - 46, // 530: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:input_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - 97, // 531: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:input_type -> api.v1.CreateNodeGroupPolicyTargetRequest - 99, // 532: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:input_type -> api.v1.GetNodeGroupPolicyTargetRequest - 101, // 533: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:input_type -> api.v1.ListNodeGroupPolicyTargetsRequest - 103, // 534: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:input_type -> api.v1.UpdateNodeGroupPolicyTargetRequest - 105, // 535: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:input_type -> api.v1.DeleteNodeGroupPolicyTargetRequest - 106, // 536: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:input_type -> api.v1.ToggleNodeGroupPolicyTargetsRequest - 109, // 537: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:input_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - 111, // 538: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:input_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - 113, // 539: api.v1.K8sRecommendationService.BalanceGetRecommendations:input_type -> api.v1.BalanceGetRecommendationsRequest - 23, // 540: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:input_type -> api.v1.GetOptimalInstanceTypeForNodeGroupRequest - 173, // 541: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:input_type -> api.v1.GetAttachedNodeGroupPoliciesRequest - 175, // 542: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:input_type -> api.v1.GetAttachedWorkloadPoliciesRequest - 233, // 543: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:input_type -> api.v1.SearchResourcesByTargetingFiltersRequest - 232, // 544: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:input_type -> api.v1.GetAvailableKindsByTargetingFiltersRequest - 181, // 545: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:input_type -> api.v1.ListAttachedWorkloadPoliciesRequest - 183, // 546: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:input_type -> api.v1.ListAttachedNodeGroupPoliciesRequest - 190, // 547: api.v1.K8sRecommendationService.RecommendationEvents:input_type -> api.v1.RecommendationEventsRequest - 188, // 548: api.v1.K8sRecommendationService.ApplyRecommendation:input_type -> api.v1.ApplyRecommendationRequest - 186, // 549: api.v1.K8sRecommendationService.RecommendationApplied:input_type -> api.v1.RecommendationAppliedRequest - 192, // 550: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:input_type -> api.v1.RetrieveSavingsForWorkloadRequest - 194, // 551: api.v1.K8sRecommendationService.CreateNodePolicies:input_type -> api.v1.CreateNodePoliciesRequest - 215, // 552: api.v1.K8sRecommendationService.ListNodePolicies:input_type -> api.v1.ListNodePoliciesRequest - 217, // 553: api.v1.K8sRecommendationService.UpdateNodePolicy:input_type -> api.v1.UpdateNodePolicyRequest - 224, // 554: api.v1.K8sRecommendationService.DeleteNodePolicy:input_type -> api.v1.DeleteNodePolicyRequest - 196, // 555: api.v1.K8sRecommendationService.SuggestedNodePolicy:input_type -> api.v1.SuggestedNodePolicyRequest - 230, // 556: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:input_type -> api.v1.SuggestedKarpenterConfigRequest - 198, // 557: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:input_type -> api.v1.GenerateNodePoliciesFromKarpenterRequest - 200, // 558: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:input_type -> api.v1.GenerateNodePoliciesFromNodeGroupsRequest - 220, // 559: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:input_type -> api.v1.GetNodeGroupsCheckpointStatusRequest - 222, // 560: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:input_type -> api.v1.SetNodePolicyCheckpointLabelRequest - 381, // 561: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:input_type -> api.v1.EnableCheckpointForPolicyRequest - 383, // 562: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:input_type -> api.v1.GetCheckpointApplyStatusRequest - 203, // 563: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:input_type -> api.v1.GetNodeAnnotationReadinessRequest - 205, // 564: api.v1.K8sRecommendationService.GetMigrationState:input_type -> api.v1.GetMigrationStateRequest - 207, // 565: api.v1.K8sRecommendationService.UpdateMigrationState:input_type -> api.v1.UpdateMigrationStateRequest - 209, // 566: api.v1.K8sRecommendationService.ReportNodePoolValidation:input_type -> api.v1.ReportNodePoolValidationRequest - 211, // 567: api.v1.K8sRecommendationService.GetNodePoolValidations:input_type -> api.v1.GetNodePoolValidationsRequest - 241, // 568: api.v1.K8sRecommendationService.CreateNodePolicyTargets:input_type -> api.v1.CreateNodePolicyTargetsRequest - 243, // 569: api.v1.K8sRecommendationService.ListNodePolicyTargets:input_type -> api.v1.ListNodePolicyTargetsRequest - 245, // 570: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:input_type -> api.v1.UpdateNodePolicyTargetRequest - 227, // 571: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:input_type -> api.v1.PreviewNodeRecommendationConfigRequest - 256, // 572: api.v1.K8sRecommendationService.GetInstanceFamilies:input_type -> api.v1.GetInstanceFamiliesRequest - 258, // 573: api.v1.K8sRecommendationService.GetInstanceSizes:input_type -> api.v1.GetInstanceSizesRequest - 265, // 574: api.v1.K8sRecommendationService.GetInstanceCategories:input_type -> api.v1.GetInstanceCategoriesRequest - 267, // 575: api.v1.K8sRecommendationService.GetInstanceCPUs:input_type -> api.v1.GetInstanceCPUsRequest - 269, // 576: api.v1.K8sRecommendationService.GetInstanceTypeNames:input_type -> api.v1.GetInstanceTypeNamesRequest - 134, // 577: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:input_type -> api.v1.GeneratePodDisruptionBudgetRequest - 136, // 578: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:input_type -> api.v1.GenerateAndCreatePodDisruptionBudgetRequest - 138, // 579: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:input_type -> api.v1.CreatePodDisruptionBudgetRequest - 140, // 580: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:input_type -> api.v1.GetPDBRecommendationForWorkloadRequest - 304, // 581: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:input_type -> api.v1.CreateStorageRecommendationPolicyRequest - 306, // 582: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:input_type -> api.v1.GetStorageRecommendationPolicyRequest - 308, // 583: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:input_type -> api.v1.ListStorageRecommendationPoliciesRequest - 310, // 584: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:input_type -> api.v1.UpdateStorageRecommendationPolicyRequest - 312, // 585: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:input_type -> api.v1.DeleteStorageRecommendationPolicyRequest - 315, // 586: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:input_type -> api.v1.CreateStoragePolicyTargetRequest - 317, // 587: api.v1.K8sRecommendationService.ListStoragePolicyTargets:input_type -> api.v1.ListStoragePolicyTargetsRequest - 319, // 588: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:input_type -> api.v1.UpdateStoragePolicyTargetRequest - 321, // 589: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:input_type -> api.v1.DeleteStoragePolicyTargetRequest - 324, // 590: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:input_type -> api.v1.GetPvcStorageRecommendationRequest - 326, // 591: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:input_type -> api.v1.ListPvcStorageRecommendationsRequest - 328, // 592: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:input_type -> api.v1.GeneratePvcStorageRecommendationRequest - 330, // 593: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:input_type -> api.v1.PreviewPvcStorageRecommendationRequest - 333, // 594: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:input_type -> api.v1.ListWorkloadRuleOOMEventsRequest - 335, // 595: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:input_type -> api.v1.ListWorkloadOOMEventsRequest - 338, // 596: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:input_type -> api.v1.ListWorkloadRuleCPUThrottleEventsRequest - 340, // 597: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:input_type -> api.v1.ListWorkloadCPUThrottleEventsRequest - 89, // 598: api.v1.K8sRecommendationService.RemoveClusterOptimizations:input_type -> api.v1.RemoveClusterOptimizationsRequest - 343, // 599: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:input_type -> api.v1.CreateWorkloadOptimizationPolicyRequest - 345, // 600: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:input_type -> api.v1.ListWorkloadOptimizationPoliciesRequest - 347, // 601: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:input_type -> api.v1.GetWorkloadOptimizationPolicyRequest - 349, // 602: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:input_type -> api.v1.UpdateWorkloadOptimizationPolicyRequest - 351, // 603: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:input_type -> api.v1.DeleteWorkloadOptimizationPolicyRequest - 366, // 604: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:input_type -> api.v1.UpsertManualWorkloadRuleRequest - 368, // 605: api.v1.K8sRecommendationService.PreviewWorkloadRule:input_type -> api.v1.PreviewWorkloadRuleRequest - 353, // 606: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:input_type -> api.v1.GetWorkloadRulesByPolicyRequest - 355, // 607: api.v1.K8sRecommendationService.ListWorkloadRules:input_type -> api.v1.ListWorkloadRulesRequest - 357, // 608: api.v1.K8sRecommendationService.GetWorkloadRuleByID:input_type -> api.v1.GetWorkloadRuleByIDRequest - 359, // 609: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:input_type -> api.v1.GetWorkloadRuleByWorkloadRequest - 361, // 610: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:input_type -> api.v1.GetWorkloadByWorkloadRuleRequest - 363, // 611: api.v1.K8sRecommendationService.DeleteWorkloadRule:input_type -> api.v1.DeleteWorkloadRuleRequest - 370, // 612: api.v1.K8sRecommendationService.GetWorkloadContainerNames:input_type -> api.v1.GetWorkloadContainerNamesRequest - 373, // 613: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:input_type -> api.v1.BatchAutoOptimizeWorkloadsRequest - 379, // 614: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:input_type -> api.v1.GetNodeRecommendationStatusRequest - 22, // 615: api.v1.K8sRecommendationService.GetNodeGroupStats:output_type -> api.v1.GetNodeGroupStatsResponse - 26, // 616: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:output_type -> api.v1.GetLatestNodeGroupRecommendationResponse - 28, // 617: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:output_type -> api.v1.GetLatestWorkloadRecommendationResponse - 30, // 618: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:output_type -> api.v1.GetPreviewWorkloadRecommendationResponse - 33, // 619: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:output_type -> api.v1.GetPreviewWorkloadRecommendationsResponse - 20, // 620: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:output_type -> api.v1.GetRecommendationsForWorkloadResponse - 18, // 621: api.v1.K8sRecommendationService.GetRecommendations:output_type -> api.v1.GetRecommendationsResponse - 50, // 622: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:output_type -> api.v1.CreateNodeGroupRecommendationPolicyResponse - 52, // 623: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:output_type -> api.v1.GetNodeGroupRecommendationPolicyResponse - 54, // 624: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:output_type -> api.v1.ListNodeGroupRecommendationPoliciesResponse - 56, // 625: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:output_type -> api.v1.UpdateNodeGroupRecommendationPolicyResponse - 58, // 626: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:output_type -> api.v1.DeleteNodeGroupRecommendationPolicyResponse - 60, // 627: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:output_type -> api.v1.AttachNodeGroupRecommendationPolicyResponse - 62, // 628: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:output_type -> api.v1.CreateWorkloadRecommendationPolicyResponse - 64, // 629: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:output_type -> api.v1.GetWorkloadRecommendationPolicyResponse - 164, // 630: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:output_type -> api.v1.GetPolicyRecommendedDefaultsResponse - 66, // 631: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:output_type -> api.v1.ListWorkloadRecommendationPoliciesResponse - 68, // 632: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:output_type -> api.v1.UpdateWorkloadRecommendationPolicyResponse - 70, // 633: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:output_type -> api.v1.DeleteWorkloadRecommendationPolicyResponse - 72, // 634: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:output_type -> api.v1.AttachWorkloadRecommendationPolicyResponse - 74, // 635: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:output_type -> api.v1.AttachWorkloadRecommendationPoliciesResponse - 78, // 636: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:output_type -> api.v1.CreateWorkloadPolicyTargetResponse - 80, // 637: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:output_type -> api.v1.GetWorkloadPolicyTargetResponse - 82, // 638: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:output_type -> api.v1.ListWorkloadPolicyTargetsResponse - 84, // 639: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:output_type -> api.v1.UpdateWorkloadPolicyTargetResponse - 88, // 640: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:output_type -> api.v1.DeleteWorkloadPolicyTargetResponse - 87, // 641: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:output_type -> api.v1.ToggleWorkloadPolicyTargetsResponse - 92, // 642: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:output_type -> api.v1.PreviewWorkloadPolicyTargetMatchesResponse - 94, // 643: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:output_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - 47, // 644: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:output_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - 98, // 645: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:output_type -> api.v1.CreateNodeGroupPolicyTargetResponse - 100, // 646: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:output_type -> api.v1.GetNodeGroupPolicyTargetResponse - 102, // 647: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:output_type -> api.v1.ListNodeGroupPolicyTargetsResponse - 104, // 648: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:output_type -> api.v1.UpdateNodeGroupPolicyTargetResponse - 108, // 649: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:output_type -> api.v1.DeleteNodeGroupPolicyTargetResponse - 107, // 650: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:output_type -> api.v1.ToggleNodeGroupPolicyTargetsResponse - 110, // 651: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:output_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - 112, // 652: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:output_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - 114, // 653: api.v1.K8sRecommendationService.BalanceGetRecommendations:output_type -> api.v1.BalanceGetRecommendationsResponse - 24, // 654: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:output_type -> api.v1.GetOptimalInstanceTypeForNodeGroupResponse - 174, // 655: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:output_type -> api.v1.GetAttachedNodeGroupPoliciesResponse - 176, // 656: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:output_type -> api.v1.GetAttachedWorkloadPoliciesResponse - 236, // 657: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:output_type -> api.v1.SearchResourcesByTargetingFiltersResponse - 235, // 658: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:output_type -> api.v1.GetAvailableKindsByTargetingFiltersResponse - 182, // 659: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:output_type -> api.v1.ListAttachedWorkloadPoliciesResponse - 184, // 660: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:output_type -> api.v1.ListAttachedNodeGroupPoliciesResponse - 191, // 661: api.v1.K8sRecommendationService.RecommendationEvents:output_type -> api.v1.RecommendationEventsResponse - 189, // 662: api.v1.K8sRecommendationService.ApplyRecommendation:output_type -> api.v1.ApplyRecommendationResponse - 187, // 663: api.v1.K8sRecommendationService.RecommendationApplied:output_type -> api.v1.RecommendationAppliedResponse - 193, // 664: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:output_type -> api.v1.RetrieveSavingsForWorkloadResponse - 195, // 665: api.v1.K8sRecommendationService.CreateNodePolicies:output_type -> api.v1.CreateNodePoliciesResponse - 216, // 666: api.v1.K8sRecommendationService.ListNodePolicies:output_type -> api.v1.ListNodePoliciesResponse - 218, // 667: api.v1.K8sRecommendationService.UpdateNodePolicy:output_type -> api.v1.UpdateNodePolicyResponse - 225, // 668: api.v1.K8sRecommendationService.DeleteNodePolicy:output_type -> api.v1.DeleteNodePolicyResponse - 197, // 669: api.v1.K8sRecommendationService.SuggestedNodePolicy:output_type -> api.v1.SuggestedNodePolicyResponse - 231, // 670: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:output_type -> api.v1.SuggestedKarpenterConfigResponse - 199, // 671: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:output_type -> api.v1.GenerateNodePoliciesFromKarpenterResponse - 201, // 672: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:output_type -> api.v1.GenerateNodePoliciesFromNodeGroupsResponse - 221, // 673: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:output_type -> api.v1.GetNodeGroupsCheckpointStatusResponse - 223, // 674: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:output_type -> api.v1.SetNodePolicyCheckpointLabelResponse - 382, // 675: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:output_type -> api.v1.EnableCheckpointForPolicyResponse - 384, // 676: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:output_type -> api.v1.GetCheckpointApplyStatusResponse - 204, // 677: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:output_type -> api.v1.GetNodeAnnotationReadinessResponse - 206, // 678: api.v1.K8sRecommendationService.GetMigrationState:output_type -> api.v1.GetMigrationStateResponse - 208, // 679: api.v1.K8sRecommendationService.UpdateMigrationState:output_type -> api.v1.UpdateMigrationStateResponse - 210, // 680: api.v1.K8sRecommendationService.ReportNodePoolValidation:output_type -> api.v1.ReportNodePoolValidationResponse - 213, // 681: api.v1.K8sRecommendationService.GetNodePoolValidations:output_type -> api.v1.GetNodePoolValidationsResponse - 242, // 682: api.v1.K8sRecommendationService.CreateNodePolicyTargets:output_type -> api.v1.CreateNodePolicyTargetsResponse - 244, // 683: api.v1.K8sRecommendationService.ListNodePolicyTargets:output_type -> api.v1.ListNodePolicyTargetsResponse - 246, // 684: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:output_type -> api.v1.UpdateNodePolicyTargetResponse - 228, // 685: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:output_type -> api.v1.PreviewNodeRecommendationConfigResponse - 257, // 686: api.v1.K8sRecommendationService.GetInstanceFamilies:output_type -> api.v1.GetInstanceFamiliesResponse - 259, // 687: api.v1.K8sRecommendationService.GetInstanceSizes:output_type -> api.v1.GetInstanceSizesResponse - 266, // 688: api.v1.K8sRecommendationService.GetInstanceCategories:output_type -> api.v1.GetInstanceCategoriesResponse - 268, // 689: api.v1.K8sRecommendationService.GetInstanceCPUs:output_type -> api.v1.GetInstanceCPUsResponse - 270, // 690: api.v1.K8sRecommendationService.GetInstanceTypeNames:output_type -> api.v1.GetInstanceTypeNamesResponse - 135, // 691: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:output_type -> api.v1.GeneratePodDisruptionBudgetResponse - 137, // 692: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:output_type -> api.v1.GenerateAndCreatePodDisruptionBudgetResponse - 139, // 693: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:output_type -> api.v1.CreatePodDisruptionBudgetResponse - 141, // 694: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:output_type -> api.v1.GetPDBRecommendationForWorkloadResponse - 305, // 695: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:output_type -> api.v1.CreateStorageRecommendationPolicyResponse - 307, // 696: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:output_type -> api.v1.GetStorageRecommendationPolicyResponse - 309, // 697: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:output_type -> api.v1.ListStorageRecommendationPoliciesResponse - 311, // 698: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:output_type -> api.v1.UpdateStorageRecommendationPolicyResponse - 313, // 699: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:output_type -> api.v1.DeleteStorageRecommendationPolicyResponse - 316, // 700: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:output_type -> api.v1.CreateStoragePolicyTargetResponse - 318, // 701: api.v1.K8sRecommendationService.ListStoragePolicyTargets:output_type -> api.v1.ListStoragePolicyTargetsResponse - 320, // 702: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:output_type -> api.v1.UpdateStoragePolicyTargetResponse - 322, // 703: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:output_type -> api.v1.DeleteStoragePolicyTargetResponse - 325, // 704: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:output_type -> api.v1.GetPvcStorageRecommendationResponse - 327, // 705: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:output_type -> api.v1.ListPvcStorageRecommendationsResponse - 329, // 706: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:output_type -> api.v1.GeneratePvcStorageRecommendationResponse - 331, // 707: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:output_type -> api.v1.PreviewPvcStorageRecommendationResponse - 334, // 708: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:output_type -> api.v1.ListWorkloadRuleOOMEventsResponse - 336, // 709: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:output_type -> api.v1.ListWorkloadOOMEventsResponse - 339, // 710: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:output_type -> api.v1.ListWorkloadRuleCPUThrottleEventsResponse - 341, // 711: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:output_type -> api.v1.ListWorkloadCPUThrottleEventsResponse - 90, // 712: api.v1.K8sRecommendationService.RemoveClusterOptimizations:output_type -> api.v1.RemoveClusterOptimizationsResponse - 344, // 713: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:output_type -> api.v1.CreateWorkloadOptimizationPolicyResponse - 346, // 714: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:output_type -> api.v1.ListWorkloadOptimizationPoliciesResponse - 348, // 715: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:output_type -> api.v1.GetWorkloadOptimizationPolicyResponse - 350, // 716: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:output_type -> api.v1.UpdateWorkloadOptimizationPolicyResponse - 352, // 717: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:output_type -> api.v1.DeleteWorkloadOptimizationPolicyResponse - 367, // 718: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:output_type -> api.v1.UpsertManualWorkloadRuleResponse - 369, // 719: api.v1.K8sRecommendationService.PreviewWorkloadRule:output_type -> api.v1.PreviewWorkloadRuleResponse - 354, // 720: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:output_type -> api.v1.GetWorkloadRulesByPolicyResponse - 356, // 721: api.v1.K8sRecommendationService.ListWorkloadRules:output_type -> api.v1.ListWorkloadRulesResponse - 358, // 722: api.v1.K8sRecommendationService.GetWorkloadRuleByID:output_type -> api.v1.GetWorkloadRuleByIDResponse - 360, // 723: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:output_type -> api.v1.GetWorkloadRuleByWorkloadResponse - 362, // 724: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:output_type -> api.v1.GetWorkloadByWorkloadRuleResponse - 364, // 725: api.v1.K8sRecommendationService.DeleteWorkloadRule:output_type -> api.v1.DeleteWorkloadRuleResponse - 371, // 726: api.v1.K8sRecommendationService.GetWorkloadContainerNames:output_type -> api.v1.GetWorkloadContainerNamesResponse - 375, // 727: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:output_type -> api.v1.BatchAutoOptimizeWorkloadsResponse - 380, // 728: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:output_type -> api.v1.GetNodeRecommendationStatusResponse - 615, // [615:729] is the sub-list for method output_type - 501, // [501:615] is the sub-list for method input_type - 501, // [501:501] is the sub-list for extension type_name - 501, // [501:501] is the sub-list for extension extendee - 0, // [0:501] is the sub-list for field type_name + 637, // 0: api.v1.GetRecommendationsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 1: api.v1.GetRecommendationsRequest.end_time:type_name -> google.protobuf.Timestamp + 638, // 2: api.v1.GetRecommendationsRequest.filters:type_name -> api.v1.WorkloadFilters + 639, // 3: api.v1.GetRecommendationsRequest.pagination:type_name -> api.v1.Pagination + 206, // 4: api.v1.GetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 639, // 5: api.v1.GetRecommendationsResponse.pagination:type_name -> api.v1.Pagination + 637, // 6: api.v1.GetRecommendationsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 7: api.v1.GetRecommendationsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 206, // 8: api.v1.GetRecommendationsForWorkloadResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 637, // 9: api.v1.GetNodeGroupStatsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 10: api.v1.GetNodeGroupStatsRequest.end_time:type_name -> google.protobuf.Timestamp + 178, // 11: api.v1.GetNodeGroupStatsResponse.node_stats:type_name -> api.v1.NodeStats + 637, // 12: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 13: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp + 22, // 14: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.mode:type_name -> api.v1.RecommendationMode + 640, // 15: api.v1.GetLatestWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 640, // 16: api.v1.GetLatestWorkloadRecommendationResponse.kind:type_name -> api.v1.K8sObjectKind + 184, // 17: api.v1.GetLatestWorkloadRecommendationResponse.container_recommendations:type_name -> api.v1.ContainerRecommendation + 191, // 18: api.v1.GetLatestWorkloadRecommendationResponse.current_tolerations:type_name -> api.v1.Toleration + 191, // 19: api.v1.GetLatestWorkloadRecommendationResponse.recommended_tolerations:type_name -> api.v1.Toleration + 640, // 20: api.v1.GetPreviewWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 637, // 21: api.v1.GetPreviewWorkloadRecommendationRequest.timestamp:type_name -> google.protobuf.Timestamp + 206, // 22: api.v1.GetPreviewWorkloadRecommendationResponse.rec:type_name -> api.v1.WorkloadRecommendation + 50, // 23: api.v1.GetPreviewWorkloadRecommendationsRequest.workloads:type_name -> api.v1.WorkloadIdentifier + 637, // 24: api.v1.GetPreviewWorkloadRecommendationsRequest.timestamp:type_name -> google.protobuf.Timestamp + 640, // 25: api.v1.WorkloadIdentifier.kind:type_name -> api.v1.K8sObjectKind + 48, // 26: api.v1.GetPreviewWorkloadRecommendationsResponse.recommendations:type_name -> api.v1.GetPreviewWorkloadRecommendationResponse + 22, // 27: api.v1.CreateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 28: api.v1.CreateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 192, // 29: api.v1.CreateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 192, // 30: api.v1.GetClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 192, // 31: api.v1.ListClusterRecommendationPoliciesResponse.policies:type_name -> api.v1.ClusterRecommendationPolicy + 22, // 32: api.v1.UpdateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 33: api.v1.UpdateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 192, // 34: api.v1.UpdateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy + 637, // 35: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 36: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.end_time:type_name -> google.protobuf.Timestamp + 50, // 37: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workloads:type_name -> api.v1.WorkloadIdentifier + 596, // 38: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workload_target_map:type_name -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry + 20, // 39: api.v1.CreateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 40: api.v1.CreateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 41: api.v1.CreateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 42: api.v1.CreateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 193, // 43: api.v1.CreateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 193, // 44: api.v1.GetNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 193, // 45: api.v1.ListNodeGroupRecommendationPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy + 20, // 46: api.v1.UpdateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 47: api.v1.UpdateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 48: api.v1.UpdateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 49: api.v1.UpdateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 193, // 50: api.v1.UpdateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 196, // 51: api.v1.CreateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 52: api.v1.CreateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 53: api.v1.GetWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 54: api.v1.ListWorkloadRecommendationPoliciesResponse.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 55: api.v1.UpdateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 196, // 56: api.v1.UpdateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 640, // 57: api.v1.AttachWorkloadRecommendationPolicyRequest.kind:type_name -> api.v1.K8sObjectKind + 50, // 58: api.v1.AttachWorkloadRecommendationPoliciesRequest.workloads:type_name -> api.v1.WorkloadIdentifier + 93, // 59: api.v1.AttachWorkloadRecommendationPoliciesResponse.attachments:type_name -> api.v1.WorkloadPolicyAttachment + 640, // 60: api.v1.WorkloadPolicyAttachment.kind:type_name -> api.v1.K8sObjectKind + 637, // 61: api.v1.WorkloadPolicyAttachment.created_at:type_name -> google.protobuf.Timestamp + 637, // 62: api.v1.WorkloadPolicyAttachment.updated_at:type_name -> google.protobuf.Timestamp + 641, // 63: api.v1.WorkloadPolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 64: api.v1.WorkloadPolicyTarget.workload_selector:type_name -> api.v1.LabelSelector + 640, // 65: api.v1.WorkloadPolicyTarget.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 66: api.v1.WorkloadPolicyTarget.name_pattern:type_name -> api.v1.RegexPattern + 641, // 67: api.v1.WorkloadPolicyTarget.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 68: api.v1.WorkloadPolicyTarget.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 69: api.v1.WorkloadPolicyTarget.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 637, // 70: api.v1.WorkloadPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 71: api.v1.WorkloadPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 641, // 72: api.v1.CreateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 73: api.v1.CreateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 74: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 75: api.v1.CreateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 76: api.v1.CreateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 77: api.v1.CreateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 78: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 94, // 79: api.v1.CreateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 94, // 80: api.v1.GetWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 94, // 81: api.v1.ListWorkloadPolicyTargetsResponse.targets:type_name -> api.v1.WorkloadPolicyTarget + 641, // 82: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 83: api.v1.UpdateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 84: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 85: api.v1.UpdateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 86: api.v1.UpdateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 87: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 88: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 94, // 89: api.v1.UpdateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget + 641, // 90: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 92: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 93: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 94: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 95: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 96: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 643, // 97: api.v1.PreviewWorkloadPolicyTargetMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadItem + 641, // 98: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_selector:type_name -> api.v1.LabelSelector + 641, // 99: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.workload_selector:type_name -> api.v1.LabelSelector + 640, // 100: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 101: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.name_pattern:type_name -> api.v1.RegexPattern + 641, // 102: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 103: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 104: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter_not_in:type_name -> api.v1.K8sObjectKind + 206, // 105: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation + 643, // 106: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_items:type_name -> api.v1.WorkloadItem + 597, // 107: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_percentiles:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry + 598, // 108: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.collisions_by_workload_uid:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry + 644, // 109: api.v1.WorkloadPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles + 644, // 110: api.v1.WorkloadPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles + 644, // 111: api.v1.WorkloadPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles + 644, // 112: api.v1.WorkloadPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles + 644, // 113: api.v1.WorkloadPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles + 637, // 114: api.v1.NodeGroupPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 115: api.v1.NodeGroupPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 115, // 116: api.v1.CreateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 117: api.v1.GetNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 118: api.v1.ListNodeGroupPolicyTargetsResponse.targets:type_name -> api.v1.NodeGroupPolicyTarget + 115, // 119: api.v1.UpdateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget + 645, // 120: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse.matched_node_groups:type_name -> api.v1.NodeGroup + 204, // 121: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.NodeGroupRecommendation + 199, // 122: api.v1.BalanceGetRecommendationsRequest.register:type_name -> api.v1.BalanceRegisterRequest + 201, // 123: api.v1.BalanceGetRecommendationsRequest.apply:type_name -> api.v1.BalanceApplyRecommendationResponse + 172, // 124: api.v1.BalanceGetRecommendationsRequest.workload_meta:type_name -> api.v1.ReconcileWorkload + 206, // 125: api.v1.BalanceGetRecommendationsRequest.in_cluster_recommendation:type_name -> api.v1.WorkloadRecommendation + 368, // 126: api.v1.BalanceGetRecommendationsRequest.snapshot_cr_status_report:type_name -> api.v1.SnapshotCRStatusReport + 463, // 127: api.v1.BalanceGetRecommendationsRequest.scheduler_enrollment_report:type_name -> api.v1.SchedulerEnrollmentReport + 464, // 128: api.v1.BalanceGetRecommendationsRequest.scheduler_revert_event_report:type_name -> api.v1.SchedulerRevertEventReport + 174, // 129: api.v1.BalanceGetRecommendationsRequest.operator_health:type_name -> api.v1.OperatorHealth + 175, // 130: api.v1.BalanceGetRecommendationsRequest.agent_health:type_name -> api.v1.AgentHealth + 204, // 131: api.v1.BalanceGetRecommendationsResponse.node_group_recommendation:type_name -> api.v1.NodeGroupRecommendation + 206, // 132: api.v1.BalanceGetRecommendationsResponse.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 373, // 133: api.v1.BalanceGetRecommendationsResponse.node_recommendation:type_name -> api.v1.NodeRecommendation + 134, // 134: api.v1.BalanceGetRecommendationsResponse.batch_node_group_recommendations:type_name -> api.v1.BatchNodeGroupRecommendations + 135, // 135: api.v1.BalanceGetRecommendationsResponse.batch_workload_recommendations:type_name -> api.v1.BatchWorkloadRecommendations + 156, // 136: api.v1.BalanceGetRecommendationsResponse.kind_to_namespace_to_workloads:type_name -> api.v1.WorkloadWithActiveRecommendations + 173, // 137: api.v1.BalanceGetRecommendationsResponse.workload_reconcile_response:type_name -> api.v1.ReconcileResponse + 507, // 138: api.v1.BalanceGetRecommendationsResponse.workload_profile_manifest:type_name -> api.v1.WorkloadProfileManifest + 508, // 139: api.v1.BalanceGetRecommendationsResponse.batch_workload_profiles:type_name -> api.v1.BatchWorkloadProfiles + 177, // 140: api.v1.BalanceGetRecommendationsResponse.health_update_requested:type_name -> api.v1.HealthReport + 158, // 141: api.v1.BalanceGetRecommendationsResponse.batch_generic_resource_recommendations:type_name -> api.v1.BatchGenericResourceRecommendations + 159, // 142: api.v1.BalanceGetRecommendationsResponse.batch_pvc_storage_recommendations:type_name -> api.v1.BatchPvcStorageRecommendations + 154, // 143: api.v1.BalanceGetRecommendationsResponse.batch_workload_rules:type_name -> api.v1.BatchWorkloadRules + 364, // 144: api.v1.BalanceGetRecommendationsResponse.karpenter_settings:type_name -> api.v1.KarpenterSettingsRecommendation + 366, // 145: api.v1.BalanceGetRecommendationsResponse.snapshot_recommendation:type_name -> api.v1.SnapshotRecommendation + 367, // 146: api.v1.BalanceGetRecommendationsResponse.forensic_snapshot_recommendation:type_name -> api.v1.ForensicSnapshotRecommendation + 155, // 147: api.v1.BalanceGetRecommendationsResponse.batch_hpa_connectors:type_name -> api.v1.BatchHPAConnectors + 460, // 148: api.v1.BalanceGetRecommendationsResponse.scheduler_policy_sync:type_name -> api.v1.SchedulerPolicySync + 204, // 149: api.v1.BatchNodeGroupRecommendations.recommendations:type_name -> api.v1.NodeGroupRecommendation + 206, // 150: api.v1.BatchWorkloadRecommendations.recommendations:type_name -> api.v1.WorkloadRecommendation + 137, // 151: api.v1.WorkloadRule.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 152: api.v1.WorkloadRule.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 153: api.v1.WorkloadRule.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 154: api.v1.WorkloadRule.hpa_rule:type_name -> api.v1.HPARuleConfig + 18, // 155: api.v1.WorkloadRule.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 156: api.v1.WorkloadRule.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 144, // 157: api.v1.WorkloadRule.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 151, // 158: api.v1.WorkloadRule.percentiles:type_name -> api.v1.ResourcePercentiles + 153, // 159: api.v1.WorkloadRule.classification:type_name -> api.v1.WorkloadClassification + 637, // 160: api.v1.WorkloadRule.created_at:type_name -> google.protobuf.Timestamp + 637, // 161: api.v1.WorkloadRule.updated_at:type_name -> google.protobuf.Timestamp + 141, // 162: api.v1.WorkloadRule.containers:type_name -> api.v1.ContainerResourceRuleConfig + 142, // 163: api.v1.WorkloadRule.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 145, // 164: api.v1.WorkloadRule.keda_scaled_object:type_name -> api.v1.KEDAScaledObjectTemplate + 599, // 165: api.v1.HPAMetricTrigger.metadata:type_name -> api.v1.HPAMetricTrigger.MetadataEntry + 140, // 166: api.v1.ContainerResourceRuleConfig.cpu_rule:type_name -> api.v1.ContainerResourceConfig + 140, // 167: api.v1.ContainerResourceRuleConfig.memory_rule:type_name -> api.v1.ContainerResourceConfig + 140, // 168: api.v1.ContainerResourceRuleConfig.gpu_rule:type_name -> api.v1.ContainerResourceConfig + 138, // 169: api.v1.HPARuleConfig.metrics:type_name -> api.v1.HPAMetricTrigger + 646, // 170: api.v1.HPARuleConfig.behavior:type_name -> api.v1.HPABehavior + 139, // 171: api.v1.HPARuleConfig.fallback:type_name -> api.v1.HPAFallback + 146, // 172: api.v1.KEDAScaledObjectTemplate.triggers:type_name -> api.v1.KEDATrigger + 148, // 173: api.v1.KEDAScaledObjectTemplate.fallback:type_name -> api.v1.KEDAFallback + 149, // 174: api.v1.KEDAScaledObjectTemplate.advanced:type_name -> api.v1.KEDAAdvanced + 600, // 175: api.v1.KEDATrigger.metadata:type_name -> api.v1.KEDATrigger.MetadataEntry + 147, // 176: api.v1.KEDATrigger.authentication_ref:type_name -> api.v1.KEDAAuthenticationRef + 150, // 177: api.v1.ResourcePercentiles.cpu:type_name -> api.v1.PercentileValues + 150, // 178: api.v1.ResourcePercentiles.memory:type_name -> api.v1.PercentileValues + 150, // 179: api.v1.ResourcePercentiles.network:type_name -> api.v1.PercentileValues + 150, // 180: api.v1.ResourcePercentiles.disk:type_name -> api.v1.PercentileValues + 152, // 181: api.v1.WorkloadClassification.burstiness:type_name -> api.v1.BurstinessRatios + 136, // 182: api.v1.BatchWorkloadRules.rules:type_name -> api.v1.WorkloadRule + 647, // 183: api.v1.BatchHPAConnectors.connectors:type_name -> api.v1.HPAConnector + 50, // 184: api.v1.WorkloadWithActiveRecommendations.workloads:type_name -> api.v1.WorkloadIdentifier + 637, // 185: api.v1.GenericResourceRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 9, // 186: api.v1.GenericResourceRecommendation.status:type_name -> api.v1.RecommendationStatus + 637, // 187: api.v1.GenericResourceRecommendation.created_at:type_name -> google.protobuf.Timestamp + 637, // 188: api.v1.GenericResourceRecommendation.updated_at:type_name -> google.protobuf.Timestamp + 157, // 189: api.v1.BatchGenericResourceRecommendations.recommendations:type_name -> api.v1.GenericResourceRecommendation + 403, // 190: api.v1.BatchPvcStorageRecommendations.recommendations:type_name -> api.v1.PvcStorageRecommendation + 50, // 191: api.v1.GeneratePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 192: api.v1.GeneratePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 50, // 193: api.v1.GenerateAndCreatePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 194: api.v1.GenerateAndCreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 157, // 195: api.v1.CreatePodDisruptionBudgetRequest.recommendation:type_name -> api.v1.GenericResourceRecommendation + 157, // 196: api.v1.CreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 50, // 197: api.v1.GetPDBRecommendationForWorkloadRequest.workload:type_name -> api.v1.WorkloadIdentifier + 157, // 198: api.v1.GetPDBRecommendationForWorkloadResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation + 637, // 199: api.v1.StructuralHealthFinding.first_seen_at:type_name -> google.protobuf.Timestamp + 168, // 200: api.v1.WorkloadStructuralHealth.findings:type_name -> api.v1.StructuralHealthFinding + 169, // 201: api.v1.ListWorkloadStructuralHealthResponse.workloads:type_name -> api.v1.WorkloadStructuralHealth + 640, // 202: api.v1.ReconcileWorkload.kind:type_name -> api.v1.K8sObjectKind + 0, // 203: api.v1.ReconcileResponse.status:type_name -> api.v1.ReconcileStatus + 206, // 204: api.v1.ReconcileResponse.updated_recommendation:type_name -> api.v1.WorkloadRecommendation + 601, // 205: api.v1.AgentHealth.node_name_to_agent:type_name -> api.v1.AgentHealth.NodeNameToAgentEntry + 179, // 206: api.v1.NodeStats.metrics:type_name -> api.v1.NodeMetric + 637, // 207: api.v1.NodeMetric.timestamp:type_name -> google.protobuf.Timestamp + 640, // 208: api.v1.ContainerStats.kind:type_name -> api.v1.K8sObjectKind + 181, // 209: api.v1.ContainerStats.metrics:type_name -> api.v1.ContainerMetric + 182, // 210: api.v1.ContainerStats.summarized_metrics:type_name -> api.v1.ContainerSummarizedMetric + 637, // 211: api.v1.ContainerMetric.timestamp:type_name -> google.protobuf.Timestamp + 637, // 212: api.v1.ContainerSummarizedMetric.timestamp:type_name -> google.protobuf.Timestamp + 183, // 213: api.v1.ContainerSummarizedMetric.cpu:type_name -> api.v1.Metric + 183, // 214: api.v1.ContainerSummarizedMetric.memory:type_name -> api.v1.Metric + 183, // 215: api.v1.ContainerSummarizedMetric.gpu:type_name -> api.v1.Metric + 183, // 216: api.v1.ContainerSummarizedMetric.gpu_vram:type_name -> api.v1.Metric + 186, // 217: api.v1.ContainerRecommendation.current_request:type_name -> api.v1.ResourceRecommendation + 186, // 218: api.v1.ContainerRecommendation.recommended_request:type_name -> api.v1.ResourceRecommendation + 186, // 219: api.v1.ContainerRecommendation.current_limit:type_name -> api.v1.ResourceRecommendation + 186, // 220: api.v1.ContainerRecommendation.recommended_limit:type_name -> api.v1.ResourceRecommendation + 187, // 221: api.v1.ContainerRecommendation.env_mutations:type_name -> api.v1.EnvVarMutation + 188, // 222: api.v1.ContainerRecommendation.command_arg_mutations:type_name -> api.v1.CommandArgMutation + 1, // 223: api.v1.ResourceRecommendation.cpu_action:type_name -> api.v1.ActionToTake + 1, // 224: api.v1.ResourceRecommendation.mem_action:type_name -> api.v1.ActionToTake + 1, // 225: api.v1.ResourceRecommendation.gpu_action:type_name -> api.v1.ActionToTake + 1, // 226: api.v1.ResourceRecommendation.gpu_vram_action:type_name -> api.v1.ActionToTake + 2, // 227: api.v1.EnvVarMutation.action:type_name -> api.v1.MutationAction + 2, // 228: api.v1.CommandArgMutation.action:type_name -> api.v1.MutationAction + 3, // 229: api.v1.CommandArgMutation.target:type_name -> api.v1.ArgTarget + 2, // 230: api.v1.NodeSelectorMutation.action:type_name -> api.v1.MutationAction + 2, // 231: api.v1.TolerationMutation.action:type_name -> api.v1.MutationAction + 191, // 232: api.v1.TolerationMutation.toleration:type_name -> api.v1.Toleration + 18, // 233: api.v1.ClusterRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 22, // 234: api.v1.ClusterRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 18, // 235: api.v1.ClusterRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 18, // 236: api.v1.NodeGroupRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 20, // 237: api.v1.NodeGroupRecommendationPolicy.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger + 22, // 238: api.v1.NodeGroupRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 21, // 239: api.v1.NodeGroupRecommendationPolicy.actions:type_name -> api.v1.NodeGroupActionsAllowed + 18, // 240: api.v1.NodeGroupRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 24, // 241: api.v1.HorizontalScalingOptimizationTarget.primary_metric:type_name -> api.v1.HPAMetricType + 18, // 242: api.v1.WorkloadRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 19, // 243: api.v1.WorkloadRecommendationPolicy.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 22, // 244: api.v1.WorkloadRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode + 194, // 245: api.v1.WorkloadRecommendationPolicy.cpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 246: api.v1.WorkloadRecommendationPolicy.memory_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 247: api.v1.WorkloadRecommendationPolicy.gpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 194, // 248: api.v1.WorkloadRecommendationPolicy.gpu_vram_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget + 195, // 249: api.v1.WorkloadRecommendationPolicy.horizontal_scaling:type_name -> api.v1.HorizontalScalingOptimizationTarget + 18, // 250: api.v1.WorkloadRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 144, // 251: api.v1.WorkloadRecommendationPolicy.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 637, // 252: api.v1.WorkloadRecommendationPolicy.deleted_at:type_name -> google.protobuf.Timestamp + 22, // 253: api.v1.GetPolicyRecommendedDefaultsRequest.recommendation_mode:type_name -> api.v1.RecommendationMode + 196, // 254: api.v1.GetPolicyRecommendedDefaultsResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 200, // 255: api.v1.BalanceRegisterRequest.features:type_name -> api.v1.BalanceFeatures + 23, // 256: api.v1.BalanceApplyRecommendationResponse.type:type_name -> api.v1.RecommendationType + 202, // 257: api.v1.BalanceApplyRecommendationResponse.live_migration_result:type_name -> api.v1.LiveMigrationResult + 637, // 258: api.v1.BalanceApplyRecommendationResponse.applied_at:type_name -> google.protobuf.Timestamp + 637, // 259: api.v1.NodeGroupRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 193, // 260: api.v1.NodeGroupRecommendation.policy:type_name -> api.v1.NodeGroupRecommendationPolicy + 648, // 261: api.v1.CostImpact.current_cost_per_month:type_name -> google.type.Money + 648, // 262: api.v1.CostImpact.recommended_cost_per_month:type_name -> google.type.Money + 648, // 263: api.v1.CostImpact.current_cpu_cost_per_month:type_name -> google.type.Money + 648, // 264: api.v1.CostImpact.current_memory_cost_per_month:type_name -> google.type.Money + 648, // 265: api.v1.CostImpact.recommended_cpu_cost_per_month:type_name -> google.type.Money + 648, // 266: api.v1.CostImpact.recommended_memory_cost_per_month:type_name -> google.type.Money + 648, // 267: api.v1.CostImpact.current_gpu_cost_per_month:type_name -> google.type.Money + 648, // 268: api.v1.CostImpact.recommended_gpu_cost_per_month:type_name -> google.type.Money + 4, // 269: api.v1.CostImpact.cost_period:type_name -> api.v1.CostPeriod + 640, // 270: api.v1.WorkloadRecommendation.kind:type_name -> api.v1.K8sObjectKind + 184, // 271: api.v1.WorkloadRecommendation.container_recommendations:type_name -> api.v1.ContainerRecommendation + 637, // 272: api.v1.WorkloadRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 185, // 273: api.v1.WorkloadRecommendation.keda_scaled_object_recommendation:type_name -> api.v1.KedaScaledObjectRecommendation + 641, // 274: api.v1.WorkloadRecommendation.label_selector:type_name -> api.v1.LabelSelector + 8, // 275: api.v1.WorkloadRecommendation.del_prop:type_name -> api.v1.LiveMigDeletionPropagation + 191, // 276: api.v1.WorkloadRecommendation.current_tolerations:type_name -> api.v1.Toleration + 191, // 277: api.v1.WorkloadRecommendation.recommended_tolerations:type_name -> api.v1.Toleration + 9, // 278: api.v1.WorkloadRecommendation.status:type_name -> api.v1.RecommendationStatus + 196, // 279: api.v1.WorkloadRecommendation.policy:type_name -> api.v1.WorkloadRecommendationPolicy + 94, // 280: api.v1.WorkloadRecommendation.policy_target:type_name -> api.v1.WorkloadPolicyTarget + 1, // 281: api.v1.WorkloadRecommendation.replica_count_action:type_name -> api.v1.ActionToTake + 202, // 282: api.v1.WorkloadRecommendation.live_migration_result:type_name -> api.v1.LiveMigrationResult + 205, // 283: api.v1.WorkloadRecommendation.cost_impact:type_name -> api.v1.CostImpact + 189, // 284: api.v1.WorkloadRecommendation.node_selector_mutations:type_name -> api.v1.NodeSelectorMutation + 190, // 285: api.v1.WorkloadRecommendation.toleration_mutations:type_name -> api.v1.TolerationMutation + 602, // 286: api.v1.WorkloadRecommendation.source_images:type_name -> api.v1.WorkloadRecommendation.SourceImagesEntry + 1, // 287: api.v1.WorkloadRecommendation.restart_action_to_take:type_name -> api.v1.ActionToTake + 207, // 288: api.v1.WorkloadRecommendation.reasoning_details:type_name -> api.v1.ReasoningDetails + 209, // 289: api.v1.ReasoningDetails.insights:type_name -> api.v1.ReasoningInsight + 211, // 290: api.v1.ReasoningDetails.container_changes:type_name -> api.v1.ReasoningContainerChange + 214, // 291: api.v1.ReasoningDetails.replicas:type_name -> api.v1.ReasoningReplicas + 215, // 292: api.v1.ReasoningDetails.decisions:type_name -> api.v1.ReasoningDecision + 6, // 293: api.v1.ReasoningInsight.type:type_name -> api.v1.ReasoningInsightType + 5, // 294: api.v1.ReasoningInsight.severity:type_name -> api.v1.ReasoningInsightSeverity + 208, // 295: api.v1.ReasoningInsight.evidence:type_name -> api.v1.ReasoningEvidence + 210, // 296: api.v1.ReasoningContainerChange.cpu:type_name -> api.v1.ReasoningResourceEdge + 210, // 297: api.v1.ReasoningContainerChange.memory:type_name -> api.v1.ReasoningResourceEdge + 210, // 298: api.v1.ReasoningContainerChange.gpu:type_name -> api.v1.ReasoningResourceEdge + 212, // 299: api.v1.ReasoningReplicas.utilization:type_name -> api.v1.ReasoningUtilization + 213, // 300: api.v1.ReasoningReplicas.historical_pattern:type_name -> api.v1.ReasoningHistoricalPattern + 7, // 301: api.v1.ReasoningDecision.kind:type_name -> api.v1.ReasoningDecisionKind + 193, // 302: api.v1.GetAttachedNodeGroupPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy + 640, // 303: api.v1.GetAttachedWorkloadPoliciesRequest.kind:type_name -> api.v1.K8sObjectKind + 220, // 304: api.v1.GetAttachedWorkloadPoliciesResponse.relevant_policies:type_name -> api.v1.WorkloadRecommendationPolicyGroup + 603, // 305: api.v1.GetAttachedWorkloadPoliciesResponse.policy_id_to_matched_targets:type_name -> api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry + 196, // 306: api.v1.WorkloadRecommendationPolicyGroup.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 94, // 307: api.v1.WorkloadPolicyTargetGroup.targets:type_name -> api.v1.WorkloadPolicyTarget + 50, // 308: api.v1.WorkloadIdentifiers.workloads:type_name -> api.v1.WorkloadIdentifier + 50, // 309: api.v1.WorkloadPolicies.workload:type_name -> api.v1.WorkloadIdentifier + 196, // 310: api.v1.WorkloadPolicies.policies:type_name -> api.v1.WorkloadRecommendationPolicy + 604, // 311: api.v1.ListAttachedWorkloadPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry + 605, // 312: api.v1.ListAttachedWorkloadPoliciesResponse.workload_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry + 606, // 313: api.v1.ListAttachedNodeGroupPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry + 607, // 314: api.v1.ListAttachedNodeGroupPoliciesResponse.node_group_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry + 640, // 315: api.v1.RecommendationAppliedRequest.kind:type_name -> api.v1.K8sObjectKind + 640, // 316: api.v1.ApplyRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind + 206, // 317: api.v1.ApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 637, // 318: api.v1.RetrieveSavingsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp + 637, // 319: api.v1.RetrieveSavingsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp + 649, // 320: api.v1.RetrieveSavingsForWorkloadResponse.savings:type_name -> api.v1.SavingsTimeSeries + 650, // 321: api.v1.RetrieveSavingsForWorkloadResponse.get_workload_resp:type_name -> api.v1.GetWorkloadResponse + 286, // 322: api.v1.CreateNodePoliciesRequest.policies:type_name -> api.v1.NodePolicy + 286, // 323: api.v1.CreateNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy + 286, // 324: api.v1.SuggestedNodePolicyResponse.policy:type_name -> api.v1.NodePolicy + 286, // 325: api.v1.GenerateNodePoliciesFromKarpenterResponse.policies:type_name -> api.v1.NodePolicy + 317, // 326: api.v1.GenerateNodePoliciesFromKarpenterResponse.targets:type_name -> api.v1.NodePolicyTarget + 286, // 327: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.policies:type_name -> api.v1.NodePolicy + 317, // 328: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.targets:type_name -> api.v1.NodePolicyTarget + 274, // 329: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.warnings:type_name -> api.v1.WorkloadCompatibilityWarning + 245, // 330: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.eligibility:type_name -> api.v1.NodeGroupMigrationEligibility + 637, // 331: api.v1.GetMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp + 637, // 332: api.v1.GetMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp + 637, // 333: api.v1.GetKarpenterMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp + 637, // 334: api.v1.GetKarpenterMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp + 637, // 335: api.v1.KarpenterOwnershipConflict.detected_at:type_name -> google.protobuf.Timestamp + 637, // 336: api.v1.KarpenterOwnershipConflict.acknowledged_at:type_name -> google.protobuf.Timestamp + 258, // 337: api.v1.DetectKarpenterOwnershipConflictsResponse.conflicts:type_name -> api.v1.KarpenterOwnershipConflict + 263, // 338: api.v1.GetKarpenterSourceResourcesResponse.resources:type_name -> api.v1.KarpenterSourceResource + 266, // 339: api.v1.GetKarpenterAdoptionStatusResponse.statuses:type_name -> api.v1.NodePoolAdoptionStatus + 637, // 340: api.v1.NodePoolValidationReport.reported_at:type_name -> google.protobuf.Timestamp + 272, // 341: api.v1.GetNodePoolValidationsResponse.validations:type_name -> api.v1.NodePoolValidationReport + 286, // 342: api.v1.ListNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy + 286, // 343: api.v1.UpdateNodePolicyRequest.policy:type_name -> api.v1.NodePolicy + 286, // 344: api.v1.UpdateNodePolicyResponse.policy:type_name -> api.v1.NodePolicy + 10, // 345: api.v1.NodeGroupCheckpointStatus.state:type_name -> api.v1.NodeGroupCheckpointState + 11, // 346: api.v1.NodeGroupCheckpointStatus.reason:type_name -> api.v1.CheckpointReason + 608, // 347: api.v1.GetNodeGroupsCheckpointStatusResponse.by_node_group:type_name -> api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry + 641, // 348: api.v1.NodePolicy.instance_categories:type_name -> api.v1.LabelSelector + 641, // 349: api.v1.NodePolicy.instance_families:type_name -> api.v1.LabelSelector + 641, // 350: api.v1.NodePolicy.instance_cpus:type_name -> api.v1.LabelSelector + 641, // 351: api.v1.NodePolicy.instance_hypervisors:type_name -> api.v1.LabelSelector + 641, // 352: api.v1.NodePolicy.instance_generations:type_name -> api.v1.LabelSelector + 641, // 353: api.v1.NodePolicy.instance_sizes:type_name -> api.v1.LabelSelector + 641, // 354: api.v1.NodePolicy.instance_shapes:type_name -> api.v1.LabelSelector + 641, // 355: api.v1.NodePolicy.instance_types:type_name -> api.v1.LabelSelector + 641, // 356: api.v1.NodePolicy.instance_local_nvme:type_name -> api.v1.LabelSelector + 641, // 357: api.v1.NodePolicy.zones:type_name -> api.v1.LabelSelector + 641, // 358: api.v1.NodePolicy.architectures:type_name -> api.v1.LabelSelector + 641, // 359: api.v1.NodePolicy.capacity_types:type_name -> api.v1.LabelSelector + 641, // 360: api.v1.NodePolicy.operating_systems:type_name -> api.v1.LabelSelector + 609, // 361: api.v1.NodePolicy.labels:type_name -> api.v1.NodePolicy.LabelsEntry + 321, // 362: api.v1.NodePolicy.taints:type_name -> api.v1.Taint + 323, // 363: api.v1.NodePolicy.disruption:type_name -> api.v1.DisruptionPolicy + 324, // 364: api.v1.NodePolicy.limits:type_name -> api.v1.ResourceLimits + 321, // 365: api.v1.NodePolicy.startup_taints:type_name -> api.v1.Taint + 325, // 366: api.v1.NodePolicy.aws:type_name -> api.v1.AWSNodeClassSpec + 352, // 367: api.v1.NodePolicy.gcp:type_name -> api.v1.GCPNodeClassSpec + 355, // 368: api.v1.NodePolicy.azure:type_name -> api.v1.AzureNodeClassSpec + 363, // 369: api.v1.NodePolicy.oci:type_name -> api.v1.OCINodeClassSpec + 651, // 370: api.v1.NodePolicy.cloud_provider:type_name -> api.v1.CloudProvider + 320, // 371: api.v1.NodePolicy.zonal_shift:type_name -> api.v1.ZonalShiftConfig + 365, // 372: api.v1.NodePolicy.raw:type_name -> api.v1.RawKarpenterSpec + 637, // 373: api.v1.NodePolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 374: api.v1.NodePolicy.updated_at:type_name -> google.protobuf.Timestamp + 637, // 375: api.v1.NodePolicy.deleted_at:type_name -> google.protobuf.Timestamp + 286, // 376: api.v1.PreviewNodeRecommendationConfigRequest.policies:type_name -> api.v1.NodePolicy + 289, // 377: api.v1.PreviewNodeRecommendationConfigResponse.nrc:type_name -> api.v1.NodeRecommendationConfig + 9, // 378: api.v1.NodeRecommendationConfig.status:type_name -> api.v1.RecommendationStatus + 637, // 379: api.v1.NodeRecommendationConfig.created_at:type_name -> google.protobuf.Timestamp + 637, // 380: api.v1.NodeRecommendationConfig.updated_at:type_name -> google.protobuf.Timestamp + 637, // 381: api.v1.NodeRecommendationConfig.deleted_at:type_name -> google.protobuf.Timestamp + 610, // 382: api.v1.SuggestedKarpenterConfigResponse.ng_to_original:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry + 611, // 383: api.v1.SuggestedKarpenterConfigResponse.ng_to_suggested:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry + 286, // 384: api.v1.SuggestNodePolicyImprovementsRequest.policy:type_name -> api.v1.NodePolicy + 652, // 385: api.v1.SuggestNodePolicyImprovementsRequest.window:type_name -> api.v1.ProfileWindow + 286, // 386: api.v1.SuggestNodePolicyImprovementsResponse.original:type_name -> api.v1.NodePolicy + 286, // 387: api.v1.SuggestNodePolicyImprovementsResponse.suggested:type_name -> api.v1.NodePolicy + 297, // 388: api.v1.SuggestNodePolicyImprovementsResponse.suggestions:type_name -> api.v1.NodePolicySuggestion + 301, // 389: api.v1.SuggestNodePolicyImprovementsResponse.context:type_name -> api.v1.SuggestionContext + 637, // 390: api.v1.SuggestNodePolicyImprovementsResponse.computed_at:type_name -> google.protobuf.Timestamp + 652, // 391: api.v1.ListClusterNodePolicySuggestionsRequest.window:type_name -> api.v1.ProfileWindow + 296, // 392: api.v1.ListClusterNodePolicySuggestionsResponse.policies:type_name -> api.v1.NodePolicySuggestionsForPolicy + 637, // 393: api.v1.ListClusterNodePolicySuggestionsResponse.computed_at:type_name -> google.protobuf.Timestamp + 297, // 394: api.v1.NodePolicySuggestionsForPolicy.suggestions:type_name -> api.v1.NodePolicySuggestion + 301, // 395: api.v1.NodePolicySuggestionsForPolicy.context:type_name -> api.v1.SuggestionContext + 637, // 396: api.v1.NodePolicySuggestionsForPolicy.computed_at:type_name -> google.protobuf.Timestamp + 12, // 397: api.v1.NodePolicySuggestion.group:type_name -> api.v1.SuggestionGroup + 13, // 398: api.v1.NodePolicySuggestion.flavor:type_name -> api.v1.SuggestionFlavor + 14, // 399: api.v1.NodePolicySuggestion.severity:type_name -> api.v1.SuggestionSeverity + 299, // 400: api.v1.NodePolicySuggestion.evidence:type_name -> api.v1.SuggestionEvidence + 298, // 401: api.v1.NodePolicySuggestion.additional_field_changes:type_name -> api.v1.SuggestionFieldChange + 15, // 402: api.v1.SuggestionEvidence.scope:type_name -> api.v1.EvidenceScope + 300, // 403: api.v1.SuggestionEvidence.workloads:type_name -> api.v1.SuggestionWorkloadRef + 652, // 404: api.v1.SuggestionContext.window:type_name -> api.v1.ProfileWindow + 15, // 405: api.v1.SuggestionContext.evidence_scope:type_name -> api.v1.EvidenceScope + 304, // 406: api.v1.GetAvailableKindsByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters + 16, // 407: api.v1.SearchResourcesByTargetingFiltersRequest.target_filter_type:type_name -> api.v1.TargetFilterType + 304, // 408: api.v1.SearchResourcesByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters + 640, // 409: api.v1.TargetFilters.kind_filter:type_name -> api.v1.K8sObjectKind + 642, // 410: api.v1.TargetFilters.name_pattern:type_name -> api.v1.RegexPattern + 642, // 411: api.v1.TargetFilters.namespace_pattern:type_name -> api.v1.RegexPattern + 640, // 412: api.v1.GetAvailableKindsByTargetingFiltersResponse.kinds:type_name -> api.v1.K8sObjectKind + 307, // 413: api.v1.SearchResourcesByTargetingFiltersResponse.namespaces:type_name -> api.v1.NamespaceSearchResult + 308, // 414: api.v1.SearchResourcesByTargetingFiltersResponse.workloads:type_name -> api.v1.WorkloadSearchResult + 309, // 415: api.v1.SearchResourcesByTargetingFiltersResponse.node_groups:type_name -> api.v1.NodeGroupSearchResult + 310, // 416: api.v1.SearchResourcesByTargetingFiltersResponse.labels:type_name -> api.v1.LabelSearchResult + 317, // 417: api.v1.CreateNodePolicyTargetsRequest.targets:type_name -> api.v1.NodePolicyTarget + 317, // 418: api.v1.CreateNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget + 317, // 419: api.v1.ListNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget + 317, // 420: api.v1.UpdateNodePolicyTargetRequest.target:type_name -> api.v1.NodePolicyTarget + 317, // 421: api.v1.UpdateNodePolicyTargetResponse.target:type_name -> api.v1.NodePolicyTarget + 637, // 422: api.v1.NodePolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 423: api.v1.NodePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 637, // 424: api.v1.NodePolicyTarget.deleted_at:type_name -> google.protobuf.Timestamp + 319, // 425: api.v1.NodePolicyTarget.status:type_name -> api.v1.NodePolicyTargetStatus + 637, // 426: api.v1.NodePolicyCondition.last_transition_time:type_name -> google.protobuf.Timestamp + 318, // 427: api.v1.NodePolicyTargetStatus.conditions:type_name -> api.v1.NodePolicyCondition + 322, // 428: api.v1.DisruptionPolicy.budgets:type_name -> api.v1.DisruptionBudget + 344, // 429: api.v1.AWSNodeClassSpec.subnet_selector_terms:type_name -> api.v1.SubnetSelectorTerm + 345, // 430: api.v1.AWSNodeClassSpec.security_group_selector_terms:type_name -> api.v1.SecurityGroupSelectorTerm + 346, // 431: api.v1.AWSNodeClassSpec.capacity_reservation_selector_terms:type_name -> api.v1.CapacityReservationSelectorTerm + 347, // 432: api.v1.AWSNodeClassSpec.ami_selector_terms:type_name -> api.v1.AMISelectorTerm + 612, // 433: api.v1.AWSNodeClassSpec.tags:type_name -> api.v1.AWSNodeClassSpec.TagsEntry + 348, // 434: api.v1.AWSNodeClassSpec.kubelet:type_name -> api.v1.KubeletConfiguration + 349, // 435: api.v1.AWSNodeClassSpec.block_device_mappings:type_name -> api.v1.BlockDeviceMapping + 17, // 436: api.v1.AWSNodeClassSpec.instance_store_policy:type_name -> api.v1.InstanceStorePolicy + 351, // 437: api.v1.AWSNodeClassSpec.metadata_options:type_name -> api.v1.MetadataOptions + 332, // 438: api.v1.GetInstanceFamiliesResponse.instance_families:type_name -> api.v1.InstanceFamily + 334, // 439: api.v1.GetInstanceSizesResponse.instance_sizes:type_name -> api.v1.InstanceSize + 333, // 440: api.v1.GetInstanceShapesResponse.instance_shapes:type_name -> api.v1.InstanceShape + 335, // 441: api.v1.GetInstanceCategoriesResponse.instance_categories:type_name -> api.v1.InstanceCategory + 336, // 442: api.v1.GetInstanceCPUsResponse.instance_cpus:type_name -> api.v1.InstanceCPU + 337, // 443: api.v1.GetInstanceTypeNamesResponse.instance_types:type_name -> api.v1.InstanceTypeName + 613, // 444: api.v1.SubnetSelectorTerm.tags:type_name -> api.v1.SubnetSelectorTerm.TagsEntry + 614, // 445: api.v1.SecurityGroupSelectorTerm.tags:type_name -> api.v1.SecurityGroupSelectorTerm.TagsEntry + 615, // 446: api.v1.CapacityReservationSelectorTerm.tags:type_name -> api.v1.CapacityReservationSelectorTerm.TagsEntry + 616, // 447: api.v1.AMISelectorTerm.tags:type_name -> api.v1.AMISelectorTerm.TagsEntry + 617, // 448: api.v1.KubeletConfiguration.system_reserved:type_name -> api.v1.KubeletConfiguration.SystemReservedEntry + 618, // 449: api.v1.KubeletConfiguration.kube_reserved:type_name -> api.v1.KubeletConfiguration.KubeReservedEntry + 619, // 450: api.v1.KubeletConfiguration.eviction_hard:type_name -> api.v1.KubeletConfiguration.EvictionHardEntry + 620, // 451: api.v1.KubeletConfiguration.eviction_soft:type_name -> api.v1.KubeletConfiguration.EvictionSoftEntry + 621, // 452: api.v1.KubeletConfiguration.eviction_soft_grace_period:type_name -> api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry + 350, // 453: api.v1.BlockDeviceMapping.ebs:type_name -> api.v1.BlockDevice + 353, // 454: api.v1.GCPNodeClassSpec.image_selector_terms:type_name -> api.v1.GCPImageSelectorTerm + 348, // 455: api.v1.GCPNodeClassSpec.kubelet_configuration:type_name -> api.v1.KubeletConfiguration + 622, // 456: api.v1.GCPNodeClassSpec.labels:type_name -> api.v1.GCPNodeClassSpec.LabelsEntry + 623, // 457: api.v1.GCPNodeClassSpec.metadata:type_name -> api.v1.GCPNodeClassSpec.MetadataEntry + 354, // 458: api.v1.GCPNodeClassSpec.disks:type_name -> api.v1.GCPDisk + 624, // 459: api.v1.AzureNodeClassSpec.tags:type_name -> api.v1.AzureNodeClassSpec.TagsEntry + 356, // 460: api.v1.AzureNodeClassSpec.kubelet:type_name -> api.v1.AzureKubeletConfiguration + 357, // 461: api.v1.OCINodeClassSpec.image_selector:type_name -> api.v1.OCIImageSelectorTerm + 358, // 462: api.v1.OCINodeClassSpec.subnet_selector:type_name -> api.v1.OCISubnetSelectorTerm + 359, // 463: api.v1.OCINodeClassSpec.security_group_selector:type_name -> api.v1.OCISecurityGroupSelectorTerm + 625, // 464: api.v1.OCINodeClassSpec.meta_data:type_name -> api.v1.OCINodeClassSpec.MetaDataEntry + 626, // 465: api.v1.OCINodeClassSpec.tags:type_name -> api.v1.OCINodeClassSpec.TagsEntry + 627, // 466: api.v1.OCINodeClassSpec.free_form_tags:type_name -> api.v1.OCINodeClassSpec.FreeFormTagsEntry + 360, // 467: api.v1.OCINodeClassSpec.boot_config:type_name -> api.v1.OCIBootConfig + 361, // 468: api.v1.OCINodeClassSpec.launch_options:type_name -> api.v1.OCILaunchOptions + 362, // 469: api.v1.OCINodeClassSpec.block_devices:type_name -> api.v1.OCIVolumeAttributes + 369, // 470: api.v1.SnapshotCRStatusReport.resources:type_name -> api.v1.SnapshotCRStatus + 628, // 471: api.v1.SnapshotCRStatus.annotations:type_name -> api.v1.SnapshotCRStatus.AnnotationsEntry + 637, // 472: api.v1.SnapshotCRRuntimeStatus.last_activity_time:type_name -> google.protobuf.Timestamp + 637, // 473: api.v1.SnapshotCRRuntimeStatus.start_time:type_name -> google.protobuf.Timestamp + 637, // 474: api.v1.SnapshotCRRuntimeStatus.completion_time:type_name -> google.protobuf.Timestamp + 637, // 475: api.v1.SnapshotCRRuntimeStatus.observed_at:type_name -> google.protobuf.Timestamp + 370, // 476: api.v1.SnapshotPolicyTargetStatus.resources:type_name -> api.v1.SnapshotCRRuntimeStatus + 374, // 477: api.v1.NodeRecommendation.aws:type_name -> api.v1.AWSKarpenterSpec + 375, // 478: api.v1.NodeRecommendation.aks:type_name -> api.v1.AKSKarpenterSpec + 379, // 479: api.v1.NodeRecommendation.gcp:type_name -> api.v1.GCPKarpenterSpec + 381, // 480: api.v1.NodeRecommendation.oci:type_name -> api.v1.OCIKarpenterSpec + 376, // 481: api.v1.AWSKarpenterSpec.np:type_name -> api.v1.NodePool + 377, // 482: api.v1.AWSKarpenterSpec.ec2nc:type_name -> api.v1.EC2NodeClass + 376, // 483: api.v1.AKSKarpenterSpec.np:type_name -> api.v1.NodePool + 378, // 484: api.v1.AKSKarpenterSpec.aksnc:type_name -> api.v1.AKSNodeClass + 376, // 485: api.v1.GCPKarpenterSpec.np:type_name -> api.v1.NodePool + 380, // 486: api.v1.GCPKarpenterSpec.node_classes:type_name -> api.v1.GCENodeClass + 376, // 487: api.v1.OCIKarpenterSpec.np:type_name -> api.v1.NodePool + 382, // 488: api.v1.OCIKarpenterSpec.node_classes:type_name -> api.v1.OCINodeClass + 18, // 489: api.v1.StorageRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger + 18, // 490: api.v1.StorageRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger + 637, // 491: api.v1.StorageRecommendationPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 492: api.v1.StorageRecommendationPolicy.updated_at:type_name -> google.protobuf.Timestamp + 18, // 493: api.v1.CreateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 383, // 494: api.v1.CreateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 383, // 495: api.v1.GetStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 383, // 496: api.v1.ListStorageRecommendationPoliciesResponse.policies:type_name -> api.v1.StorageRecommendationPolicy + 18, // 497: api.v1.UpdateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 383, // 498: api.v1.UpdateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy + 641, // 499: api.v1.StoragePolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector + 637, // 500: api.v1.StoragePolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 501: api.v1.StoragePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 641, // 502: api.v1.CreateStoragePolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector + 394, // 503: api.v1.CreateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget + 394, // 504: api.v1.ListStoragePolicyTargetsResponse.targets:type_name -> api.v1.StoragePolicyTarget + 394, // 505: api.v1.UpdateStoragePolicyTargetRequest.target:type_name -> api.v1.StoragePolicyTarget + 394, // 506: api.v1.UpdateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget + 9, // 507: api.v1.PvcStorageRecommendation.status:type_name -> api.v1.RecommendationStatus + 637, // 508: api.v1.PvcStorageRecommendation.timestamp:type_name -> google.protobuf.Timestamp + 637, // 509: api.v1.PvcStorageRecommendation.applied_at:type_name -> google.protobuf.Timestamp + 637, // 510: api.v1.PvcStorageRecommendation.created_at:type_name -> google.protobuf.Timestamp + 637, // 511: api.v1.PvcStorageRecommendation.updated_at:type_name -> google.protobuf.Timestamp + 25, // 512: api.v1.PvcStorageRecommendation.operation_type:type_name -> api.v1.PvcOperationType + 403, // 513: api.v1.GetPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 639, // 514: api.v1.ListPvcStorageRecommendationsRequest.pagination:type_name -> api.v1.Pagination + 403, // 515: api.v1.ListPvcStorageRecommendationsResponse.recommendations:type_name -> api.v1.PvcStorageRecommendation + 639, // 516: api.v1.ListPvcStorageRecommendationsResponse.pagination:type_name -> api.v1.Pagination + 403, // 517: api.v1.GeneratePvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 403, // 518: api.v1.PreviewPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation + 637, // 519: api.v1.WorkloadRuleOOMEvent.timestamp:type_name -> google.protobuf.Timestamp + 637, // 520: api.v1.WorkloadRuleOOMEvent.created_at:type_name -> google.protobuf.Timestamp + 412, // 521: api.v1.ListWorkloadRuleOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent + 412, // 522: api.v1.ListWorkloadOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent + 637, // 523: api.v1.WorkloadRuleCPUThrottleEvent.timestamp:type_name -> google.protobuf.Timestamp + 637, // 524: api.v1.WorkloadRuleCPUThrottleEvent.created_at:type_name -> google.protobuf.Timestamp + 417, // 525: api.v1.ListWorkloadRuleCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent + 417, // 526: api.v1.ListWorkloadCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent + 422, // 527: api.v1.WorkloadOptimizationPolicyProto.namespace_selector:type_name -> api.v1.StringSetSelector + 637, // 528: api.v1.WorkloadOptimizationPolicyProto.created_at:type_name -> google.protobuf.Timestamp + 637, // 529: api.v1.WorkloadOptimizationPolicyProto.updated_at:type_name -> google.protobuf.Timestamp + 629, // 530: api.v1.WorkloadOptimizationPolicyProto.cluster_names:type_name -> api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry + 18, // 531: api.v1.WorkloadOptimizationPolicyProto.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 532: api.v1.WorkloadOptimizationPolicyProto.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 533: api.v1.WorkloadOptimizationPolicyProto.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 534: api.v1.WorkloadOptimizationPolicyProto.label_selector:type_name -> api.v1.LabelSelector + 642, // 535: api.v1.WorkloadOptimizationPolicyProto.name_pattern:type_name -> api.v1.RegexPattern + 642, // 536: api.v1.WorkloadOptimizationPolicyProto.namespace_pattern:type_name -> api.v1.RegexPattern + 137, // 537: api.v1.WorkloadOptimizationPolicyProto.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 538: api.v1.WorkloadOptimizationPolicyProto.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 539: api.v1.WorkloadOptimizationPolicyProto.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 540: api.v1.WorkloadOptimizationPolicyProto.hpa_rule:type_name -> api.v1.HPARuleConfig + 142, // 541: api.v1.WorkloadOptimizationPolicyProto.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 144, // 542: api.v1.WorkloadOptimizationPolicyProto.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 137, // 543: api.v1.GenericOptimizationSettings.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 544: api.v1.GenericOptimizationSettings.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 545: api.v1.GenericOptimizationSettings.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 546: api.v1.GenericOptimizationSettings.hpa_rule:type_name -> api.v1.HPARuleConfig + 142, // 547: api.v1.GenericOptimizationSettings.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 144, // 548: api.v1.GenericOptimizationSettings.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 422, // 549: api.v1.CreateWorkloadOptimizationPolicyRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 18, // 550: api.v1.CreateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 551: api.v1.CreateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 552: api.v1.CreateWorkloadOptimizationPolicyRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 553: api.v1.CreateWorkloadOptimizationPolicyRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 554: api.v1.CreateWorkloadOptimizationPolicyRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 555: api.v1.CreateWorkloadOptimizationPolicyRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 424, // 556: api.v1.CreateWorkloadOptimizationPolicyRequest.settings:type_name -> api.v1.GenericOptimizationSettings + 423, // 557: api.v1.CreateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 558: api.v1.ListWorkloadOptimizationPoliciesResponse.policies:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 559: api.v1.GetWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 560: api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 422, // 561: api.v1.UpdateWorkloadOptimizationPolicyRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 18, // 562: api.v1.UpdateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 563: api.v1.UpdateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 422, // 564: api.v1.UpdateWorkloadOptimizationPolicyRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 565: api.v1.UpdateWorkloadOptimizationPolicyRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 566: api.v1.UpdateWorkloadOptimizationPolicyRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 567: api.v1.UpdateWorkloadOptimizationPolicyRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 424, // 568: api.v1.UpdateWorkloadOptimizationPolicyRequest.settings:type_name -> api.v1.GenericOptimizationSettings + 26, // 569: api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest.rule_action:type_name -> api.v1.WorkloadRuleAction + 423, // 570: api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 423, // 571: api.v1.UpdateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto + 26, // 572: api.v1.DeleteWorkloadOptimizationPolicyRequest.rule_action:type_name -> api.v1.WorkloadRuleAction + 422, // 573: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.namespace_selector:type_name -> api.v1.StringSetSelector + 422, // 574: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 575: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.label_selector:type_name -> api.v1.LabelSelector + 642, // 576: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern + 642, // 577: api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern + 27, // 578: api.v1.WorkloadOptimizationPolicyMatch.status:type_name -> api.v1.WorkloadOptimizationPolicyMatchStatus + 440, // 579: api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadOptimizationPolicyMatch + 422, // 580: api.v1.SchedulerPolicyTargetProto.namespace_selector:type_name -> api.v1.StringSetSelector + 422, // 581: api.v1.SchedulerPolicyTargetProto.kind_selector:type_name -> api.v1.StringSetSelector + 641, // 582: api.v1.SchedulerPolicyTargetProto.label_selector:type_name -> api.v1.LabelSelector + 642, // 583: api.v1.SchedulerPolicyTargetProto.name_pattern:type_name -> api.v1.RegexPattern + 642, // 584: api.v1.SchedulerPolicyTargetProto.namespace_pattern:type_name -> api.v1.RegexPattern + 442, // 585: api.v1.SchedulerPolicyProto.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 637, // 586: api.v1.SchedulerPolicyProto.created_at:type_name -> google.protobuf.Timestamp + 637, // 587: api.v1.SchedulerPolicyProto.updated_at:type_name -> google.protobuf.Timestamp + 637, // 588: api.v1.SchedulerPolicyProto.delete_requested_at:type_name -> google.protobuf.Timestamp + 630, // 589: api.v1.SchedulerPolicyProto.cluster_names:type_name -> api.v1.SchedulerPolicyProto.ClusterNamesEntry + 442, // 590: api.v1.CreateSchedulerPolicyRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 443, // 591: api.v1.CreateSchedulerPolicyResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 443, // 592: api.v1.ListSchedulerPoliciesResponse.policies:type_name -> api.v1.SchedulerPolicyProto + 442, // 593: api.v1.UpdateSchedulerPolicyRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 443, // 594: api.v1.UpdateSchedulerPolicyResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 443, // 595: api.v1.ToggleSchedulerPolicyDisabledResponse.policy:type_name -> api.v1.SchedulerPolicyProto + 32, // 596: api.v1.DeleteSchedulerPolicyResponse.outcome:type_name -> api.v1.DeleteSchedulerPolicyResponse.Outcome + 442, // 597: api.v1.PreviewSchedulerPolicyTargetsRequest.targets:type_name -> api.v1.SchedulerPolicyTargetProto + 33, // 598: api.v1.SchedulerPolicyTargetMatch.status:type_name -> api.v1.SchedulerPolicyTargetMatch.Status + 455, // 599: api.v1.PreviewSchedulerPolicyTargetsResponse.matched_workloads:type_name -> api.v1.SchedulerPolicyTargetMatch + 34, // 600: api.v1.SchedulerPolicyEnrollment.state:type_name -> api.v1.SchedulerPolicyEnrollment.State + 637, // 601: api.v1.SchedulerPolicyEnrollment.enrolled_at:type_name -> google.protobuf.Timestamp + 637, // 602: api.v1.SchedulerPolicyEnrollment.unenrolled_at:type_name -> google.protobuf.Timestamp + 458, // 603: api.v1.ListSchedulerPolicyEnrollmentsResponse.enrollments:type_name -> api.v1.SchedulerPolicyEnrollment + 631, // 604: api.v1.ListSchedulerPolicyEnrollmentsResponse.cluster_names:type_name -> api.v1.ListSchedulerPolicyEnrollmentsResponse.ClusterNamesEntry + 443, // 605: api.v1.SchedulerPolicySync.policies:type_name -> api.v1.SchedulerPolicyProto + 462, // 606: api.v1.SchedulerPolicySync.reverts:type_name -> api.v1.SchedulerRevertInstruction + 461, // 607: api.v1.SchedulerPolicySync.scheduler_settings:type_name -> api.v1.SchedulerConfigPayload + 637, // 608: api.v1.SchedulerConfigPayload.updated_at:type_name -> google.protobuf.Timestamp + 632, // 609: api.v1.SchedulerEnrollmentReport.observations:type_name -> api.v1.SchedulerEnrollmentReport.Observation + 633, // 610: api.v1.SchedulerRevertEventReport.events:type_name -> api.v1.SchedulerRevertEventReport.Event + 136, // 611: api.v1.GetWorkloadRulesByPolicyResponse.managed_rules:type_name -> api.v1.WorkloadRule + 136, // 612: api.v1.GetWorkloadRulesByPolicyResponse.excluded_rules:type_name -> api.v1.WorkloadRule + 634, // 613: api.v1.GetWorkloadRulesByPolicyResponse.cluster_names:type_name -> api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry + 136, // 614: api.v1.ListWorkloadRulesResponse.rules:type_name -> api.v1.WorkloadRule + 635, // 615: api.v1.ListWorkloadRulesResponse.cluster_names:type_name -> api.v1.ListWorkloadRulesResponse.ClusterNamesEntry + 636, // 616: api.v1.ListWorkloadRulesResponse.policy_names:type_name -> api.v1.ListWorkloadRulesResponse.PolicyNamesEntry + 136, // 617: api.v1.GetWorkloadRuleByIDResponse.rule:type_name -> api.v1.WorkloadRule + 136, // 618: api.v1.GetWorkloadRuleByWorkloadResponse.rule:type_name -> api.v1.WorkloadRule + 206, // 619: api.v1.DeleteRuleAndApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation + 137, // 620: api.v1.ManualRuleFields.cpu_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 621: api.v1.ManualRuleFields.memory_rule:type_name -> api.v1.ResourceRuleConfig + 137, // 622: api.v1.ManualRuleFields.gpu_rule:type_name -> api.v1.ResourceRuleConfig + 143, // 623: api.v1.ManualRuleFields.hpa_rule:type_name -> api.v1.HPARuleConfig + 144, // 624: api.v1.ManualRuleFields.emergency_response:type_name -> api.v1.EmergencyResponseConfig + 18, // 625: api.v1.ManualRuleFields.action_triggers:type_name -> api.v1.ActionTrigger + 19, // 626: api.v1.ManualRuleFields.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger + 141, // 627: api.v1.ManualRuleFields.containers:type_name -> api.v1.ContainerResourceRuleConfig + 142, // 628: api.v1.ManualRuleFields.jvm_heap_rule:type_name -> api.v1.JVMHeapRuleConfig + 145, // 629: api.v1.ManualRuleFields.keda_scaled_object:type_name -> api.v1.KEDAScaledObjectTemplate + 485, // 630: api.v1.UpsertManualWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields + 29, // 631: api.v1.UpsertManualWorkloadRuleRequest.source:type_name -> api.v1.WorkloadRuleSource + 136, // 632: api.v1.UpsertManualWorkloadRuleResponse.rule:type_name -> api.v1.WorkloadRule + 136, // 633: api.v1.ToggleWorkloadRuleDisabledResponse.rule:type_name -> api.v1.WorkloadRule + 485, // 634: api.v1.PreviewWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields + 136, // 635: api.v1.PreviewWorkloadRuleResponse.materialized_rule:type_name -> api.v1.WorkloadRule + 136, // 636: api.v1.PreviewWorkloadRuleResponse.engine_projection:type_name -> api.v1.WorkloadRule + 653, // 637: api.v1.PreviewWorkloadRuleResponse.profile:type_name -> api.v1.WorkloadProfileResult + 136, // 638: api.v1.PreviewWorkloadRuleResponse.db_rule:type_name -> api.v1.WorkloadRule + 494, // 639: api.v1.BatchAutoOptimizeWorkloadsRequest.workloads:type_name -> api.v1.BatchAutoOptimizeWorkload + 136, // 640: api.v1.BatchAutoOptimizeWorkloadResult.rule:type_name -> api.v1.WorkloadRule + 496, // 641: api.v1.BatchAutoOptimizeWorkloadsResponse.results:type_name -> api.v1.BatchAutoOptimizeWorkloadResult + 498, // 642: api.v1.BatchUpsertManualWorkloadRulesRequest.workloads:type_name -> api.v1.BatchWorkloadEntry + 485, // 643: api.v1.BatchUpsertManualWorkloadRulesRequest.fields:type_name -> api.v1.ManualRuleFields + 29, // 644: api.v1.BatchUpsertManualWorkloadRulesRequest.source:type_name -> api.v1.WorkloadRuleSource + 136, // 645: api.v1.BatchUpsertManualWorkloadRuleResult.rule:type_name -> api.v1.WorkloadRule + 500, // 646: api.v1.BatchUpsertManualWorkloadRulesResponse.results:type_name -> api.v1.BatchUpsertManualWorkloadRuleResult + 498, // 647: api.v1.BatchPreviewWorkloadRulesRequest.workloads:type_name -> api.v1.BatchWorkloadEntry + 485, // 648: api.v1.BatchPreviewWorkloadRulesRequest.fields:type_name -> api.v1.ManualRuleFields + 136, // 649: api.v1.BatchPreviewWorkloadRuleResult.materialized_rule:type_name -> api.v1.WorkloadRule + 136, // 650: api.v1.BatchPreviewWorkloadRuleResult.engine_projection:type_name -> api.v1.WorkloadRule + 653, // 651: api.v1.BatchPreviewWorkloadRuleResult.profile:type_name -> api.v1.WorkloadProfileResult + 503, // 652: api.v1.BatchPreviewWorkloadRulesResponse.results:type_name -> api.v1.BatchPreviewWorkloadRuleResult + 652, // 653: api.v1.WorkloadProfileManifest.window:type_name -> api.v1.ProfileWindow + 654, // 654: api.v1.WorkloadProfileManifest.keys:type_name -> api.v1.ProfileKey + 637, // 655: api.v1.WorkloadProfileManifest.issued_at:type_name -> google.protobuf.Timestamp + 652, // 656: api.v1.BatchWorkloadProfiles.window:type_name -> api.v1.ProfileWindow + 655, // 657: api.v1.BatchWorkloadProfiles.profiles:type_name -> api.v1.WorkloadProfileSnapshot + 637, // 658: api.v1.NodeConfigApplyEvent.applied_at:type_name -> google.protobuf.Timestamp + 289, // 659: api.v1.GetNodeRecommendationStatusResponse.current_config:type_name -> api.v1.NodeRecommendationConfig + 509, // 660: api.v1.GetNodeRecommendationStatusResponse.history:type_name -> api.v1.NodeConfigApplyEvent + 516, // 661: api.v1.GetCheckpointApplyStatusResponse.failures:type_name -> api.v1.NodeApplyFailure + 518, // 662: api.v1.GetClusterCheckpointLabelCoverageResponse.groups:type_name -> api.v1.NodeGroupCheckpointLabelCoverage + 30, // 663: api.v1.NodeCheckpointLabelEntry.last_apply_state:type_name -> api.v1.NodeCheckpointLabelState + 521, // 664: api.v1.ListNodeGroupCheckpointLabelStateResponse.nodes:type_name -> api.v1.NodeCheckpointLabelEntry + 523, // 665: api.v1.SnapshotResourceThreshold.cpu_percent:type_name -> api.v1.SnapshotPercentBounds + 523, // 666: api.v1.SnapshotResourceThreshold.memory_percent:type_name -> api.v1.SnapshotPercentBounds + 524, // 667: api.v1.SnapshotSchedulePolicySpec.resource_threshold:type_name -> api.v1.SnapshotResourceThreshold + 526, // 668: api.v1.SnapshotRetentionPolicySpec.global_retention:type_name -> api.v1.SnapshotGlobalRetention + 527, // 669: api.v1.SnapshotRetentionPolicySpec.container_policies:type_name -> api.v1.SnapshotContainerRetentionPolicy + 528, // 670: api.v1.SnapshotRetentionPolicySpec.pod_policies:type_name -> api.v1.SnapshotPodRetentionPolicy + 529, // 671: api.v1.SnapshotRetentionPolicySpec.namespace_policies:type_name -> api.v1.SnapshotNamespaceRetentionPolicy + 525, // 672: api.v1.SnapshotPolicy.schedule:type_name -> api.v1.SnapshotSchedulePolicySpec + 530, // 673: api.v1.SnapshotPolicy.retention:type_name -> api.v1.SnapshotRetentionPolicySpec + 637, // 674: api.v1.SnapshotPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 675: api.v1.SnapshotPolicy.updated_at:type_name -> google.protobuf.Timestamp + 31, // 676: api.v1.ForensicSnapshotPolicy.post_snapshot_action:type_name -> api.v1.ForensicPostSnapshotAction + 637, // 677: api.v1.ForensicSnapshotPolicy.created_at:type_name -> google.protobuf.Timestamp + 637, // 678: api.v1.ForensicSnapshotPolicy.updated_at:type_name -> google.protobuf.Timestamp + 641, // 679: api.v1.SnapshotTargetScope.namespace_selector:type_name -> api.v1.LabelSelector + 642, // 680: api.v1.SnapshotTargetScope.namespace_pattern:type_name -> api.v1.RegexPattern + 641, // 681: api.v1.SnapshotTargetScope.workload_selector:type_name -> api.v1.LabelSelector + 641, // 682: api.v1.SnapshotTargetScope.annotation_selector:type_name -> api.v1.LabelSelector + 642, // 683: api.v1.SnapshotTargetScope.name_pattern:type_name -> api.v1.RegexPattern + 640, // 684: api.v1.SnapshotTargetScope.kind_filter:type_name -> api.v1.K8sObjectKind + 641, // 685: api.v1.SnapshotTargetScope.pod_selector:type_name -> api.v1.LabelSelector + 533, // 686: api.v1.SnapshotPolicyTarget.scope:type_name -> api.v1.SnapshotTargetScope + 637, // 687: api.v1.SnapshotPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 688: api.v1.SnapshotPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 371, // 689: api.v1.SnapshotPolicyTarget.status:type_name -> api.v1.SnapshotPolicyTargetStatus + 533, // 690: api.v1.ForensicSnapshotPolicyTarget.scope:type_name -> api.v1.SnapshotTargetScope + 637, // 691: api.v1.ForensicSnapshotPolicyTarget.created_at:type_name -> google.protobuf.Timestamp + 637, // 692: api.v1.ForensicSnapshotPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp + 371, // 693: api.v1.ForensicSnapshotPolicyTarget.status:type_name -> api.v1.SnapshotPolicyTargetStatus + 531, // 694: api.v1.CreateSnapshotPoliciesRequest.policies:type_name -> api.v1.SnapshotPolicy + 531, // 695: api.v1.CreateSnapshotPoliciesResponse.policies:type_name -> api.v1.SnapshotPolicy + 531, // 696: api.v1.ListSnapshotPoliciesResponse.policies:type_name -> api.v1.SnapshotPolicy + 531, // 697: api.v1.UpdateSnapshotPolicyRequest.policy:type_name -> api.v1.SnapshotPolicy + 531, // 698: api.v1.UpdateSnapshotPolicyResponse.policy:type_name -> api.v1.SnapshotPolicy + 534, // 699: api.v1.CreateSnapshotPolicyTargetsRequest.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 700: api.v1.CreateSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 701: api.v1.ListSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.SnapshotPolicyTarget + 534, // 702: api.v1.UpdateSnapshotPolicyTargetRequest.target:type_name -> api.v1.SnapshotPolicyTarget + 534, // 703: api.v1.UpdateSnapshotPolicyTargetResponse.target:type_name -> api.v1.SnapshotPolicyTarget + 532, // 704: api.v1.CreateForensicSnapshotPoliciesRequest.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 705: api.v1.CreateForensicSnapshotPoliciesResponse.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 706: api.v1.ListForensicSnapshotPoliciesResponse.policies:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 707: api.v1.UpdateForensicSnapshotPolicyRequest.policy:type_name -> api.v1.ForensicSnapshotPolicy + 532, // 708: api.v1.UpdateForensicSnapshotPolicyResponse.policy:type_name -> api.v1.ForensicSnapshotPolicy + 535, // 709: api.v1.CreateForensicSnapshotPolicyTargetsRequest.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 710: api.v1.CreateForensicSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 711: api.v1.ListForensicSnapshotPolicyTargetsResponse.targets:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 712: api.v1.UpdateForensicSnapshotPolicyTargetRequest.target:type_name -> api.v1.ForensicSnapshotPolicyTarget + 535, // 713: api.v1.UpdateForensicSnapshotPolicyTargetResponse.target:type_name -> api.v1.ForensicSnapshotPolicyTarget + 640, // 714: api.v1.SnapshotResolvedWorkload.kind:type_name -> api.v1.K8sObjectKind + 641, // 715: api.v1.SnapshotResolvedWorkload.pod_selector:type_name -> api.v1.LabelSelector + 570, // 716: api.v1.SnapshotResolvedNamespace.workloads:type_name -> api.v1.SnapshotResolvedWorkload + 571, // 717: api.v1.SnapshotClusterScopePreview.namespaces:type_name -> api.v1.SnapshotResolvedNamespace + 533, // 718: api.v1.PreviewSnapshotPolicyTargetMatchesRequest.scope:type_name -> api.v1.SnapshotTargetScope + 572, // 719: api.v1.PreviewSnapshotPolicyTargetMatchesResponse.clusters:type_name -> api.v1.SnapshotClusterScopePreview + 533, // 720: api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest.scope:type_name -> api.v1.SnapshotTargetScope + 572, // 721: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse.clusters:type_name -> api.v1.SnapshotClusterScopePreview + 575, // 722: api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse.overlaps:type_name -> api.v1.ForensicTargetOverlap + 641, // 723: api.v1.SnapshotRenderedScopeRow.pod_selector:type_name -> api.v1.LabelSelector + 570, // 724: api.v1.SnapshotRenderedScopeRow.workloads:type_name -> api.v1.SnapshotResolvedWorkload + 637, // 725: api.v1.SnapshotRenderedScopeRow.updated_at:type_name -> google.protobuf.Timestamp + 578, // 726: api.v1.GetSnapshotPolicyTargetRenderedScopeResponse.rows:type_name -> api.v1.SnapshotRenderedScopeRow + 578, // 727: api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse.rows:type_name -> api.v1.SnapshotRenderedScopeRow + 637, // 728: api.v1.SnapshotConfigInfo.created_at:type_name -> google.protobuf.Timestamp + 637, // 729: api.v1.SnapshotConfigInfo.updated_at:type_name -> google.protobuf.Timestamp + 637, // 730: api.v1.SnapshotConfigApplyEventInfo.applied_at:type_name -> google.protobuf.Timestamp + 637, // 731: api.v1.SnapshotConfigApplyEventInfo.created_at:type_name -> google.protobuf.Timestamp + 583, // 732: api.v1.GetSnapshotRecommendationStatusResponse.current_config:type_name -> api.v1.SnapshotConfigInfo + 584, // 733: api.v1.GetSnapshotRecommendationStatusResponse.events:type_name -> api.v1.SnapshotConfigApplyEventInfo + 370, // 734: api.v1.GetSnapshotRecommendationStatusResponse.runtime:type_name -> api.v1.SnapshotCRRuntimeStatus + 372, // 735: api.v1.GetSnapshotRecommendationStatusResponse.prereqs:type_name -> api.v1.SnapshotPrereqs + 583, // 736: api.v1.GetForensicSnapshotRecommendationStatusResponse.current_config:type_name -> api.v1.SnapshotConfigInfo + 584, // 737: api.v1.GetForensicSnapshotRecommendationStatusResponse.events:type_name -> api.v1.SnapshotConfigApplyEventInfo + 370, // 738: api.v1.GetForensicSnapshotRecommendationStatusResponse.runtime:type_name -> api.v1.SnapshotCRRuntimeStatus + 594, // 739: api.v1.ListReferencedAuthenticationsResponse.authentications:type_name -> api.v1.ReferencedAuthentication + 66, // 740: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry.value:type_name -> api.v1.TargetIdList + 114, // 741: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry.value:type_name -> api.v1.WorkloadPercentileSummary + 112, // 742: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.CollisionsByWorkloadUidEntry.value:type_name -> api.v1.WorkloadCollisionInfo + 176, // 743: api.v1.AgentHealth.NodeNameToAgentEntry.value:type_name -> api.v1.AgentHealthMeta + 221, // 744: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry.value:type_name -> api.v1.WorkloadPolicyTargetGroup + 196, // 745: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.WorkloadRecommendationPolicy + 643, // 746: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry.value:type_name -> api.v1.WorkloadItem + 193, // 747: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.NodeGroupRecommendationPolicy + 228, // 748: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroupItem + 279, // 749: api.v1.GetNodeGroupsCheckpointStatusResponse.ByNodeGroupEntry.value:type_name -> api.v1.NodeGroupCheckpointStatus + 289, // 750: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry.value:type_name -> api.v1.NodeRecommendationConfig + 289, // 751: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry.value:type_name -> api.v1.NodeRecommendationConfig + 28, // 752: api.v1.SchedulerRevertEventReport.Event.reason:type_name -> api.v1.SchedulerUnhealthyReason + 637, // 753: api.v1.SchedulerRevertEventReport.Event.occurred_at:type_name -> google.protobuf.Timestamp + 39, // 754: api.v1.K8sRecommendationService.GetNodeGroupStats:input_type -> api.v1.GetNodeGroupStatsRequest + 43, // 755: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:input_type -> api.v1.GetLatestNodeGroupRecommendationRequest + 45, // 756: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:input_type -> api.v1.GetLatestWorkloadRecommendationRequest + 47, // 757: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:input_type -> api.v1.GetPreviewWorkloadRecommendationRequest + 49, // 758: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:input_type -> api.v1.GetPreviewWorkloadRecommendationsRequest + 37, // 759: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:input_type -> api.v1.GetRecommendationsForWorkloadRequest + 35, // 760: api.v1.K8sRecommendationService.GetRecommendations:input_type -> api.v1.GetRecommendationsRequest + 67, // 761: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:input_type -> api.v1.CreateNodeGroupRecommendationPolicyRequest + 69, // 762: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:input_type -> api.v1.GetNodeGroupRecommendationPolicyRequest + 71, // 763: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:input_type -> api.v1.ListNodeGroupRecommendationPoliciesRequest + 73, // 764: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:input_type -> api.v1.UpdateNodeGroupRecommendationPolicyRequest + 75, // 765: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:input_type -> api.v1.DeleteNodeGroupRecommendationPolicyRequest + 77, // 766: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:input_type -> api.v1.AttachNodeGroupRecommendationPolicyRequest + 79, // 767: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:input_type -> api.v1.CreateWorkloadRecommendationPolicyRequest + 81, // 768: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:input_type -> api.v1.GetWorkloadRecommendationPolicyRequest + 197, // 769: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:input_type -> api.v1.GetPolicyRecommendedDefaultsRequest + 83, // 770: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:input_type -> api.v1.ListWorkloadRecommendationPoliciesRequest + 85, // 771: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:input_type -> api.v1.UpdateWorkloadRecommendationPolicyRequest + 87, // 772: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:input_type -> api.v1.DeleteWorkloadRecommendationPolicyRequest + 89, // 773: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:input_type -> api.v1.AttachWorkloadRecommendationPolicyRequest + 91, // 774: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:input_type -> api.v1.AttachWorkloadRecommendationPoliciesRequest + 95, // 775: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:input_type -> api.v1.CreateWorkloadPolicyTargetRequest + 97, // 776: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:input_type -> api.v1.GetWorkloadPolicyTargetRequest + 99, // 777: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:input_type -> api.v1.ListWorkloadPolicyTargetsRequest + 101, // 778: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:input_type -> api.v1.UpdateWorkloadPolicyTargetRequest + 103, // 779: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:input_type -> api.v1.DeleteWorkloadPolicyTargetRequest + 104, // 780: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:input_type -> api.v1.ToggleWorkloadPolicyTargetsRequest + 109, // 781: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:input_type -> api.v1.PreviewWorkloadPolicyTargetMatchesRequest + 111, // 782: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:input_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest + 64, // 783: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:input_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest + 116, // 784: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:input_type -> api.v1.CreateNodeGroupPolicyTargetRequest + 118, // 785: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:input_type -> api.v1.GetNodeGroupPolicyTargetRequest + 120, // 786: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:input_type -> api.v1.ListNodeGroupPolicyTargetsRequest + 122, // 787: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:input_type -> api.v1.UpdateNodeGroupPolicyTargetRequest + 124, // 788: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:input_type -> api.v1.DeleteNodeGroupPolicyTargetRequest + 125, // 789: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:input_type -> api.v1.ToggleNodeGroupPolicyTargetsRequest + 128, // 790: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:input_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesRequest + 130, // 791: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:input_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest + 132, // 792: api.v1.K8sRecommendationService.BalanceGetRecommendations:input_type -> api.v1.BalanceGetRecommendationsRequest + 41, // 793: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:input_type -> api.v1.GetOptimalInstanceTypeForNodeGroupRequest + 216, // 794: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:input_type -> api.v1.GetAttachedNodeGroupPoliciesRequest + 218, // 795: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:input_type -> api.v1.GetAttachedWorkloadPoliciesRequest + 303, // 796: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:input_type -> api.v1.SearchResourcesByTargetingFiltersRequest + 302, // 797: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:input_type -> api.v1.GetAvailableKindsByTargetingFiltersRequest + 224, // 798: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:input_type -> api.v1.ListAttachedWorkloadPoliciesRequest + 226, // 799: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:input_type -> api.v1.ListAttachedNodeGroupPoliciesRequest + 233, // 800: api.v1.K8sRecommendationService.RecommendationEvents:input_type -> api.v1.RecommendationEventsRequest + 231, // 801: api.v1.K8sRecommendationService.ApplyRecommendation:input_type -> api.v1.ApplyRecommendationRequest + 229, // 802: api.v1.K8sRecommendationService.RecommendationApplied:input_type -> api.v1.RecommendationAppliedRequest + 235, // 803: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:input_type -> api.v1.RetrieveSavingsForWorkloadRequest + 237, // 804: api.v1.K8sRecommendationService.CreateNodePolicies:input_type -> api.v1.CreateNodePoliciesRequest + 275, // 805: api.v1.K8sRecommendationService.ListNodePolicies:input_type -> api.v1.ListNodePoliciesRequest + 277, // 806: api.v1.K8sRecommendationService.UpdateNodePolicy:input_type -> api.v1.UpdateNodePolicyRequest + 284, // 807: api.v1.K8sRecommendationService.DeleteNodePolicy:input_type -> api.v1.DeleteNodePolicyRequest + 239, // 808: api.v1.K8sRecommendationService.SuggestedNodePolicy:input_type -> api.v1.SuggestedNodePolicyRequest + 290, // 809: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:input_type -> api.v1.SuggestedKarpenterConfigRequest + 292, // 810: api.v1.K8sRecommendationService.SuggestNodePolicyImprovements:input_type -> api.v1.SuggestNodePolicyImprovementsRequest + 294, // 811: api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions:input_type -> api.v1.ListClusterNodePolicySuggestionsRequest + 241, // 812: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:input_type -> api.v1.GenerateNodePoliciesFromKarpenterRequest + 243, // 813: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:input_type -> api.v1.GenerateNodePoliciesFromNodeGroupsRequest + 280, // 814: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:input_type -> api.v1.GetNodeGroupsCheckpointStatusRequest + 282, // 815: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:input_type -> api.v1.SetNodePolicyCheckpointLabelRequest + 512, // 816: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:input_type -> api.v1.EnableCheckpointForPolicyRequest + 514, // 817: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:input_type -> api.v1.GetCheckpointApplyStatusRequest + 517, // 818: api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage:input_type -> api.v1.GetClusterCheckpointLabelCoverageRequest + 520, // 819: api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState:input_type -> api.v1.ListNodeGroupCheckpointLabelStateRequest + 246, // 820: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:input_type -> api.v1.GetNodeAnnotationReadinessRequest + 248, // 821: api.v1.K8sRecommendationService.DetectClusterAutoscaler:input_type -> api.v1.DetectClusterAutoscalerRequest + 250, // 822: api.v1.K8sRecommendationService.GetMigrationState:input_type -> api.v1.GetMigrationStateRequest + 252, // 823: api.v1.K8sRecommendationService.UpdateMigrationState:input_type -> api.v1.UpdateMigrationStateRequest + 254, // 824: api.v1.K8sRecommendationService.GetKarpenterMigrationState:input_type -> api.v1.GetKarpenterMigrationStateRequest + 256, // 825: api.v1.K8sRecommendationService.UpdateKarpenterMigrationState:input_type -> api.v1.UpdateKarpenterMigrationStateRequest + 259, // 826: api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts:input_type -> api.v1.DetectKarpenterOwnershipConflictsRequest + 261, // 827: api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict:input_type -> api.v1.AcknowledgeKarpenterOwnershipConflictRequest + 264, // 828: api.v1.K8sRecommendationService.GetKarpenterSourceResources:input_type -> api.v1.GetKarpenterSourceResourcesRequest + 267, // 829: api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus:input_type -> api.v1.GetKarpenterAdoptionStatusRequest + 269, // 830: api.v1.K8sRecommendationService.ReportNodePoolValidation:input_type -> api.v1.ReportNodePoolValidationRequest + 271, // 831: api.v1.K8sRecommendationService.GetNodePoolValidations:input_type -> api.v1.GetNodePoolValidationsRequest + 311, // 832: api.v1.K8sRecommendationService.CreateNodePolicyTargets:input_type -> api.v1.CreateNodePolicyTargetsRequest + 313, // 833: api.v1.K8sRecommendationService.ListNodePolicyTargets:input_type -> api.v1.ListNodePolicyTargetsRequest + 315, // 834: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:input_type -> api.v1.UpdateNodePolicyTargetRequest + 287, // 835: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:input_type -> api.v1.PreviewNodeRecommendationConfigRequest + 326, // 836: api.v1.K8sRecommendationService.GetInstanceFamilies:input_type -> api.v1.GetInstanceFamiliesRequest + 328, // 837: api.v1.K8sRecommendationService.GetInstanceSizes:input_type -> api.v1.GetInstanceSizesRequest + 338, // 838: api.v1.K8sRecommendationService.GetInstanceCategories:input_type -> api.v1.GetInstanceCategoriesRequest + 330, // 839: api.v1.K8sRecommendationService.GetInstanceShapes:input_type -> api.v1.GetInstanceShapesRequest + 340, // 840: api.v1.K8sRecommendationService.GetInstanceCPUs:input_type -> api.v1.GetInstanceCPUsRequest + 342, // 841: api.v1.K8sRecommendationService.GetInstanceTypeNames:input_type -> api.v1.GetInstanceTypeNamesRequest + 160, // 842: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:input_type -> api.v1.GeneratePodDisruptionBudgetRequest + 162, // 843: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:input_type -> api.v1.GenerateAndCreatePodDisruptionBudgetRequest + 164, // 844: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:input_type -> api.v1.CreatePodDisruptionBudgetRequest + 166, // 845: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:input_type -> api.v1.GetPDBRecommendationForWorkloadRequest + 170, // 846: api.v1.K8sRecommendationService.ListWorkloadStructuralHealth:input_type -> api.v1.ListWorkloadStructuralHealthRequest + 384, // 847: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:input_type -> api.v1.CreateStorageRecommendationPolicyRequest + 386, // 848: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:input_type -> api.v1.GetStorageRecommendationPolicyRequest + 388, // 849: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:input_type -> api.v1.ListStorageRecommendationPoliciesRequest + 390, // 850: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:input_type -> api.v1.UpdateStorageRecommendationPolicyRequest + 392, // 851: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:input_type -> api.v1.DeleteStorageRecommendationPolicyRequest + 395, // 852: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:input_type -> api.v1.CreateStoragePolicyTargetRequest + 397, // 853: api.v1.K8sRecommendationService.ListStoragePolicyTargets:input_type -> api.v1.ListStoragePolicyTargetsRequest + 399, // 854: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:input_type -> api.v1.UpdateStoragePolicyTargetRequest + 401, // 855: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:input_type -> api.v1.DeleteStoragePolicyTargetRequest + 404, // 856: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:input_type -> api.v1.GetPvcStorageRecommendationRequest + 406, // 857: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:input_type -> api.v1.ListPvcStorageRecommendationsRequest + 408, // 858: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:input_type -> api.v1.GeneratePvcStorageRecommendationRequest + 410, // 859: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:input_type -> api.v1.PreviewPvcStorageRecommendationRequest + 413, // 860: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:input_type -> api.v1.ListWorkloadRuleOOMEventsRequest + 415, // 861: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:input_type -> api.v1.ListWorkloadOOMEventsRequest + 418, // 862: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:input_type -> api.v1.ListWorkloadRuleCPUThrottleEventsRequest + 420, // 863: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:input_type -> api.v1.ListWorkloadCPUThrottleEventsRequest + 107, // 864: api.v1.K8sRecommendationService.RemoveClusterOptimizations:input_type -> api.v1.RemoveClusterOptimizationsRequest + 425, // 865: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:input_type -> api.v1.CreateWorkloadOptimizationPolicyRequest + 427, // 866: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:input_type -> api.v1.ListWorkloadOptimizationPoliciesRequest + 429, // 867: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:input_type -> api.v1.GetWorkloadOptimizationPolicyRequest + 431, // 868: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload:input_type -> api.v1.GetWorkloadOptimizationPolicyByWorkloadRequest + 433, // 869: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:input_type -> api.v1.UpdateWorkloadOptimizationPolicyRequest + 434, // 870: api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled:input_type -> api.v1.ToggleWorkloadOptimizationPolicyDisabledRequest + 437, // 871: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:input_type -> api.v1.DeleteWorkloadOptimizationPolicyRequest + 439, // 872: api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches:input_type -> api.v1.PreviewWorkloadOptimizationPolicyMatchesRequest + 444, // 873: api.v1.K8sRecommendationService.CreateSchedulerPolicy:input_type -> api.v1.CreateSchedulerPolicyRequest + 446, // 874: api.v1.K8sRecommendationService.ListSchedulerPolicies:input_type -> api.v1.ListSchedulerPoliciesRequest + 448, // 875: api.v1.K8sRecommendationService.UpdateSchedulerPolicy:input_type -> api.v1.UpdateSchedulerPolicyRequest + 450, // 876: api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled:input_type -> api.v1.ToggleSchedulerPolicyDisabledRequest + 452, // 877: api.v1.K8sRecommendationService.DeleteSchedulerPolicy:input_type -> api.v1.DeleteSchedulerPolicyRequest + 454, // 878: api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets:input_type -> api.v1.PreviewSchedulerPolicyTargetsRequest + 457, // 879: api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments:input_type -> api.v1.ListSchedulerPolicyEnrollmentsRequest + 486, // 880: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:input_type -> api.v1.UpsertManualWorkloadRuleRequest + 488, // 881: api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled:input_type -> api.v1.ToggleWorkloadRuleDisabledRequest + 490, // 882: api.v1.K8sRecommendationService.PreviewWorkloadRule:input_type -> api.v1.PreviewWorkloadRuleRequest + 465, // 883: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:input_type -> api.v1.GetWorkloadRulesByPolicyRequest + 467, // 884: api.v1.K8sRecommendationService.ListWorkloadRules:input_type -> api.v1.ListWorkloadRulesRequest + 469, // 885: api.v1.K8sRecommendationService.GetWorkloadRuleByID:input_type -> api.v1.GetWorkloadRuleByIDRequest + 471, // 886: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:input_type -> api.v1.GetWorkloadRuleByWorkloadRequest + 473, // 887: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:input_type -> api.v1.GetWorkloadByWorkloadRuleRequest + 475, // 888: api.v1.K8sRecommendationService.DeleteWorkloadRule:input_type -> api.v1.DeleteWorkloadRuleRequest + 477, // 889: api.v1.K8sRecommendationService.DeleteAllWorkloadRules:input_type -> api.v1.DeleteAllWorkloadRulesRequest + 479, // 890: api.v1.K8sRecommendationService.BulkDeleteWorkloadRules:input_type -> api.v1.BulkDeleteWorkloadRulesRequest + 481, // 891: api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled:input_type -> api.v1.BulkToggleWorkloadRulesDisabledRequest + 492, // 892: api.v1.K8sRecommendationService.GetWorkloadContainerNames:input_type -> api.v1.GetWorkloadContainerNamesRequest + 495, // 893: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:input_type -> api.v1.BatchAutoOptimizeWorkloadsRequest + 499, // 894: api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules:input_type -> api.v1.BatchUpsertManualWorkloadRulesRequest + 502, // 895: api.v1.K8sRecommendationService.BatchPreviewWorkloadRules:input_type -> api.v1.BatchPreviewWorkloadRulesRequest + 505, // 896: api.v1.K8sRecommendationService.ApplyOneTimeOptimization:input_type -> api.v1.ApplyOneTimeOptimizationRequest + 483, // 897: api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation:input_type -> api.v1.DeleteRuleAndApplyRecommendationRequest + 510, // 898: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:input_type -> api.v1.GetNodeRecommendationStatusRequest + 536, // 899: api.v1.K8sRecommendationService.CreateSnapshotPolicies:input_type -> api.v1.CreateSnapshotPoliciesRequest + 538, // 900: api.v1.K8sRecommendationService.ListSnapshotPolicies:input_type -> api.v1.ListSnapshotPoliciesRequest + 540, // 901: api.v1.K8sRecommendationService.UpdateSnapshotPolicy:input_type -> api.v1.UpdateSnapshotPolicyRequest + 542, // 902: api.v1.K8sRecommendationService.DeleteSnapshotPolicy:input_type -> api.v1.DeleteSnapshotPolicyRequest + 544, // 903: api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets:input_type -> api.v1.CreateSnapshotPolicyTargetsRequest + 546, // 904: api.v1.K8sRecommendationService.ListSnapshotPolicyTargets:input_type -> api.v1.ListSnapshotPolicyTargetsRequest + 548, // 905: api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget:input_type -> api.v1.UpdateSnapshotPolicyTargetRequest + 550, // 906: api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget:input_type -> api.v1.DeleteSnapshotPolicyTargetRequest + 552, // 907: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies:input_type -> api.v1.CreateForensicSnapshotPoliciesRequest + 554, // 908: api.v1.K8sRecommendationService.ListForensicSnapshotPolicies:input_type -> api.v1.ListForensicSnapshotPoliciesRequest + 556, // 909: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy:input_type -> api.v1.UpdateForensicSnapshotPolicyRequest + 558, // 910: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy:input_type -> api.v1.DeleteForensicSnapshotPolicyRequest + 560, // 911: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets:input_type -> api.v1.CreateForensicSnapshotPolicyTargetsRequest + 562, // 912: api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets:input_type -> api.v1.ListForensicSnapshotPolicyTargetsRequest + 564, // 913: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget:input_type -> api.v1.UpdateForensicSnapshotPolicyTargetRequest + 566, // 914: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget:input_type -> api.v1.DeleteForensicSnapshotPolicyTargetRequest + 568, // 915: api.v1.K8sRecommendationService.TriggerForensicSnapshotRun:input_type -> api.v1.TriggerForensicSnapshotRunRequest + 593, // 916: api.v1.K8sRecommendationService.ListReferencedAuthentications:input_type -> api.v1.ListReferencedAuthenticationsRequest + 573, // 917: api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches:input_type -> api.v1.PreviewSnapshotPolicyTargetMatchesRequest + 576, // 918: api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches:input_type -> api.v1.PreviewForensicSnapshotPolicyTargetMatchesRequest + 579, // 919: api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope:input_type -> api.v1.GetSnapshotPolicyTargetRenderedScopeRequest + 581, // 920: api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope:input_type -> api.v1.GetForensicSnapshotPolicyTargetRenderedScopeRequest + 585, // 921: api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus:input_type -> api.v1.GetSnapshotRecommendationStatusRequest + 587, // 922: api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus:input_type -> api.v1.GetForensicSnapshotRecommendationStatusRequest + 589, // 923: api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig:input_type -> api.v1.PreviewSnapshotRecommendationConfigRequest + 591, // 924: api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig:input_type -> api.v1.PreviewForensicSnapshotRecommendationConfigRequest + 40, // 925: api.v1.K8sRecommendationService.GetNodeGroupStats:output_type -> api.v1.GetNodeGroupStatsResponse + 44, // 926: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:output_type -> api.v1.GetLatestNodeGroupRecommendationResponse + 46, // 927: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:output_type -> api.v1.GetLatestWorkloadRecommendationResponse + 48, // 928: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:output_type -> api.v1.GetPreviewWorkloadRecommendationResponse + 51, // 929: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:output_type -> api.v1.GetPreviewWorkloadRecommendationsResponse + 38, // 930: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:output_type -> api.v1.GetRecommendationsForWorkloadResponse + 36, // 931: api.v1.K8sRecommendationService.GetRecommendations:output_type -> api.v1.GetRecommendationsResponse + 68, // 932: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:output_type -> api.v1.CreateNodeGroupRecommendationPolicyResponse + 70, // 933: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:output_type -> api.v1.GetNodeGroupRecommendationPolicyResponse + 72, // 934: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:output_type -> api.v1.ListNodeGroupRecommendationPoliciesResponse + 74, // 935: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:output_type -> api.v1.UpdateNodeGroupRecommendationPolicyResponse + 76, // 936: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:output_type -> api.v1.DeleteNodeGroupRecommendationPolicyResponse + 78, // 937: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:output_type -> api.v1.AttachNodeGroupRecommendationPolicyResponse + 80, // 938: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:output_type -> api.v1.CreateWorkloadRecommendationPolicyResponse + 82, // 939: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:output_type -> api.v1.GetWorkloadRecommendationPolicyResponse + 198, // 940: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:output_type -> api.v1.GetPolicyRecommendedDefaultsResponse + 84, // 941: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:output_type -> api.v1.ListWorkloadRecommendationPoliciesResponse + 86, // 942: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:output_type -> api.v1.UpdateWorkloadRecommendationPolicyResponse + 88, // 943: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:output_type -> api.v1.DeleteWorkloadRecommendationPolicyResponse + 90, // 944: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:output_type -> api.v1.AttachWorkloadRecommendationPolicyResponse + 92, // 945: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:output_type -> api.v1.AttachWorkloadRecommendationPoliciesResponse + 96, // 946: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:output_type -> api.v1.CreateWorkloadPolicyTargetResponse + 98, // 947: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:output_type -> api.v1.GetWorkloadPolicyTargetResponse + 100, // 948: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:output_type -> api.v1.ListWorkloadPolicyTargetsResponse + 102, // 949: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:output_type -> api.v1.UpdateWorkloadPolicyTargetResponse + 106, // 950: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:output_type -> api.v1.DeleteWorkloadPolicyTargetResponse + 105, // 951: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:output_type -> api.v1.ToggleWorkloadPolicyTargetsResponse + 110, // 952: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:output_type -> api.v1.PreviewWorkloadPolicyTargetMatchesResponse + 113, // 953: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:output_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse + 65, // 954: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:output_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse + 117, // 955: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:output_type -> api.v1.CreateNodeGroupPolicyTargetResponse + 119, // 956: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:output_type -> api.v1.GetNodeGroupPolicyTargetResponse + 121, // 957: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:output_type -> api.v1.ListNodeGroupPolicyTargetsResponse + 123, // 958: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:output_type -> api.v1.UpdateNodeGroupPolicyTargetResponse + 127, // 959: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:output_type -> api.v1.DeleteNodeGroupPolicyTargetResponse + 126, // 960: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:output_type -> api.v1.ToggleNodeGroupPolicyTargetsResponse + 129, // 961: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:output_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesResponse + 131, // 962: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:output_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse + 133, // 963: api.v1.K8sRecommendationService.BalanceGetRecommendations:output_type -> api.v1.BalanceGetRecommendationsResponse + 42, // 964: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:output_type -> api.v1.GetOptimalInstanceTypeForNodeGroupResponse + 217, // 965: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:output_type -> api.v1.GetAttachedNodeGroupPoliciesResponse + 219, // 966: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:output_type -> api.v1.GetAttachedWorkloadPoliciesResponse + 306, // 967: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:output_type -> api.v1.SearchResourcesByTargetingFiltersResponse + 305, // 968: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:output_type -> api.v1.GetAvailableKindsByTargetingFiltersResponse + 225, // 969: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:output_type -> api.v1.ListAttachedWorkloadPoliciesResponse + 227, // 970: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:output_type -> api.v1.ListAttachedNodeGroupPoliciesResponse + 234, // 971: api.v1.K8sRecommendationService.RecommendationEvents:output_type -> api.v1.RecommendationEventsResponse + 232, // 972: api.v1.K8sRecommendationService.ApplyRecommendation:output_type -> api.v1.ApplyRecommendationResponse + 230, // 973: api.v1.K8sRecommendationService.RecommendationApplied:output_type -> api.v1.RecommendationAppliedResponse + 236, // 974: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:output_type -> api.v1.RetrieveSavingsForWorkloadResponse + 238, // 975: api.v1.K8sRecommendationService.CreateNodePolicies:output_type -> api.v1.CreateNodePoliciesResponse + 276, // 976: api.v1.K8sRecommendationService.ListNodePolicies:output_type -> api.v1.ListNodePoliciesResponse + 278, // 977: api.v1.K8sRecommendationService.UpdateNodePolicy:output_type -> api.v1.UpdateNodePolicyResponse + 285, // 978: api.v1.K8sRecommendationService.DeleteNodePolicy:output_type -> api.v1.DeleteNodePolicyResponse + 240, // 979: api.v1.K8sRecommendationService.SuggestedNodePolicy:output_type -> api.v1.SuggestedNodePolicyResponse + 291, // 980: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:output_type -> api.v1.SuggestedKarpenterConfigResponse + 293, // 981: api.v1.K8sRecommendationService.SuggestNodePolicyImprovements:output_type -> api.v1.SuggestNodePolicyImprovementsResponse + 295, // 982: api.v1.K8sRecommendationService.ListClusterNodePolicySuggestions:output_type -> api.v1.ListClusterNodePolicySuggestionsResponse + 242, // 983: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:output_type -> api.v1.GenerateNodePoliciesFromKarpenterResponse + 244, // 984: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:output_type -> api.v1.GenerateNodePoliciesFromNodeGroupsResponse + 281, // 985: api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus:output_type -> api.v1.GetNodeGroupsCheckpointStatusResponse + 283, // 986: api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel:output_type -> api.v1.SetNodePolicyCheckpointLabelResponse + 513, // 987: api.v1.K8sRecommendationService.EnableCheckpointForPolicy:output_type -> api.v1.EnableCheckpointForPolicyResponse + 515, // 988: api.v1.K8sRecommendationService.GetCheckpointApplyStatus:output_type -> api.v1.GetCheckpointApplyStatusResponse + 519, // 989: api.v1.K8sRecommendationService.GetClusterCheckpointLabelCoverage:output_type -> api.v1.GetClusterCheckpointLabelCoverageResponse + 522, // 990: api.v1.K8sRecommendationService.ListNodeGroupCheckpointLabelState:output_type -> api.v1.ListNodeGroupCheckpointLabelStateResponse + 247, // 991: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:output_type -> api.v1.GetNodeAnnotationReadinessResponse + 249, // 992: api.v1.K8sRecommendationService.DetectClusterAutoscaler:output_type -> api.v1.DetectClusterAutoscalerResponse + 251, // 993: api.v1.K8sRecommendationService.GetMigrationState:output_type -> api.v1.GetMigrationStateResponse + 253, // 994: api.v1.K8sRecommendationService.UpdateMigrationState:output_type -> api.v1.UpdateMigrationStateResponse + 255, // 995: api.v1.K8sRecommendationService.GetKarpenterMigrationState:output_type -> api.v1.GetKarpenterMigrationStateResponse + 257, // 996: api.v1.K8sRecommendationService.UpdateKarpenterMigrationState:output_type -> api.v1.UpdateKarpenterMigrationStateResponse + 260, // 997: api.v1.K8sRecommendationService.DetectKarpenterOwnershipConflicts:output_type -> api.v1.DetectKarpenterOwnershipConflictsResponse + 262, // 998: api.v1.K8sRecommendationService.AcknowledgeKarpenterOwnershipConflict:output_type -> api.v1.AcknowledgeKarpenterOwnershipConflictResponse + 265, // 999: api.v1.K8sRecommendationService.GetKarpenterSourceResources:output_type -> api.v1.GetKarpenterSourceResourcesResponse + 268, // 1000: api.v1.K8sRecommendationService.GetKarpenterAdoptionStatus:output_type -> api.v1.GetKarpenterAdoptionStatusResponse + 270, // 1001: api.v1.K8sRecommendationService.ReportNodePoolValidation:output_type -> api.v1.ReportNodePoolValidationResponse + 273, // 1002: api.v1.K8sRecommendationService.GetNodePoolValidations:output_type -> api.v1.GetNodePoolValidationsResponse + 312, // 1003: api.v1.K8sRecommendationService.CreateNodePolicyTargets:output_type -> api.v1.CreateNodePolicyTargetsResponse + 314, // 1004: api.v1.K8sRecommendationService.ListNodePolicyTargets:output_type -> api.v1.ListNodePolicyTargetsResponse + 316, // 1005: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:output_type -> api.v1.UpdateNodePolicyTargetResponse + 288, // 1006: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:output_type -> api.v1.PreviewNodeRecommendationConfigResponse + 327, // 1007: api.v1.K8sRecommendationService.GetInstanceFamilies:output_type -> api.v1.GetInstanceFamiliesResponse + 329, // 1008: api.v1.K8sRecommendationService.GetInstanceSizes:output_type -> api.v1.GetInstanceSizesResponse + 339, // 1009: api.v1.K8sRecommendationService.GetInstanceCategories:output_type -> api.v1.GetInstanceCategoriesResponse + 331, // 1010: api.v1.K8sRecommendationService.GetInstanceShapes:output_type -> api.v1.GetInstanceShapesResponse + 341, // 1011: api.v1.K8sRecommendationService.GetInstanceCPUs:output_type -> api.v1.GetInstanceCPUsResponse + 343, // 1012: api.v1.K8sRecommendationService.GetInstanceTypeNames:output_type -> api.v1.GetInstanceTypeNamesResponse + 161, // 1013: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:output_type -> api.v1.GeneratePodDisruptionBudgetResponse + 163, // 1014: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:output_type -> api.v1.GenerateAndCreatePodDisruptionBudgetResponse + 165, // 1015: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:output_type -> api.v1.CreatePodDisruptionBudgetResponse + 167, // 1016: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:output_type -> api.v1.GetPDBRecommendationForWorkloadResponse + 171, // 1017: api.v1.K8sRecommendationService.ListWorkloadStructuralHealth:output_type -> api.v1.ListWorkloadStructuralHealthResponse + 385, // 1018: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:output_type -> api.v1.CreateStorageRecommendationPolicyResponse + 387, // 1019: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:output_type -> api.v1.GetStorageRecommendationPolicyResponse + 389, // 1020: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:output_type -> api.v1.ListStorageRecommendationPoliciesResponse + 391, // 1021: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:output_type -> api.v1.UpdateStorageRecommendationPolicyResponse + 393, // 1022: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:output_type -> api.v1.DeleteStorageRecommendationPolicyResponse + 396, // 1023: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:output_type -> api.v1.CreateStoragePolicyTargetResponse + 398, // 1024: api.v1.K8sRecommendationService.ListStoragePolicyTargets:output_type -> api.v1.ListStoragePolicyTargetsResponse + 400, // 1025: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:output_type -> api.v1.UpdateStoragePolicyTargetResponse + 402, // 1026: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:output_type -> api.v1.DeleteStoragePolicyTargetResponse + 405, // 1027: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:output_type -> api.v1.GetPvcStorageRecommendationResponse + 407, // 1028: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:output_type -> api.v1.ListPvcStorageRecommendationsResponse + 409, // 1029: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:output_type -> api.v1.GeneratePvcStorageRecommendationResponse + 411, // 1030: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:output_type -> api.v1.PreviewPvcStorageRecommendationResponse + 414, // 1031: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:output_type -> api.v1.ListWorkloadRuleOOMEventsResponse + 416, // 1032: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:output_type -> api.v1.ListWorkloadOOMEventsResponse + 419, // 1033: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:output_type -> api.v1.ListWorkloadRuleCPUThrottleEventsResponse + 421, // 1034: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:output_type -> api.v1.ListWorkloadCPUThrottleEventsResponse + 108, // 1035: api.v1.K8sRecommendationService.RemoveClusterOptimizations:output_type -> api.v1.RemoveClusterOptimizationsResponse + 426, // 1036: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:output_type -> api.v1.CreateWorkloadOptimizationPolicyResponse + 428, // 1037: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:output_type -> api.v1.ListWorkloadOptimizationPoliciesResponse + 430, // 1038: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:output_type -> api.v1.GetWorkloadOptimizationPolicyResponse + 432, // 1039: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicyByWorkload:output_type -> api.v1.GetWorkloadOptimizationPolicyByWorkloadResponse + 436, // 1040: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:output_type -> api.v1.UpdateWorkloadOptimizationPolicyResponse + 435, // 1041: api.v1.K8sRecommendationService.ToggleWorkloadOptimizationPolicyDisabled:output_type -> api.v1.ToggleWorkloadOptimizationPolicyDisabledResponse + 438, // 1042: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:output_type -> api.v1.DeleteWorkloadOptimizationPolicyResponse + 441, // 1043: api.v1.K8sRecommendationService.PreviewWorkloadOptimizationPolicyMatches:output_type -> api.v1.PreviewWorkloadOptimizationPolicyMatchesResponse + 445, // 1044: api.v1.K8sRecommendationService.CreateSchedulerPolicy:output_type -> api.v1.CreateSchedulerPolicyResponse + 447, // 1045: api.v1.K8sRecommendationService.ListSchedulerPolicies:output_type -> api.v1.ListSchedulerPoliciesResponse + 449, // 1046: api.v1.K8sRecommendationService.UpdateSchedulerPolicy:output_type -> api.v1.UpdateSchedulerPolicyResponse + 451, // 1047: api.v1.K8sRecommendationService.ToggleSchedulerPolicyDisabled:output_type -> api.v1.ToggleSchedulerPolicyDisabledResponse + 453, // 1048: api.v1.K8sRecommendationService.DeleteSchedulerPolicy:output_type -> api.v1.DeleteSchedulerPolicyResponse + 456, // 1049: api.v1.K8sRecommendationService.PreviewSchedulerPolicyTargets:output_type -> api.v1.PreviewSchedulerPolicyTargetsResponse + 459, // 1050: api.v1.K8sRecommendationService.ListSchedulerPolicyEnrollments:output_type -> api.v1.ListSchedulerPolicyEnrollmentsResponse + 487, // 1051: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:output_type -> api.v1.UpsertManualWorkloadRuleResponse + 489, // 1052: api.v1.K8sRecommendationService.ToggleWorkloadRuleDisabled:output_type -> api.v1.ToggleWorkloadRuleDisabledResponse + 491, // 1053: api.v1.K8sRecommendationService.PreviewWorkloadRule:output_type -> api.v1.PreviewWorkloadRuleResponse + 466, // 1054: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:output_type -> api.v1.GetWorkloadRulesByPolicyResponse + 468, // 1055: api.v1.K8sRecommendationService.ListWorkloadRules:output_type -> api.v1.ListWorkloadRulesResponse + 470, // 1056: api.v1.K8sRecommendationService.GetWorkloadRuleByID:output_type -> api.v1.GetWorkloadRuleByIDResponse + 472, // 1057: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:output_type -> api.v1.GetWorkloadRuleByWorkloadResponse + 474, // 1058: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:output_type -> api.v1.GetWorkloadByWorkloadRuleResponse + 476, // 1059: api.v1.K8sRecommendationService.DeleteWorkloadRule:output_type -> api.v1.DeleteWorkloadRuleResponse + 478, // 1060: api.v1.K8sRecommendationService.DeleteAllWorkloadRules:output_type -> api.v1.DeleteAllWorkloadRulesResponse + 480, // 1061: api.v1.K8sRecommendationService.BulkDeleteWorkloadRules:output_type -> api.v1.BulkDeleteWorkloadRulesResponse + 482, // 1062: api.v1.K8sRecommendationService.BulkToggleWorkloadRulesDisabled:output_type -> api.v1.BulkToggleWorkloadRulesDisabledResponse + 493, // 1063: api.v1.K8sRecommendationService.GetWorkloadContainerNames:output_type -> api.v1.GetWorkloadContainerNamesResponse + 497, // 1064: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:output_type -> api.v1.BatchAutoOptimizeWorkloadsResponse + 501, // 1065: api.v1.K8sRecommendationService.BatchUpsertManualWorkloadRules:output_type -> api.v1.BatchUpsertManualWorkloadRulesResponse + 504, // 1066: api.v1.K8sRecommendationService.BatchPreviewWorkloadRules:output_type -> api.v1.BatchPreviewWorkloadRulesResponse + 506, // 1067: api.v1.K8sRecommendationService.ApplyOneTimeOptimization:output_type -> api.v1.ApplyOneTimeOptimizationResponse + 484, // 1068: api.v1.K8sRecommendationService.DeleteRuleAndApplyRecommendation:output_type -> api.v1.DeleteRuleAndApplyRecommendationResponse + 511, // 1069: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:output_type -> api.v1.GetNodeRecommendationStatusResponse + 537, // 1070: api.v1.K8sRecommendationService.CreateSnapshotPolicies:output_type -> api.v1.CreateSnapshotPoliciesResponse + 539, // 1071: api.v1.K8sRecommendationService.ListSnapshotPolicies:output_type -> api.v1.ListSnapshotPoliciesResponse + 541, // 1072: api.v1.K8sRecommendationService.UpdateSnapshotPolicy:output_type -> api.v1.UpdateSnapshotPolicyResponse + 543, // 1073: api.v1.K8sRecommendationService.DeleteSnapshotPolicy:output_type -> api.v1.DeleteSnapshotPolicyResponse + 545, // 1074: api.v1.K8sRecommendationService.CreateSnapshotPolicyTargets:output_type -> api.v1.CreateSnapshotPolicyTargetsResponse + 547, // 1075: api.v1.K8sRecommendationService.ListSnapshotPolicyTargets:output_type -> api.v1.ListSnapshotPolicyTargetsResponse + 549, // 1076: api.v1.K8sRecommendationService.UpdateSnapshotPolicyTarget:output_type -> api.v1.UpdateSnapshotPolicyTargetResponse + 551, // 1077: api.v1.K8sRecommendationService.DeleteSnapshotPolicyTarget:output_type -> api.v1.DeleteSnapshotPolicyTargetResponse + 553, // 1078: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicies:output_type -> api.v1.CreateForensicSnapshotPoliciesResponse + 555, // 1079: api.v1.K8sRecommendationService.ListForensicSnapshotPolicies:output_type -> api.v1.ListForensicSnapshotPoliciesResponse + 557, // 1080: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicy:output_type -> api.v1.UpdateForensicSnapshotPolicyResponse + 559, // 1081: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicy:output_type -> api.v1.DeleteForensicSnapshotPolicyResponse + 561, // 1082: api.v1.K8sRecommendationService.CreateForensicSnapshotPolicyTargets:output_type -> api.v1.CreateForensicSnapshotPolicyTargetsResponse + 563, // 1083: api.v1.K8sRecommendationService.ListForensicSnapshotPolicyTargets:output_type -> api.v1.ListForensicSnapshotPolicyTargetsResponse + 565, // 1084: api.v1.K8sRecommendationService.UpdateForensicSnapshotPolicyTarget:output_type -> api.v1.UpdateForensicSnapshotPolicyTargetResponse + 567, // 1085: api.v1.K8sRecommendationService.DeleteForensicSnapshotPolicyTarget:output_type -> api.v1.DeleteForensicSnapshotPolicyTargetResponse + 569, // 1086: api.v1.K8sRecommendationService.TriggerForensicSnapshotRun:output_type -> api.v1.TriggerForensicSnapshotRunResponse + 595, // 1087: api.v1.K8sRecommendationService.ListReferencedAuthentications:output_type -> api.v1.ListReferencedAuthenticationsResponse + 574, // 1088: api.v1.K8sRecommendationService.PreviewSnapshotPolicyTargetMatches:output_type -> api.v1.PreviewSnapshotPolicyTargetMatchesResponse + 577, // 1089: api.v1.K8sRecommendationService.PreviewForensicSnapshotPolicyTargetMatches:output_type -> api.v1.PreviewForensicSnapshotPolicyTargetMatchesResponse + 580, // 1090: api.v1.K8sRecommendationService.GetSnapshotPolicyTargetRenderedScope:output_type -> api.v1.GetSnapshotPolicyTargetRenderedScopeResponse + 582, // 1091: api.v1.K8sRecommendationService.GetForensicSnapshotPolicyTargetRenderedScope:output_type -> api.v1.GetForensicSnapshotPolicyTargetRenderedScopeResponse + 586, // 1092: api.v1.K8sRecommendationService.GetSnapshotRecommendationStatus:output_type -> api.v1.GetSnapshotRecommendationStatusResponse + 588, // 1093: api.v1.K8sRecommendationService.GetForensicSnapshotRecommendationStatus:output_type -> api.v1.GetForensicSnapshotRecommendationStatusResponse + 590, // 1094: api.v1.K8sRecommendationService.PreviewSnapshotRecommendationConfig:output_type -> api.v1.PreviewSnapshotRecommendationConfigResponse + 592, // 1095: api.v1.K8sRecommendationService.PreviewForensicSnapshotRecommendationConfig:output_type -> api.v1.PreviewForensicSnapshotRecommendationConfigResponse + 925, // [925:1096] is the sub-list for method output_type + 754, // [754:925] is the sub-list for method input_type + 754, // [754:754] is the sub-list for extension type_name + 754, // [754:754] is the sub-list for extension extendee + 0, // [0:754] is the sub-list for field type_name } func init() { file_api_v1_recommendation_proto_init() } @@ -37000,6 +57276,7 @@ func file_api_v1_recommendation_proto_init() { file_api_v1_common_proto_init() file_api_v1_instance_proto_init() file_api_v1_k8s_proto_init() + file_api_v1_hpa_connector_proto_init() file_api_v1_profiling_proto_init() if !protoimpl.UnsafeEnabled { file_api_v1_recommendation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { @@ -37014,8 +57291,1904 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRecommendationsForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupStatsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupStatsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOptimalInstanceTypeForNodeGroupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOptimalInstanceTypeForNodeGroupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestNodeGroupRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestNodeGroupRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestWorkloadRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLatestWorkloadRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadIdentifier); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachClusterRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachClusterRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TargetIdList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachNodeGroupRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachNodeGroupRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AttachWorkloadRecommendationPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyAttachment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveClusterOptimizationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveClusterOptimizationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadPolicyTargetMatchesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadPolicyTargetMatchesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadCollisionInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPercentileSummary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupPolicyTarget); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupPolicyTargetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleNodeGroupPolicyTargetsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleNodeGroupPolicyTargetsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodeGroupPolicyTargetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeGroupPolicyTargetMatchesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeGroupPolicyTargetMatchesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceGetRecommendationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceGetRecommendationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchNodeGroupRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAMetricTrigger); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPAFallback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerResourceConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerResourceRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JVMHeapRuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HPARuleConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EmergencyResponseConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAScaledObjectTemplate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDATrigger); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAAuthenticationRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAFallback); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KEDAAdvanced); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PercentileValues); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourcePercentiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BurstinessRatios); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadClassification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadRules); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchHPAConnectors); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadWithActiveRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericResourceRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchGenericResourceRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPvcStorageRecommendations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateAndCreatePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateAndCreatePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePodDisruptionBudgetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePodDisruptionBudgetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPDBRecommendationForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPDBRecommendationForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StructuralHealthFinding); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadStructuralHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadStructuralHealthRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadStructuralHealthResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReconcileWorkload); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReconcileResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OperatorHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentHealth); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentHealthMeta); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HealthReport); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerSummarizedMetric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KedaScaledObjectRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceRecommendation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvVarMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandArgMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeSelectorMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TolerationMutation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Toleration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterRecommendationPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupRecommendationPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VerticalScalingOptimizationTarget); i { case 0: return &v.state case 1: @@ -37026,8 +59199,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HorizontalScalingOptimizationTarget); i { case 0: return &v.state case 1: @@ -37038,8 +59211,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRecommendationsForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendationPolicy); i { case 0: return &v.state case 1: @@ -37050,8 +59223,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupStatsRequest); i { + file_api_v1_recommendation_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPolicyRecommendedDefaultsRequest); i { case 0: return &v.state case 1: @@ -37062,8 +59235,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupStatsResponse); i { + file_api_v1_recommendation_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPolicyRecommendedDefaultsResponse); i { case 0: return &v.state case 1: @@ -37074,8 +59247,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOptimalInstanceTypeForNodeGroupRequest); i { + file_api_v1_recommendation_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceRegisterRequest); i { case 0: return &v.state case 1: @@ -37086,8 +59259,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOptimalInstanceTypeForNodeGroupResponse); i { + file_api_v1_recommendation_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceFeatures); i { case 0: return &v.state case 1: @@ -37098,8 +59271,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestNodeGroupRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceApplyRecommendationResponse); i { case 0: return &v.state case 1: @@ -37110,8 +59283,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestNodeGroupRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LiveMigrationResult); i { case 0: return &v.state case 1: @@ -37122,8 +59295,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestWorkloadRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupReference); i { case 0: return &v.state case 1: @@ -37134,8 +59307,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestWorkloadRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupRecommendation); i { case 0: return &v.state case 1: @@ -37146,8 +59319,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CostImpact); i { case 0: return &v.state case 1: @@ -37158,8 +59331,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendation); i { case 0: return &v.state case 1: @@ -37170,8 +59343,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDetails); i { case 0: return &v.state case 1: @@ -37182,8 +59355,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadIdentifier); i { + file_api_v1_recommendation_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningEvidence); i { case 0: return &v.state case 1: @@ -37194,8 +59367,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningInsight); i { case 0: return &v.state case 1: @@ -37206,8 +59379,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningResourceEdge); i { case 0: return &v.state case 1: @@ -37218,8 +59391,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningContainerChange); i { case 0: return &v.state case 1: @@ -37230,8 +59403,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningUtilization); i { case 0: return &v.state case 1: @@ -37242,8 +59415,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningHistoricalPattern); i { case 0: return &v.state case 1: @@ -37254,8 +59427,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClusterRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningReplicas); i { case 0: return &v.state case 1: @@ -37266,8 +59439,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListClusterRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDecision); i { case 0: return &v.state case 1: @@ -37278,8 +59451,440 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedNodeGroupPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedNodeGroupPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedWorkloadPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAttachedWorkloadPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendationPolicyGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicyTargetGroup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadIdentifiers); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadPolicies); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedWorkloadPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedWorkloadPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedNodeGroupPoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAttachedNodeGroupPoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupItem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationAppliedRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationAppliedResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyRecommendationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyRecommendationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationEventsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecommendationEventsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveSavingsForWorkloadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveSavingsForWorkloadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePoliciesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePoliciesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedNodePolicyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedNodePolicyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromKarpenterRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromKarpenterResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromNodeGroupsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenerateNodePoliciesFromNodeGroupsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupMigrationEligibility); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeAnnotationReadinessRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeAnnotationReadinessResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_recommendation_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateRequest); i { case 0: return &v.state case 1: @@ -37290,8 +59895,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateResponse); i { case 0: return &v.state case 1: @@ -37302,8 +59907,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -37314,8 +59919,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -37326,8 +59931,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachClusterRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -37338,8 +59943,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachClusterRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -37350,8 +59955,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterOwnershipConflict); i { case 0: return &v.state case 1: @@ -37362,8 +59967,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadsWithAttachedPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsRequest); i { case 0: return &v.state case 1: @@ -37374,8 +59979,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetIdList); i { + file_api_v1_recommendation_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsResponse); i { case 0: return &v.state case 1: @@ -37386,8 +59991,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictRequest); i { case 0: return &v.state case 1: @@ -37398,8 +60003,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictResponse); i { case 0: return &v.state case 1: @@ -37410,8 +60015,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSourceResource); i { case 0: return &v.state case 1: @@ -37422,8 +60027,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesRequest); i { case 0: return &v.state case 1: @@ -37434,8 +60039,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesResponse); i { case 0: return &v.state case 1: @@ -37446,8 +60051,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolAdoptionStatus); i { case 0: return &v.state case 1: @@ -37458,8 +60063,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusRequest); i { case 0: return &v.state case 1: @@ -37470,8 +60075,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusResponse); i { case 0: return &v.state case 1: @@ -37482,8 +60087,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationRequest); i { case 0: return &v.state case 1: @@ -37494,8 +60099,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationResponse); i { case 0: return &v.state case 1: @@ -37506,8 +60111,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachNodeGroupRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsRequest); i { case 0: return &v.state case 1: @@ -37518,8 +60123,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachNodeGroupRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolValidationReport); i { case 0: return &v.state case 1: @@ -37530,8 +60135,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsResponse); i { case 0: return &v.state case 1: @@ -37542,8 +60147,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadCompatibilityWarning); i { case 0: return &v.state case 1: @@ -37554,8 +60159,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesRequest); i { case 0: return &v.state case 1: @@ -37566,8 +60171,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesResponse); i { case 0: return &v.state case 1: @@ -37578,8 +60183,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyRequest); i { case 0: return &v.state case 1: @@ -37590,8 +60195,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyResponse); i { case 0: return &v.state case 1: @@ -37602,8 +60207,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupCheckpointStatus); i { case 0: return &v.state case 1: @@ -37614,8 +60219,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusRequest); i { case 0: return &v.state case 1: @@ -37626,8 +60231,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusResponse); i { case 0: return &v.state case 1: @@ -37638,8 +60243,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelRequest); i { case 0: return &v.state case 1: @@ -37650,8 +60255,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelResponse); i { case 0: return &v.state case 1: @@ -37662,8 +60267,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyRequest); i { case 0: return &v.state case 1: @@ -37674,8 +60279,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyResponse); i { case 0: return &v.state case 1: @@ -37686,8 +60291,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicy); i { case 0: return &v.state case 1: @@ -37698,8 +60303,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyAttachment); i { + file_api_v1_recommendation_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -37710,8 +60315,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -37722,8 +60327,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendationConfig); i { case 0: return &v.state case 1: @@ -37734,8 +60339,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigRequest); i { case 0: return &v.state case 1: @@ -37746,8 +60351,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigResponse); i { case 0: return &v.state case 1: @@ -37758,8 +60363,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsRequest); i { case 0: return &v.state case 1: @@ -37770,8 +60375,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsResponse); i { case 0: return &v.state case 1: @@ -37782,8 +60387,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsRequest); i { case 0: return &v.state case 1: @@ -37794,8 +60399,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsResponse); i { case 0: return &v.state case 1: @@ -37806,8 +60411,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestionsForPolicy); i { case 0: return &v.state case 1: @@ -37818,8 +60423,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestion); i { case 0: return &v.state case 1: @@ -37830,8 +60435,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleWorkloadPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionFieldChange); i { case 0: return &v.state case 1: @@ -37842,8 +60447,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleWorkloadPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionEvidence); i { case 0: return &v.state case 1: @@ -37854,8 +60459,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionWorkloadRef); i { case 0: return &v.state case 1: @@ -37866,8 +60471,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveClusterOptimizationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionContext); i { case 0: return &v.state case 1: @@ -37878,8 +60483,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveClusterOptimizationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -37890,8 +60495,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadPolicyTargetMatchesRequest); i { + file_api_v1_recommendation_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -37902,8 +60507,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadPolicyTargetMatchesResponse); i { + file_api_v1_recommendation_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TargetFilters); i { case 0: return &v.state case 1: @@ -37914,8 +60519,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -37926,8 +60531,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewWorkloadPolicyTargetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -37938,8 +60543,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPercentileSummary); i { + file_api_v1_recommendation_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceSearchResult); i { case 0: return &v.state case 1: @@ -37950,8 +60555,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupPolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadSearchResult); i { case 0: return &v.state case 1: @@ -37962,8 +60567,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupSearchResult); i { case 0: return &v.state case 1: @@ -37974,8 +60579,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LabelSearchResult); i { case 0: return &v.state case 1: @@ -37986,8 +60591,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -37998,8 +60603,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -38010,8 +60615,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -38022,8 +60627,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodeGroupPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -38034,8 +60639,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -38046,8 +60651,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -38058,8 +60663,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupPolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTarget); i { case 0: return &v.state case 1: @@ -38070,8 +60675,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleNodeGroupPolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyCondition); i { case 0: return &v.state case 1: @@ -38082,8 +60687,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleNodeGroupPolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTargetStatus); i { case 0: return &v.state case 1: @@ -38094,8 +60699,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodeGroupPolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ZonalShiftConfig); i { case 0: return &v.state case 1: @@ -38106,8 +60711,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeGroupPolicyTargetMatchesRequest); i { + file_api_v1_recommendation_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Taint); i { case 0: return &v.state case 1: @@ -38118,8 +60723,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeGroupPolicyTargetMatchesResponse); i { + file_api_v1_recommendation_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionBudget); i { case 0: return &v.state case 1: @@ -38130,8 +60735,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionPolicy); i { case 0: return &v.state case 1: @@ -38142,8 +60747,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPreviewNodeGroupPolicyTargetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceLimits); i { case 0: return &v.state case 1: @@ -38154,8 +60759,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceGetRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSNodeClassSpec); i { case 0: return &v.state case 1: @@ -38166,8 +60771,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceGetRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesRequest); i { case 0: return &v.state case 1: @@ -38178,8 +60783,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchNodeGroupRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesResponse); i { case 0: return &v.state case 1: @@ -38190,8 +60795,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesRequest); i { case 0: return &v.state case 1: @@ -38202,8 +60807,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRule); i { + file_api_v1_recommendation_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesResponse); i { case 0: return &v.state case 1: @@ -38214,8 +60819,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceRuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesRequest); i { case 0: return &v.state case 1: @@ -38226,8 +60831,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPAMetricTrigger); i { + file_api_v1_recommendation_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesResponse); i { case 0: return &v.state case 1: @@ -38238,8 +60843,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPAFallback); i { + file_api_v1_recommendation_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceFamily); i { case 0: return &v.state case 1: @@ -38250,8 +60855,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerResourceConfig); i { + file_api_v1_recommendation_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceShape); i { case 0: return &v.state case 1: @@ -38262,8 +60867,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerResourceRuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceSize); i { case 0: return &v.state case 1: @@ -38274,8 +60879,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HPARuleConfig); i { + file_api_v1_recommendation_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCategory); i { case 0: return &v.state case 1: @@ -38286,8 +60891,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EmergencyResponseConfig); i { + file_api_v1_recommendation_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCPU); i { case 0: return &v.state case 1: @@ -38298,8 +60903,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PercentileValues); i { + file_api_v1_recommendation_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceTypeName); i { case 0: return &v.state case 1: @@ -38310,8 +60915,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourcePercentiles); i { + file_api_v1_recommendation_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesRequest); i { case 0: return &v.state case 1: @@ -38322,8 +60927,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BurstinessRatios); i { + file_api_v1_recommendation_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesResponse); i { case 0: return &v.state case 1: @@ -38334,8 +60939,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadClassification); i { + file_api_v1_recommendation_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsRequest); i { case 0: return &v.state case 1: @@ -38346,8 +60951,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadRules); i { + file_api_v1_recommendation_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsResponse); i { case 0: return &v.state case 1: @@ -38358,8 +60963,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadWithActiveRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesRequest); i { case 0: return &v.state case 1: @@ -38370,8 +60975,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenericResourceRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesResponse); i { case 0: return &v.state case 1: @@ -38382,8 +60987,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchGenericResourceRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -38394,8 +60999,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchPvcStorageRecommendations); i { + file_api_v1_recommendation_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -38406,8 +61011,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapacityReservationSelectorTerm); i { case 0: return &v.state case 1: @@ -38418,8 +61023,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMISelectorTerm); i { case 0: return &v.state case 1: @@ -38430,8 +61035,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateAndCreatePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeletConfiguration); i { case 0: return &v.state case 1: @@ -38442,8 +61047,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateAndCreatePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDeviceMapping); i { case 0: return &v.state case 1: @@ -38454,8 +61059,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePodDisruptionBudgetRequest); i { + file_api_v1_recommendation_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDevice); i { case 0: return &v.state case 1: @@ -38466,8 +61071,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePodDisruptionBudgetResponse); i { + file_api_v1_recommendation_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetadataOptions); i { case 0: return &v.state case 1: @@ -38478,8 +61083,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPDBRecommendationForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPNodeClassSpec); i { case 0: return &v.state case 1: @@ -38490,8 +61095,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPDBRecommendationForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPImageSelectorTerm); i { case 0: return &v.state case 1: @@ -38502,8 +61107,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReconcileWorkload); i { + file_api_v1_recommendation_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPDisk); i { case 0: return &v.state case 1: @@ -38514,8 +61119,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReconcileResponse); i { + file_api_v1_recommendation_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureNodeClassSpec); i { case 0: return &v.state case 1: @@ -38526,8 +61131,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OperatorHealth); i { + file_api_v1_recommendation_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureKubeletConfiguration); i { case 0: return &v.state case 1: @@ -38538,8 +61143,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentHealth); i { + file_api_v1_recommendation_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIImageSelectorTerm); i { case 0: return &v.state case 1: @@ -38550,8 +61155,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentHealthMeta); i { + file_api_v1_recommendation_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -38562,8 +61167,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthReport); i { + file_api_v1_recommendation_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -38574,8 +61179,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeStats); i { + file_api_v1_recommendation_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIBootConfig); i { case 0: return &v.state case 1: @@ -38586,8 +61191,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeMetric); i { + file_api_v1_recommendation_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCILaunchOptions); i { case 0: return &v.state case 1: @@ -38598,8 +61203,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerStats); i { + file_api_v1_recommendation_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIVolumeAttributes); i { case 0: return &v.state case 1: @@ -38610,8 +61215,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerMetric); i { + file_api_v1_recommendation_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClassSpec); i { case 0: return &v.state case 1: @@ -38622,8 +61227,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerSummarizedMetric); i { + file_api_v1_recommendation_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSettingsRecommendation); i { case 0: return &v.state case 1: @@ -38634,8 +61239,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metric); i { + file_api_v1_recommendation_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawKarpenterSpec); i { case 0: return &v.state case 1: @@ -38646,8 +61251,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRecommendation); i { case 0: return &v.state case 1: @@ -38658,8 +61263,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KedaScaledObjectRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotRecommendation); i { case 0: return &v.state case 1: @@ -38670,8 +61275,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatusReport); i { case 0: return &v.state case 1: @@ -38682,8 +61287,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Toleration); i { + file_api_v1_recommendation_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatus); i { case 0: return &v.state case 1: @@ -38694,8 +61299,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClusterRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRRuntimeStatus); i { case 0: return &v.state case 1: @@ -38706,8 +61311,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicyTargetStatus); i { case 0: return &v.state case 1: @@ -38718,8 +61323,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VerticalScalingOptimizationTarget); i { + file_api_v1_recommendation_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPrereqs); i { case 0: return &v.state case 1: @@ -38730,8 +61335,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HorizontalScalingOptimizationTarget); i { + file_api_v1_recommendation_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendation); i { case 0: return &v.state case 1: @@ -38742,8 +61347,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSKarpenterSpec); i { case 0: return &v.state case 1: @@ -38754,8 +61359,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPolicyRecommendedDefaultsRequest); i { + file_api_v1_recommendation_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSKarpenterSpec); i { case 0: return &v.state case 1: @@ -38766,8 +61371,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPolicyRecommendedDefaultsResponse); i { + file_api_v1_recommendation_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePool); i { case 0: return &v.state case 1: @@ -38778,8 +61383,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceRegisterRequest); i { + file_api_v1_recommendation_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EC2NodeClass); i { case 0: return &v.state case 1: @@ -38790,8 +61395,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceFeatures); i { + file_api_v1_recommendation_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSNodeClass); i { case 0: return &v.state case 1: @@ -38802,8 +61407,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BalanceApplyRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPKarpenterSpec); i { case 0: return &v.state case 1: @@ -38814,8 +61419,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiveMigrationResult); i { + file_api_v1_recommendation_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCENodeClass); i { case 0: return &v.state case 1: @@ -38826,8 +61431,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupReference); i { + file_api_v1_recommendation_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIKarpenterSpec); i { case 0: return &v.state case 1: @@ -38838,8 +61443,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClass); i { case 0: return &v.state case 1: @@ -38850,8 +61455,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CostImpact); i { + file_api_v1_recommendation_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageRecommendationPolicy); i { case 0: return &v.state case 1: @@ -38862,8 +61467,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -38874,8 +61479,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedNodeGroupPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -38886,8 +61491,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedNodeGroupPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -38898,8 +61503,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedWorkloadPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -38910,8 +61515,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAttachedWorkloadPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesRequest); i { case 0: return &v.state case 1: @@ -38922,8 +61527,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRecommendationPolicyGroup); i { + file_api_v1_recommendation_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesResponse); i { case 0: return &v.state case 1: @@ -38934,8 +61539,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicyTargetGroup); i { + file_api_v1_recommendation_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -38946,8 +61551,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadIdentifiers); i { + file_api_v1_recommendation_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -38958,8 +61563,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadPolicies); i { + file_api_v1_recommendation_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -38970,8 +61575,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedWorkloadPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -38982,8 +61587,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedWorkloadPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StoragePolicyTarget); i { case 0: return &v.state case 1: @@ -38994,8 +61599,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedNodeGroupPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39006,8 +61611,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAttachedNodeGroupPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39018,8 +61623,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupItem); i { + file_api_v1_recommendation_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39030,8 +61635,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationAppliedRequest); i { + file_api_v1_recommendation_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39042,8 +61647,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationAppliedResponse); i { + file_api_v1_recommendation_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39054,8 +61659,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39066,8 +61671,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -39078,8 +61683,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -39090,8 +61695,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecommendationEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PvcStorageRecommendation); i { case 0: return &v.state case 1: @@ -39102,8 +61707,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetrieveSavingsForWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[369].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -39114,8 +61719,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RetrieveSavingsForWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[370].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -39126,8 +61731,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[371].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsRequest); i { case 0: return &v.state case 1: @@ -39138,8 +61743,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[372].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsResponse); i { case 0: return &v.state case 1: @@ -39150,8 +61755,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[373].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -39162,8 +61767,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[374].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -39174,8 +61779,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromKarpenterRequest); i { + file_api_v1_recommendation_proto_msgTypes[375].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -39186,8 +61791,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromKarpenterResponse); i { + file_api_v1_recommendation_proto_msgTypes[376].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -39198,8 +61803,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromNodeGroupsRequest); i { + file_api_v1_recommendation_proto_msgTypes[377].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleOOMEvent); i { case 0: return &v.state case 1: @@ -39210,8 +61815,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateNodePoliciesFromNodeGroupsResponse); i { + file_api_v1_recommendation_proto_msgTypes[378].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsRequest); i { case 0: return &v.state case 1: @@ -39222,8 +61827,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupMigrationEligibility); i { + file_api_v1_recommendation_proto_msgTypes[379].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsResponse); i { case 0: return &v.state case 1: @@ -39234,8 +61839,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeAnnotationReadinessRequest); i { + file_api_v1_recommendation_proto_msgTypes[380].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsRequest); i { case 0: return &v.state case 1: @@ -39246,8 +61851,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeAnnotationReadinessResponse); i { + file_api_v1_recommendation_proto_msgTypes[381].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsResponse); i { case 0: return &v.state case 1: @@ -39258,8 +61863,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMigrationStateRequest); i { + file_api_v1_recommendation_proto_msgTypes[382].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleCPUThrottleEvent); i { case 0: return &v.state case 1: @@ -39270,8 +61875,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMigrationStateResponse); i { + file_api_v1_recommendation_proto_msgTypes[383].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -39282,8 +61887,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMigrationStateRequest); i { + file_api_v1_recommendation_proto_msgTypes[384].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -39294,8 +61899,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateMigrationStateResponse); i { + file_api_v1_recommendation_proto_msgTypes[385].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -39306,8 +61911,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportNodePoolValidationRequest); i { + file_api_v1_recommendation_proto_msgTypes[386].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -39318,8 +61923,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportNodePoolValidationResponse); i { + file_api_v1_recommendation_proto_msgTypes[387].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringSetSelector); i { case 0: return &v.state case 1: @@ -39330,8 +61935,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodePoolValidationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[388].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadOptimizationPolicyProto); i { case 0: return &v.state case 1: @@ -39342,8 +61947,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePoolValidationReport); i { + file_api_v1_recommendation_proto_msgTypes[389].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericOptimizationSettings); i { case 0: return &v.state case 1: @@ -39354,8 +61959,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodePoolValidationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[390].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -39366,8 +61971,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadCompatibilityWarning); i { + file_api_v1_recommendation_proto_msgTypes[391].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -39378,8 +61983,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[392].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOptimizationPoliciesRequest); i { case 0: return &v.state case 1: @@ -39390,8 +61995,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[393].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOptimizationPoliciesResponse); i { case 0: return &v.state case 1: @@ -39402,8 +62007,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[394].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -39414,8 +62019,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[395].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -39426,8 +62031,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupCheckpointStatus); i { + file_api_v1_recommendation_proto_msgTypes[396].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyByWorkloadRequest); i { case 0: return &v.state case 1: @@ -39438,8 +62043,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsCheckpointStatusRequest); i { + file_api_v1_recommendation_proto_msgTypes[397].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadOptimizationPolicyByWorkloadResponse); i { case 0: return &v.state case 1: @@ -39450,8 +62055,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeGroupsCheckpointStatusResponse); i { + file_api_v1_recommendation_proto_msgTypes[398].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -39462,8 +62067,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetNodePolicyCheckpointLabelRequest); i { + file_api_v1_recommendation_proto_msgTypes[399].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadOptimizationPolicyDisabledRequest); i { case 0: return &v.state case 1: @@ -39474,8 +62079,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetNodePolicyCheckpointLabelResponse); i { + file_api_v1_recommendation_proto_msgTypes[400].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadOptimizationPolicyDisabledResponse); i { case 0: return &v.state case 1: @@ -39486,8 +62091,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodePolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[401].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -39498,8 +62103,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteNodePolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[402].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadOptimizationPolicyRequest); i { case 0: return &v.state case 1: @@ -39510,8 +62115,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicy); i { + file_api_v1_recommendation_proto_msgTypes[403].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadOptimizationPolicyResponse); i { case 0: return &v.state case 1: @@ -39522,8 +62127,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeRecommendationConfigRequest); i { + file_api_v1_recommendation_proto_msgTypes[404].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadOptimizationPolicyMatchesRequest); i { case 0: return &v.state case 1: @@ -39534,8 +62139,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewNodeRecommendationConfigResponse); i { + file_api_v1_recommendation_proto_msgTypes[405].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadOptimizationPolicyMatch); i { case 0: return &v.state case 1: @@ -39546,8 +62151,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeRecommendationConfig); i { + file_api_v1_recommendation_proto_msgTypes[406].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadOptimizationPolicyMatchesResponse); i { case 0: return &v.state case 1: @@ -39558,8 +62163,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedKarpenterConfigRequest); i { + file_api_v1_recommendation_proto_msgTypes[407].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyTargetProto); i { case 0: return &v.state case 1: @@ -39570,8 +62175,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestedKarpenterConfigResponse); i { + file_api_v1_recommendation_proto_msgTypes[408].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyProto); i { case 0: return &v.state case 1: @@ -39582,8 +62187,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAvailableKindsByTargetingFiltersRequest); i { + file_api_v1_recommendation_proto_msgTypes[409].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -39594,8 +62199,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchResourcesByTargetingFiltersRequest); i { + file_api_v1_recommendation_proto_msgTypes[410].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -39606,8 +62211,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetFilters); i { + file_api_v1_recommendation_proto_msgTypes[411].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPoliciesRequest); i { case 0: return &v.state case 1: @@ -39618,8 +62223,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAvailableKindsByTargetingFiltersResponse); i { + file_api_v1_recommendation_proto_msgTypes[412].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPoliciesResponse); i { case 0: return &v.state case 1: @@ -39630,8 +62235,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchResourcesByTargetingFiltersResponse); i { + file_api_v1_recommendation_proto_msgTypes[413].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -39642,8 +62247,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamespaceSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[414].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -39654,8 +62259,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[415].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleSchedulerPolicyDisabledRequest); i { case 0: return &v.state case 1: @@ -39666,8 +62271,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeGroupSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[416].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleSchedulerPolicyDisabledResponse); i { case 0: return &v.state case 1: @@ -39678,8 +62283,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelSearchResult); i { + file_api_v1_recommendation_proto_msgTypes[417].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSchedulerPolicyRequest); i { case 0: return &v.state case 1: @@ -39690,8 +62295,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[418].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSchedulerPolicyResponse); i { case 0: return &v.state case 1: @@ -39702,8 +62307,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateNodePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[419].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSchedulerPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -39714,8 +62319,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[420].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyTargetMatch); i { case 0: return &v.state case 1: @@ -39726,8 +62331,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListNodePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[421].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSchedulerPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -39738,8 +62343,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[422].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPolicyEnrollmentsRequest); i { case 0: return &v.state case 1: @@ -39750,8 +62355,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateNodePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[423].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicyEnrollment); i { case 0: return &v.state case 1: @@ -39762,8 +62367,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[424].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSchedulerPolicyEnrollmentsResponse); i { case 0: return &v.state case 1: @@ -39774,8 +62379,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyCondition); i { + file_api_v1_recommendation_proto_msgTypes[425].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerPolicySync); i { case 0: return &v.state case 1: @@ -39786,8 +62391,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePolicyTargetStatus); i { + file_api_v1_recommendation_proto_msgTypes[426].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerConfigPayload); i { case 0: return &v.state case 1: @@ -39798,8 +62403,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ZonalShiftConfig); i { + file_api_v1_recommendation_proto_msgTypes[427].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertInstruction); i { case 0: return &v.state case 1: @@ -39810,8 +62415,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Taint); i { + file_api_v1_recommendation_proto_msgTypes[428].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerEnrollmentReport); i { case 0: return &v.state case 1: @@ -39822,8 +62427,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DisruptionBudget); i { + file_api_v1_recommendation_proto_msgTypes[429].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertEventReport); i { case 0: return &v.state case 1: @@ -39834,8 +62439,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DisruptionPolicy); i { + file_api_v1_recommendation_proto_msgTypes[430].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRulesByPolicyRequest); i { case 0: return &v.state case 1: @@ -39846,8 +62451,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceLimits); i { + file_api_v1_recommendation_proto_msgTypes[431].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRulesByPolicyResponse); i { case 0: return &v.state case 1: @@ -39858,8 +62463,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AWSNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[432].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -39870,8 +62475,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceFamiliesRequest); i { + file_api_v1_recommendation_proto_msgTypes[433].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -39882,8 +62487,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceFamiliesResponse); i { + file_api_v1_recommendation_proto_msgTypes[434].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByIDRequest); i { case 0: return &v.state case 1: @@ -39894,8 +62499,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceSizesRequest); i { + file_api_v1_recommendation_proto_msgTypes[435].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByIDResponse); i { case 0: return &v.state case 1: @@ -39906,8 +62511,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceSizesResponse); i { + file_api_v1_recommendation_proto_msgTypes[436].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByWorkloadRequest); i { case 0: return &v.state case 1: @@ -39918,8 +62523,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceFamily); i { + file_api_v1_recommendation_proto_msgTypes[437].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadRuleByWorkloadResponse); i { case 0: return &v.state case 1: @@ -39930,8 +62535,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceSize); i { + file_api_v1_recommendation_proto_msgTypes[438].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadByWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -39942,8 +62547,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceCategory); i { + file_api_v1_recommendation_proto_msgTypes[439].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadByWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -39954,8 +62559,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceCPU); i { + file_api_v1_recommendation_proto_msgTypes[440].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -39966,8 +62571,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstanceTypeName); i { + file_api_v1_recommendation_proto_msgTypes[441].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -39978,8 +62583,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCategoriesRequest); i { + file_api_v1_recommendation_proto_msgTypes[442].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteAllWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -39990,8 +62595,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCategoriesResponse); i { + file_api_v1_recommendation_proto_msgTypes[443].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteAllWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -40002,8 +62607,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCPUsRequest); i { + file_api_v1_recommendation_proto_msgTypes[444].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -40014,8 +62619,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceCPUsResponse); i { + file_api_v1_recommendation_proto_msgTypes[445].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkDeleteWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -40026,8 +62631,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceTypeNamesRequest); i { + file_api_v1_recommendation_proto_msgTypes[446].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkToggleWorkloadRulesDisabledRequest); i { case 0: return &v.state case 1: @@ -40038,8 +62643,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetInstanceTypeNamesResponse); i { + file_api_v1_recommendation_proto_msgTypes[447].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BulkToggleWorkloadRulesDisabledResponse); i { case 0: return &v.state case 1: @@ -40050,8 +62655,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubnetSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[448].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRuleAndApplyRecommendationRequest); i { case 0: return &v.state case 1: @@ -40062,8 +62667,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SecurityGroupSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[449].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteRuleAndApplyRecommendationResponse); i { case 0: return &v.state case 1: @@ -40074,8 +62679,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CapacityReservationSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[450].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ManualRuleFields); i { case 0: return &v.state case 1: @@ -40086,8 +62691,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AMISelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[451].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpsertManualWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -40098,8 +62703,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KubeletConfiguration); i { + file_api_v1_recommendation_proto_msgTypes[452].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpsertManualWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -40110,8 +62715,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockDeviceMapping); i { + file_api_v1_recommendation_proto_msgTypes[453].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadRuleDisabledRequest); i { case 0: return &v.state case 1: @@ -40122,8 +62727,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BlockDevice); i { + file_api_v1_recommendation_proto_msgTypes[454].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToggleWorkloadRuleDisabledResponse); i { case 0: return &v.state case 1: @@ -40134,8 +62739,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetadataOptions); i { + file_api_v1_recommendation_proto_msgTypes[455].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadRuleRequest); i { case 0: return &v.state case 1: @@ -40146,8 +62751,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[456].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewWorkloadRuleResponse); i { case 0: return &v.state case 1: @@ -40158,8 +62763,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPImageSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[457].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerNamesRequest); i { case 0: return &v.state case 1: @@ -40170,8 +62775,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPDisk); i { + file_api_v1_recommendation_proto_msgTypes[458].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkloadContainerNamesResponse); i { case 0: return &v.state case 1: @@ -40182,8 +62787,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AzureNodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[459].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkload); i { case 0: return &v.state case 1: @@ -40194,8 +62799,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AzureKubeletConfiguration); i { + file_api_v1_recommendation_proto_msgTypes[460].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadsRequest); i { case 0: return &v.state case 1: @@ -40206,8 +62811,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIImageSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[461].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadResult); i { case 0: return &v.state case 1: @@ -40218,8 +62823,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCISubnetSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[462].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchAutoOptimizeWorkloadsResponse); i { case 0: return &v.state case 1: @@ -40230,8 +62835,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCISecurityGroupSelectorTerm); i { + file_api_v1_recommendation_proto_msgTypes[463].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadEntry); i { case 0: return &v.state case 1: @@ -40242,8 +62847,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIBootConfig); i { + file_api_v1_recommendation_proto_msgTypes[464].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -40254,8 +62859,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCILaunchOptions); i { + file_api_v1_recommendation_proto_msgTypes[465].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRuleResult); i { case 0: return &v.state case 1: @@ -40266,8 +62871,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIVolumeAttributes); i { + file_api_v1_recommendation_proto_msgTypes[466].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpsertManualWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -40278,8 +62883,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCINodeClassSpec); i { + file_api_v1_recommendation_proto_msgTypes[467].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRulesRequest); i { case 0: return &v.state case 1: @@ -40290,8 +62895,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KarpenterSettingsRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[468].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRuleResult); i { case 0: return &v.state case 1: @@ -40302,8 +62907,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[469].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchPreviewWorkloadRulesResponse); i { case 0: return &v.state case 1: @@ -40314,8 +62919,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[470].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyOneTimeOptimizationRequest); i { case 0: return &v.state case 1: @@ -40326,8 +62931,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AWSKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[471].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ApplyOneTimeOptimizationResponse); i { case 0: return &v.state case 1: @@ -40338,8 +62943,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AKSKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[472].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadProfileManifest); i { case 0: return &v.state case 1: @@ -40350,8 +62955,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodePool); i { + file_api_v1_recommendation_proto_msgTypes[473].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchWorkloadProfiles); i { case 0: return &v.state case 1: @@ -40362,8 +62967,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EC2NodeClass); i { + file_api_v1_recommendation_proto_msgTypes[474].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeConfigApplyEvent); i { case 0: return &v.state case 1: @@ -40374,8 +62979,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AKSNodeClass); i { + file_api_v1_recommendation_proto_msgTypes[475].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -40386,8 +62991,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCPKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[476].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -40398,8 +63003,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GCENodeClass); i { + file_api_v1_recommendation_proto_msgTypes[477].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableCheckpointForPolicyRequest); i { case 0: return &v.state case 1: @@ -40410,8 +63015,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIKarpenterSpec); i { + file_api_v1_recommendation_proto_msgTypes[478].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnableCheckpointForPolicyResponse); i { case 0: return &v.state case 1: @@ -40422,8 +63027,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCINodeClass); i { + file_api_v1_recommendation_proto_msgTypes[479].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCheckpointApplyStatusRequest); i { case 0: return &v.state case 1: @@ -40434,8 +63039,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageRecommendationPolicy); i { + file_api_v1_recommendation_proto_msgTypes[480].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCheckpointApplyStatusResponse); i { case 0: return &v.state case 1: @@ -40446,8 +63051,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[481].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeApplyFailure); i { case 0: return &v.state case 1: @@ -40458,8 +63063,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[482].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterCheckpointLabelCoverageRequest); i { case 0: return &v.state case 1: @@ -40470,8 +63075,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[483].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupCheckpointLabelCoverage); i { case 0: return &v.state case 1: @@ -40482,8 +63087,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[484].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterCheckpointLabelCoverageResponse); i { case 0: return &v.state case 1: @@ -40494,8 +63099,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageRecommendationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[485].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupCheckpointLabelStateRequest); i { case 0: return &v.state case 1: @@ -40506,8 +63111,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStorageRecommendationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[486].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeCheckpointLabelEntry); i { case 0: return &v.state case 1: @@ -40518,8 +63123,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[487].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodeGroupCheckpointLabelStateResponse); i { case 0: return &v.state case 1: @@ -40530,8 +63135,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[488].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPercentBounds); i { case 0: return &v.state case 1: @@ -40542,8 +63147,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageRecommendationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[489].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResourceThreshold); i { case 0: return &v.state case 1: @@ -40554,8 +63159,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStorageRecommendationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[490].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotSchedulePolicySpec); i { case 0: return &v.state case 1: @@ -40566,8 +63171,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoragePolicyTarget); i { + file_api_v1_recommendation_proto_msgTypes[491].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotGlobalRetention); i { case 0: return &v.state case 1: @@ -40578,8 +63183,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[492].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotContainerRetentionPolicy); i { case 0: return &v.state case 1: @@ -40590,8 +63195,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[493].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPodRetentionPolicy); i { case 0: return &v.state case 1: @@ -40602,8 +63207,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoragePolicyTargetsRequest); i { + file_api_v1_recommendation_proto_msgTypes[494].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotNamespaceRetentionPolicy); i { case 0: return &v.state case 1: @@ -40614,8 +63219,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoragePolicyTargetsResponse); i { + file_api_v1_recommendation_proto_msgTypes[495].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRetentionPolicySpec); i { case 0: return &v.state case 1: @@ -40626,8 +63231,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[496].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicy); i { case 0: return &v.state case 1: @@ -40638,8 +63243,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[497].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotPolicy); i { case 0: return &v.state case 1: @@ -40650,8 +63255,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoragePolicyTargetRequest); i { + file_api_v1_recommendation_proto_msgTypes[498].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotTargetScope); i { case 0: return &v.state case 1: @@ -40662,8 +63267,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoragePolicyTargetResponse); i { + file_api_v1_recommendation_proto_msgTypes[499].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicyTarget); i { case 0: return &v.state case 1: @@ -40674,8 +63279,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PvcStorageRecommendation); i { + file_api_v1_recommendation_proto_msgTypes[500].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotPolicyTarget); i { case 0: return &v.state case 1: @@ -40686,8 +63291,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[501].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -40698,8 +63303,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[502].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -40710,8 +63315,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPvcStorageRecommendationsRequest); i { + file_api_v1_recommendation_proto_msgTypes[503].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -40722,8 +63327,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPvcStorageRecommendationsResponse); i { + file_api_v1_recommendation_proto_msgTypes[504].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -40734,8 +63339,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[505].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -40746,8 +63351,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneratePvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[506].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -40758,8 +63363,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewPvcStorageRecommendationRequest); i { + file_api_v1_recommendation_proto_msgTypes[507].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -40770,8 +63375,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewPvcStorageRecommendationResponse); i { + file_api_v1_recommendation_proto_msgTypes[508].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -40782,8 +63387,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRuleOOMEvent); i { + file_api_v1_recommendation_proto_msgTypes[509].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -40794,8 +63399,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleOOMEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[510].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -40806,8 +63411,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleOOMEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[511].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -40818,8 +63423,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOOMEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[512].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -40830,8 +63435,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOOMEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[513].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -40842,8 +63447,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadRuleCPUThrottleEvent); i { + file_api_v1_recommendation_proto_msgTypes[514].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -40854,8 +63459,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleCPUThrottleEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[515].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -40866,8 +63471,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRuleCPUThrottleEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[516].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -40878,8 +63483,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadCPUThrottleEventsRequest); i { + file_api_v1_recommendation_proto_msgTypes[517].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -40890,8 +63495,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadCPUThrottleEventsResponse); i { + file_api_v1_recommendation_proto_msgTypes[518].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -40902,8 +63507,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadOptimizationPolicyProto); i { + file_api_v1_recommendation_proto_msgTypes[519].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPoliciesRequest); i { case 0: return &v.state case 1: @@ -40914,8 +63519,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[520].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPoliciesResponse); i { case 0: return &v.state case 1: @@ -40926,8 +63531,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[521].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -40938,8 +63543,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOptimizationPoliciesRequest); i { + file_api_v1_recommendation_proto_msgTypes[522].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -40950,8 +63555,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadOptimizationPoliciesResponse); i { + file_api_v1_recommendation_proto_msgTypes[523].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyRequest); i { case 0: return &v.state case 1: @@ -40962,8 +63567,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[524].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyResponse); i { case 0: return &v.state case 1: @@ -40974,8 +63579,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[525].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -40986,8 +63591,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[526].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateForensicSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -40998,8 +63603,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[527].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -41010,8 +63615,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadOptimizationPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[528].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListForensicSnapshotPolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -41022,8 +63627,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadOptimizationPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[529].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -41034,8 +63639,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRulesByPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[530].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateForensicSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -41046,8 +63651,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRulesByPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[531].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyTargetRequest); i { case 0: return &v.state case 1: @@ -41058,8 +63663,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRulesRequest); i { + file_api_v1_recommendation_proto_msgTypes[532].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteForensicSnapshotPolicyTargetResponse); i { case 0: return &v.state case 1: @@ -41070,8 +63675,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkloadRulesResponse); i { + file_api_v1_recommendation_proto_msgTypes[533].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TriggerForensicSnapshotRunRequest); i { case 0: return &v.state case 1: @@ -41082,8 +63687,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByIDRequest); i { + file_api_v1_recommendation_proto_msgTypes[534].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TriggerForensicSnapshotRunResponse); i { case 0: return &v.state case 1: @@ -41094,8 +63699,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByIDResponse); i { + file_api_v1_recommendation_proto_msgTypes[535].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResolvedWorkload); i { case 0: return &v.state case 1: @@ -41106,8 +63711,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByWorkloadRequest); i { + file_api_v1_recommendation_proto_msgTypes[536].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotResolvedNamespace); i { case 0: return &v.state case 1: @@ -41118,8 +63723,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadRuleByWorkloadResponse); i { + file_api_v1_recommendation_proto_msgTypes[537].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotClusterScopePreview); i { case 0: return &v.state case 1: @@ -41130,8 +63735,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadByWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[538].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotPolicyTargetMatchesRequest); i { case 0: return &v.state case 1: @@ -41142,8 +63747,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadByWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[539].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotPolicyTargetMatchesResponse); i { case 0: return &v.state case 1: @@ -41154,8 +63759,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[540].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicTargetOverlap); i { case 0: return &v.state case 1: @@ -41166,8 +63771,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[541].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotPolicyTargetMatchesRequest); i { case 0: return &v.state case 1: @@ -41178,8 +63783,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ManualRuleFields); i { + file_api_v1_recommendation_proto_msgTypes[542].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotPolicyTargetMatchesResponse); i { case 0: return &v.state case 1: @@ -41190,8 +63795,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertManualWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[543].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRenderedScopeRow); i { case 0: return &v.state case 1: @@ -41202,8 +63807,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpsertManualWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[544].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotPolicyTargetRenderedScopeRequest); i { case 0: return &v.state case 1: @@ -41214,8 +63819,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadRuleRequest); i { + file_api_v1_recommendation_proto_msgTypes[545].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotPolicyTargetRenderedScopeResponse); i { case 0: return &v.state case 1: @@ -41226,8 +63831,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PreviewWorkloadRuleResponse); i { + file_api_v1_recommendation_proto_msgTypes[546].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotPolicyTargetRenderedScopeRequest); i { case 0: return &v.state case 1: @@ -41238,8 +63843,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerNamesRequest); i { + file_api_v1_recommendation_proto_msgTypes[547].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotPolicyTargetRenderedScopeResponse); i { case 0: return &v.state case 1: @@ -41250,8 +63855,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkloadContainerNamesResponse); i { + file_api_v1_recommendation_proto_msgTypes[548].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotConfigInfo); i { case 0: return &v.state case 1: @@ -41262,8 +63867,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkload); i { + file_api_v1_recommendation_proto_msgTypes[549].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotConfigApplyEventInfo); i { case 0: return &v.state case 1: @@ -41274,8 +63879,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadsRequest); i { + file_api_v1_recommendation_proto_msgTypes[550].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -41286,8 +63891,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadResult); i { + file_api_v1_recommendation_proto_msgTypes[551].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSnapshotRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -41298,8 +63903,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchAutoOptimizeWorkloadsResponse); i { + file_api_v1_recommendation_proto_msgTypes[552].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotRecommendationStatusRequest); i { case 0: return &v.state case 1: @@ -41310,8 +63915,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkloadProfileManifest); i { + file_api_v1_recommendation_proto_msgTypes[553].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetForensicSnapshotRecommendationStatusResponse); i { case 0: return &v.state case 1: @@ -41322,8 +63927,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BatchWorkloadProfiles); i { + file_api_v1_recommendation_proto_msgTypes[554].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -41334,8 +63939,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeConfigApplyEvent); i { + file_api_v1_recommendation_proto_msgTypes[555].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewSnapshotRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -41346,8 +63951,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeRecommendationStatusRequest); i { + file_api_v1_recommendation_proto_msgTypes[556].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -41358,8 +63963,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNodeRecommendationStatusResponse); i { + file_api_v1_recommendation_proto_msgTypes[557].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewForensicSnapshotRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -41370,8 +63975,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnableCheckpointForPolicyRequest); i { + file_api_v1_recommendation_proto_msgTypes[558].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReferencedAuthenticationsRequest); i { case 0: return &v.state case 1: @@ -41382,8 +63987,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnableCheckpointForPolicyResponse); i { + file_api_v1_recommendation_proto_msgTypes[559].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReferencedAuthentication); i { case 0: return &v.state case 1: @@ -41394,8 +63999,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCheckpointApplyStatusRequest); i { + file_api_v1_recommendation_proto_msgTypes[560].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReferencedAuthenticationsResponse); i { case 0: return &v.state case 1: @@ -41406,8 +64011,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCheckpointApplyStatusResponse); i { + file_api_v1_recommendation_proto_msgTypes[597].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerEnrollmentReport_Observation); i { case 0: return &v.state case 1: @@ -41418,8 +64023,8 @@ func file_api_v1_recommendation_proto_init() { return nil } } - file_api_v1_recommendation_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NodeApplyFailure); i { + file_api_v1_recommendation_proto_msgTypes[598].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SchedulerRevertEventReport_Event); i { case 0: return &v.state case 1: @@ -41447,19 +64052,22 @@ func file_api_v1_recommendation_proto_init() { file_api_v1_recommendation_proto_msgTypes[66].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[74].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[76].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[79].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[80].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[84].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[86].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[96].OneofWrappers = []interface{}{ + file_api_v1_recommendation_proto_msgTypes[81].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[85].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[87].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[97].OneofWrappers = []interface{}{ (*BalanceGetRecommendationsRequest_Register)(nil), (*BalanceGetRecommendationsRequest_Apply)(nil), (*BalanceGetRecommendationsRequest_WorkloadMeta)(nil), (*BalanceGetRecommendationsRequest_InClusterRecommendation)(nil), + (*BalanceGetRecommendationsRequest_SnapshotCrStatusReport)(nil), + (*BalanceGetRecommendationsRequest_SchedulerEnrollmentReport)(nil), + (*BalanceGetRecommendationsRequest_SchedulerRevertEventReport)(nil), (*BalanceGetRecommendationsRequest_OperatorHealth)(nil), (*BalanceGetRecommendationsRequest_AgentHealth)(nil), } - file_api_v1_recommendation_proto_msgTypes[97].OneofWrappers = []interface{}{ + file_api_v1_recommendation_proto_msgTypes[98].OneofWrappers = []interface{}{ (*BalanceGetRecommendationsResponse_NodeGroupRecommendation)(nil), (*BalanceGetRecommendationsResponse_WorkloadRecommendation)(nil), (*BalanceGetRecommendationsResponse_NodeRecommendation)(nil), @@ -41474,71 +64082,128 @@ func file_api_v1_recommendation_proto_init() { (*BalanceGetRecommendationsResponse_BatchPvcStorageRecommendations)(nil), (*BalanceGetRecommendationsResponse_BatchWorkloadRules)(nil), (*BalanceGetRecommendationsResponse_KarpenterSettings)(nil), + (*BalanceGetRecommendationsResponse_SnapshotRecommendation)(nil), + (*BalanceGetRecommendationsResponse_ForensicSnapshotRecommendation)(nil), + (*BalanceGetRecommendationsResponse_BatchHpaConnectors)(nil), + (*BalanceGetRecommendationsResponse_SchedulerPolicySync)(nil), } - file_api_v1_recommendation_proto_msgTypes[100].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[101].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[102].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[104].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[106].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[114].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[124].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[126].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[140].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[141].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[142].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[143].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[144].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[145].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[148].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[149].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[150].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[103].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[105].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[107].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[108].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[110].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[111].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[122].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[132].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[138].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[152].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[153].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[154].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[155].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[156].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[157].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[158].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[159].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[160].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[161].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[164].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[165].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[166].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[169].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[170].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[171].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[176].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[209].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[217].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[238].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[258].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[259].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[260].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[261].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[172].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[180].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[194].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[196].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[201].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[251].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[262].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[265].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[266].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[271].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[273].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[286].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[287].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[293].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[297].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[298].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[300].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[306].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[309].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[310].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[312].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[269].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[290].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[313].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[314].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[315].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[316].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[318].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[317].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[320].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[321].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[323].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[325].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[326].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[332].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[338].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[328].OneofWrappers = []interface{}{} file_api_v1_recommendation_proto_msgTypes[348].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[349].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[355].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[359].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[360].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[362].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[368].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[371].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[372].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[374].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[376].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[377].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[378].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[380].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[382].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[383].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[385].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[388].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[389].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[390].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[398].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[399].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[402].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[404].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[405].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[408].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[409].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[411].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[413].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[419].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[420].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[423].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[432].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[450].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[455].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[463].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[488].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[489].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[490].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[491].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[492].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[493].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[494].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[495].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[496].OneofWrappers = []interface{}{ + (*SnapshotPolicy_Schedule)(nil), + (*SnapshotPolicy_Retention)(nil), + } + file_api_v1_recommendation_proto_msgTypes[497].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[498].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[511].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[527].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[535].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[541].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[543].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[544].OneofWrappers = []interface{}{ + (*GetSnapshotPolicyTargetRenderedScopeRequest_TargetId)(nil), + (*GetSnapshotPolicyTargetRenderedScopeRequest_PolicyId)(nil), + } + file_api_v1_recommendation_proto_msgTypes[546].OneofWrappers = []interface{}{ + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_TargetId)(nil), + (*GetForensicSnapshotPolicyTargetRenderedScopeRequest_PolicyId)(nil), + } + file_api_v1_recommendation_proto_msgTypes[548].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[551].OneofWrappers = []interface{}{} + file_api_v1_recommendation_proto_msgTypes[553].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_recommendation_proto_rawDesc, - NumEnums: 17, - NumMessages: 402, + NumEnums: 35, + NumMessages: 602, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/proto/api/v1/cluster.proto b/internal/proto/api/v1/cluster.proto index 10d7462..e1eefbc 100644 --- a/internal/proto/api/v1/cluster.proto +++ b/internal/proto/api/v1/cluster.proto @@ -125,6 +125,8 @@ message GetNetworkDependenciesRequest { google.protobuf.Timestamp end_time = 3; repeated string src_namespaces = 4; // Filter by source namespaces (optional) repeated string src_node_groups = 5; // Filter by source node groups (optional) + int32 limit = 6; // Max edges to return, ordered by rank_by (optional; 0/unset means no limit — all matching edges are returned) + string rank_by = 7; // Ordering dimension: "traffic" (default) or "cost" (optional; unset/unrecognized falls back to "traffic") } // A workload node in the dependency graph diff --git a/internal/proto/api/v1/common.proto b/internal/proto/api/v1/common.proto index d87e033..795fcf3 100644 --- a/internal/proto/api/v1/common.proto +++ b/internal/proto/api/v1/common.proto @@ -50,6 +50,14 @@ enum K8sObjectKind { K8S_OBJECT_KIND_CNPG_CLUSTER = 35; K8S_OBJECT_KIND_SPARK_APPLICATION = 36; K8S_OBJECT_KIND_SCHEDULED_SPARK_APPLICATION = 37; + // Kyverno Policy and ClusterPolicy (kyverno.io/v1); one kind for both scopes. + K8S_OBJECT_KIND_KYVERNO_POLICY = 38; + // Kyverno PolicyReport and ClusterPolicyReport (wgpolicyk8s.io/v1alpha2). + K8S_OBJECT_KIND_KYVERNO_POLICY_REPORT = 39; + // Gatekeeper ConstraintTemplate (templates.gatekeeper.sh/v1). + K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT_TEMPLATE = 40; + // Gatekeeper constraint instances (constraints.gatekeeper.sh, dynamic kinds). + K8S_OBJECT_KIND_GATEKEEPER_CONSTRAINT = 41; } // Represents a single audit log entry @@ -142,6 +150,7 @@ message CostInfo { google.type.Money money_cpu_cost_for_time_period = 110; google.type.Money money_memory_cost_for_time_period = 111; google.type.Money money_total_cost_for_time_period = 112; + google.type.Money money_network_cost_for_time_period = 122; google.type.Money money_optimized_cpu_cost_for_time_period = 113; google.type.Money money_optimized_memory_cost_for_time_period = 114; @@ -221,6 +230,40 @@ message ResourceMetrics { // Pod count int32 pod_count = 111; // Number of distinct pods observed in this time bucket. + + // JVM heap metrics (0 for non-Java containers) + int64 jvm_heap_used_bytes = 121; + int64 jvm_heap_max_bytes = 122; + + // Memory RSS (Resident Set Size) in bytes from kubelet stats/summary (0 for non-RSS-reporting nodes) + int64 container_memory_rss_bytes = 123; + + // Memory breakdown components (bytes). Relationship: + // usage_bytes = anonymous + file cache + swap cache + kernel (container_memory_usage_bytes / memory.current) + // working_set = usage_bytes - inactive_file (what the kubelet/OOM-killer acts on; stored as container_memory_usage) + // cache = active_file + inactive_file (file-backed, reclaimable) + // inactive_cache = max(0, usage_bytes - working_set) (reclaimable file cache) + // active_cache = max(0, cache - inactive_cache) (recently-used file cache) + // swap = swapped-out (non-resident) pages; tracked separately, NOT part of usage/working_set + int64 container_memory_cache_bytes = 124; + int64 container_memory_swap_bytes = 125; + int64 container_memory_active_cache_bytes = 126; + int64 container_memory_inactive_cache_bytes = 127; + + // Runtime-aware cgroup signals (Plane 0, ADR-0037). Read directly from + // /sys/fs/cgroup by zxporter-nodemon (v2 primary). All are cumulative kernel + // counters; consumers derive windowed rates as last-first. + // cfs_* CPU CFS throttling (cpu.stat): real throttle, not a usage/limit ratio + // memory_events_max memory.events:max — allocations pinned against memory.max, the + // Guaranteed-memory ceiling counter that fires before/without an OOM kill + // *_pressure_*_usec PSI stall time (cpu.pressure/memory.pressure "total="), microseconds + int64 container_cfs_periods = 128; + int64 container_cfs_throttled_periods = 129; + int64 container_cfs_throttled_usec = 130; + int64 container_memory_events_max = 131; + int64 container_cpu_pressure_some_usec = 132; + int64 container_memory_pressure_some_usec = 133; + int64 container_memory_pressure_full_usec = 134; } // MetricPercentiles contains percentile statistics for a single metric. @@ -288,6 +331,90 @@ message ContainerRequestLimits { double current_memory_request = 3; double current_cpu_limit = 4; double current_memory_limit = 5; + + // JVM metadata (empty/zero for non-Java containers). + // Populated from k8s_containers table when JVM is detected via hsperfdata. + string jvm_java_version = 10; + string jvm_java_command = 11; + + // Parsed JVM flags (typed fields instead of raw JSON for type-safe frontend access). + int64 jvm_xmx_bytes = 13; // -Xmx max heap size in bytes + int64 jvm_xms_bytes = 14; // -Xms initial heap size in bytes + double jvm_max_ram_percentage = 15; // -XX:MaxRAMPercentage + optional bool jvm_use_container_support = 16; // -XX:+/-UseContainerSupport + + // Source the -Xmx flag was extracted from: "cmdline", "JAVA_TOOL_OPTIONS", + // "JDK_JAVA_OPTIONS", or "JAVA_OPTS". Empty when -Xmx is unset. Matters + // because the `java` launcher ignores JAVA_OPTS — an -Xmx set there is + // inert and the JVM falls back to ergonomic (container-limit) heap sizing. + string jvm_xmx_source = 17; + + // Generic runtime detections (Node.js, .NET, Go, Rust, GraalVM native-image, + // Python, Ruby, Deno, Bun) from zxporter-nodemon: existence + best-effort + // version per runtime. Empty for containers with no detected runtime. JVM + // stays on the dedicated fields above (richer hsperfdata payload). + repeated RuntimeProcess runtime_processes = 18; +} + +// GPUMigInstance captures per-instance identity and profiling metrics for a +// single MIG partition. GPU utilization/SM fields are intentionally absent — +// DCGM never populates them on MIG rows. +message GPUMigInstance { + string device_uuid = 1; + string device_id = 2; + string mig_profile = 3; + string mig_instance_id = 4; + string model_name = 5; + + double tensor_active = 6; + double dram_active = 7; + double graphics_engine_active = 8; + double framebuffer_used = 9; + double framebuffer_total = 10; +} + +// IndividualGPUMetric captures point-in-time metrics for a single GPU used +// by a container. +message IndividualGPUMetric { + string uuid = 1; + string model_name = 2; + string device_index = 3; + string mig_profile = 4; + string mig_instance_id = 5; + + double utilization = 6; + double memory_used = 7; + double memory_free = 8; + double total_memory = 9; + double memory_utilization_percentage = 10; + double power_usage = 11; + double temperature = 12; + double sm_clock = 13; + double mem_clock = 14; +} + +// ContainerIndividualGPUMetrics is the most recent per-GPU breakdown for a +// single container. +message ContainerIndividualGPUMetrics { + string container_name = 1; + repeated IndividualGPUMetric instances = 2; + optional google.protobuf.Timestamp collected_at = 3; +} + +// RuntimeProcess is one detected language runtime in a container. +message RuntimeProcess { + // Runtime name: "nodejs" | "dotnet" | "go" | "rust" | + // "graalvm-native-image" | "python" | "ruby" | "deno" | "bun". + string runtime = 1; + // Best-effort version; may be empty (stripped/custom binaries) — the + // detection itself is still meaningful. + string version = 2; + // How the version was resolved: "env" | "maps" | "buildinfo" | "elf-comment" + // | "binary-scan" | "exe-path" | "comm". + string version_source = 3; + // Raw process cmdline (useful for future flag heuristics, e.g. + // --max-old-space-size). + string raw_cmdline = 4; } // ForecastResourceMetrics encapsulates Forecasted CPU and memory capacity, usage, and utilization for nodes and containers. @@ -346,6 +473,27 @@ message ResourceSummary { } // WorkloadItem represents a Kubernetes resource and its hierarchical children. +// LegacyPolicyRef identifies a legacy WorkloadPolicy whose target matches a workload. +message LegacyPolicyRef { + string policy_id = 1; + string policy_name = 2; +} + +// OptimizationStatus reports whether a workload is optimized under either the +// legacy (WorkloadPolicy/WorkloadPolicyTarget) or MPA v2 (WorkloadRule) system. +// Only populated on WorkloadItem when at least one of +// GetWorkloadsRequest.include_legacy_optimization_status or +// GetWorkloadsRequest.include_v2_optimization_status is true. +message OptimizationStatus { + bool is_optimized = 1; // is_optimized_legacy || is_optimized_v2 + bool is_optimized_legacy = 2; + bool is_optimized_v2 = 3; + repeated LegacyPolicyRef legacy_policies = 4; // legacy policies whose targets match this workload + string workload_rule_id = 5; // v2: empty if no active WorkloadRule + string workload_rule_policy_name = 6; // v2: display name of the policy behind the active rule, empty if unresolved + bool disabled = 7; // v2: whether the active WorkloadRule (workload_rule_id) is currently disabled. Always false when workload_rule_id is empty. +} + message WorkloadItem { string kind = 1; // Kind of the resource (e.g., Pod, Container, Deployment). string name = 2; // Name of the resource. @@ -377,6 +525,8 @@ message WorkloadItem { string root_owner_kind = 91; // Kind of the root owning resource, if any. string root_owner_uid = 92; // UID of the root owning resource, if any. + + optional OptimizationStatus optimization_status = 93; // Populated only when GetWorkloadsRequest.include_legacy_optimization_status and/or GetWorkloadsRequest.include_v2_optimization_status is true } // ContainerRuntimeInfo containes information about container runtime info @@ -534,13 +684,34 @@ message SavingsTimeSeries { double total_cpu_cost_waste = 4; } -// Kubernetes-compatible Label Selector Types - -// LabelSelectorOperator is the set of operators that can be used in a selector requirement. +// LabelSelectorOperator is the set of operators that can be used in a selector +// requirement. +// +// The message shape mirrors Kubernetes metav1.LabelSelector, and matching +// follows Kubernetes for the IN and NOT_IN operators. In particular, a +// workload whose labels lack the key still matches NOT_IN, because a missing +// key is not in the set. This agrees with Kubernetes: in +// k8s.io/apimachinery/pkg/labels, Requirement.Matches returns true for NotIn +// when the key is absent, so it is not a divergence. +// +// Two DevZero-specific caveats apply (PC-1452): +// +// First, the department and workload filter paths implement only IN and +// NOT_IN. EXISTS, DOES_NOT_EXIST, GT, and LT are part of this proto for shape +// compatibility but are not honored by those SQL filters. +// +// Second, a workload whose entire labels or annotations column is SQL NULL +// (an unset column, distinct from an empty map) is EXCLUDED from a NOT_IN +// match by the department query, which ANDs a column IS NOT NULL guard ahead +// of the selector condition (dakr/repositories/departments.go). This is a +// genuine divergence from Kubernetes, which matches a label-less object +// against NotIn. It is also inconsistent with the workload-metrics filter +// path, which matches a NULL column against NOT_IN +// (dakr/repositories/workload_metrics_filters.go). enum LabelSelectorOperator { LABEL_SELECTOR_OPERATOR_UNSPECIFIED = 0; LABEL_SELECTOR_OPERATOR_IN = 1; // In - LABEL_SELECTOR_OPERATOR_NOT_IN = 2; // NotIn + LABEL_SELECTOR_OPERATOR_NOT_IN = 2; // NotIn (missing key matches; see caveats above and PC-1452) LABEL_SELECTOR_OPERATOR_EXISTS = 3; // Exists LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST = 4; // DoesNotExist LABEL_SELECTOR_OPERATOR_GT = 5; // GreaterThan @@ -553,7 +724,9 @@ message LabelSelectorRequirement { // key is the label key that the selector applies to. string key = 1; // operator represents a key's relationship to a set of values. - // Valid operators are In, NotIn, Exists and DoesNotExist. + // Valid operators are In, NotIn, Exists and DoesNotExist, but the DevZero + // department and workload filter paths honor only In and NotIn (see the + // LabelSelectorOperator caveats above, PC-1452). LabelSelectorOperator operator = 2; // values is an array of string values. If the operator is In or NotIn, // the values array must be non-empty. If the operator is Exists or DoesNotExist, @@ -647,6 +820,14 @@ message ResourceDetails { SparkApplicationDetails spark_application_details = 242; // ScheduledSparkApplication-specific fields ScheduledSparkApplicationDetails scheduled_spark_application_details = 243; + // KyvernoPolicy-specific fields + KyvernoPolicyDetails kyverno_policy_details = 244; + // KyvernoPolicyReport-specific fields + KyvernoPolicyReportDetails kyverno_policy_report_details = 245; + // GatekeeperConstraintTemplate-specific fields + GatekeeperConstraintTemplateDetails gatekeeper_constraint_template_details = 246; + // GatekeeperConstraint-specific fields + GatekeeperConstraintDetails gatekeeper_constraint_details = 247; } // Common fields that can be flattened at this level for easier access @@ -1118,6 +1299,12 @@ message NodeDetails { map capacity = 4; // Resource capacity (cpu, memory, etc.) map allocatable = 5; // Allocatable resources repeated NodeImage images = 6; // Container images on the node + // Desired MIG partitioning profile from the nvidia.com/mig.config node + // label; empty on nodes without MIG management. + string mig_config_desired = 7; + // Applied MIG state from the nvidia.com/mig.config.state node label + // (e.g. success, pending, failed); empty on nodes without MIG management. + string mig_config_state = 8; } // NodeTaint represents a node taint that affects pod scheduling @@ -1523,6 +1710,20 @@ enum WorkloadStatusFilter { WORKLOAD_STATUS_FILTER_BOTH = 3; // Both active and deleted workloads } +// ResourceFieldFilter filters resources on a single field; values are OR'd together. +message ResourceFieldFilter { + string field = 1; // e.g. "type", "class", "kind", "namespace" + repeated string values = 2; // OR'd together +} + +// ResourceFilterFieldOptions describes the distinct values available for a filterable field. +message ResourceFilterFieldOptions { + string field = 1; + string label = 2; + repeated string values = 3; + bool truncated = 4; // true when the value list was capped and is incomplete +} + // WorkloadFilters provides optional filters for narrowing the GetWorkloads request. // All fields are optional. When multiple fields are provided, they are ANDed together. message WorkloadFilters { @@ -1534,8 +1735,19 @@ message WorkloadFilters { optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; // Target specific workload kinds + // Match workloads with at least one container detected as one of these + // languages (e.g. "python", "go", "java"). ANY container matching is + // sufficient — containers do not all need to match. + repeated string language_filter = 17; + // Exact detected version strings (e.g. "3.11.4"). Only meaningful when + // language_filter is also set; ignored otherwise. + repeated string language_version_filter = 18; + repeated string node_group_names = 21; // target workloads running on specific nodes + repeated string namespace_names = 22; // Target workloads in any of these namespaces by exact name (OR'd together; ANDed with other filter fields; no-op when empty) + optional RegexPattern namespace_pattern = 23; // Target namespaces by name pattern + // Lifecycle status filter (overrides legacy show_deleted when set) WorkloadStatusFilter status = 30; // ACTIVE, DELETED, or BOTH } @@ -1678,6 +1890,146 @@ message ScheduledSparkApplicationDetails { SparkApplicationDetails template_details = 14; // Details from the SparkApplication template } +// KyvernoPolicyDetails contains detailed Kyverno Policy/ClusterPolicy information for drill-down +message KyvernoPolicyDetails { + string kind = 1; // Policy (namespaced) or ClusterPolicy + bool background = 2; // Whether background scanning is enabled + string validation_failure_action = 3; // Audit or Enforce (rule-level failureAction wins on kyverno 1.13+) + int32 rule_count = 4; // Number of rules in the policy + repeated string rule_names = 5; // Rule names + string spec_json = 6; // Full policy spec as JSON for raw inspection +} + +// PolicyReportResult is one per-resource result inside a Kyverno policy report +message PolicyReportResult { + string policy = 1; // Policy name + string rule = 2; // Rule name + string result = 3; // pass, fail, warn, error, skip + string severity = 4; // critical, high, medium, low, info + string message = 5; // Human readable message + string resource_kind = 6; // Kind of the evaluated resource + string resource_namespace = 7; // Namespace of the evaluated resource + string resource_name = 8; // Name of the evaluated resource +} + +// KyvernoPolicyReportDetails contains detailed policy report information for drill-down. +// The results list is capped at collection time (50); the counts always cover the full report. +message KyvernoPolicyReportDetails { + string kind = 1; // PolicyReport (namespaced) or ClusterPolicyReport + string scope_kind = 2; // Kind of the resource the report applies to + string scope_name = 3; // Name of the resource the report applies to + string scope_namespace = 4; // Namespace of the resource the report applies to + int32 pass = 5; // Passing result count + int32 fail = 6; // Failing result count + int32 warn = 7; // Warning result count + int32 error = 8; // Error result count + int32 skip = 9; // Skipped result count + repeated PolicyReportResult results = 10; // Capped per-resource results + int32 total_results = 11; // Full result count before capping +} + +// GatekeeperConstraintTemplateDetails contains detailed ConstraintTemplate information for drill-down +message GatekeeperConstraintTemplateDetails { + string crd_kind = 1; // Constraint kind this template generates (e.g. K8sRequiredLabels) + repeated string targets = 2; // Enforcement targets (e.g. admission.k8s.gatekeeper.sh) + bool created = 3; // Whether the constraint CRD has been created + string spec_json = 4; // Full template spec as JSON for raw inspection +} + +// ConstraintViolation is one audit violation on a Gatekeeper constraint status +message ConstraintViolation { + string resource_kind = 1; // Kind of the violating resource + string resource_namespace = 2; // Namespace of the violating resource + string resource_name = 3; // Name of the violating resource + string message = 4; // Violation message + string enforcement_action = 5; // Action recorded on the violation +} + +// GatekeeperConstraintDetails contains detailed constraint information for drill-down. +// The violations list is capped by gatekeeper (default 20); total_violations covers the full audit. +message GatekeeperConstraintDetails { + string kind = 1; // Template-generated constraint kind + string enforcement_action = 2; // deny, warn, or dryrun + string match_json = 3; // Match criteria as JSON + string parameters_json = 4; // Constraint parameters as JSON + int64 total_violations = 5; // Full audit violation count + google.protobuf.Timestamp audit_timestamp = 6; // When gatekeeper last audited + repeated ConstraintViolation violations = 7; // Capped audit violations +} + +// DisruptionBlockReason is the structured classification of a consolidation / scale-down +// block: why the autoscaler could not remove a node. +// +// Assigned by zxporter at ingest time, because only the collector has the inputs the +// answer needs — the blocked pods' annotations, live PodDisruptionBudget status, the +// NodeClaim's terminationGracePeriod deadline, and (on Cluster Autoscaler) the +// `cluster-autoscaler-status` ConfigMap. dakr has none of those at read time, and the +// event's own message is unversioned free text that has changed shape across releases. +// +// ONE ENUM FOR BOTH AUTOSCALERS. Karpenter's `DisruptionBlocked` events and Cluster +// Autoscaler's synthesized `ScaleDownBlocked` observations share these buckets: two mean +// the same thing under either autoscaler, the rest are specific to one. Which autoscaler +// produced a row is answered by its `reporting_controller`, not by a second enum — that is +// what lets one report cover a Karpenter cluster, a CAS cluster, and a cluster running +// both mid-migration. +// +// The value names map 1:1 to models.DisruptionBlockReason and to the +// k8s_events.disruption_block_reason ClickHouse column's string values. That column is +// LowCardinality(String), not Enum8, so appending a value here costs no migration. +enum DisruptionBlockReason { + // Not a disruption-block event, or an event ingested before classification existed. + // Deliberately distinct from OTHER: this means "never classified", where OTHER means + // "classified, and matched no known pattern". + DISRUPTION_BLOCK_REASON_UNSPECIFIED = 0; + // A PodDisruptionBudget selecting a pod on the node currently allows no disruptions. + // blocking_pdb_name carries which one. Both autoscalers (on Cluster Autoscaler this is + // the BlockedByPod unremovable reason with a NotEnoughPdb blocking pod). + DISRUPTION_BLOCK_REASON_PDB_VIOLATION = 1; + // A pod on the node, or the node itself, is annotated un-evictable. Both autoscalers: + // `karpenter.sh/do-not-disrupt: "true"` on a pod (Karpenter), + // `cluster-autoscaler.kubernetes.io/safe-to-evict: "false"` on a pod, or + // `cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"` on a node (CAS). + DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION = 2; + // The NodeClaim's terminationGracePeriod deadline has already elapsed, so Karpenter + // will force-terminate past both PDBs and do-not-disrupt. Karpenter-only: Cluster + // Autoscaler has no equivalent override. + DISRUPTION_BLOCK_REASON_FORCE_DISRUPTED = 3; + // Classified, but the block matched none of the above — e.g. a node-level block + // (uninitialized, already deleting, missing its NodePool label), or any Cluster + // Autoscaler unremovable reason without its own bucket (NodeGroupMinSizeReached, + // NotUnderutilized, CurrentlyBeingDeleted, ...). The verbatim `message` is the only + // remaining detail, which is why it is never dropped. This is the REQUIRED fallback: + // dakr rejects an event carrying a value outside this enum. + DISRUPTION_BLOCK_REASON_OTHER = 4; + // Cluster Autoscaler considers the node underutilized but has not yet seen it stay that + // way for --scale-down-unneeded-time. A waiting state rather than a misconfiguration, + // and the most common thing a healthy CAS cluster reports — hence its own bucket rather + // than OTHER. Cluster-Autoscaler-only. + DISRUPTION_BLOCK_REASON_NOT_UNNEEDED_LONG_ENOUGH = 5; + // Cluster Autoscaler's scheduling simulation found nowhere to move the node's pods to, + // so the node cannot be drained. Actionable, unlike NOT_UNNEEDED_LONG_ENOUGH. + // Cluster-Autoscaler-only. + DISRUPTION_BLOCK_REASON_NO_PLACE_TO_MOVE_PODS = 6; + // The scheduler has provisionally assigned a pending pod to this node + // (pod.Status.NominatedNodeName). The autoscaler will not disrupt a node it is about to + // hand a pod, since that would just make the pod re-pend immediately — a self-resolving, + // expected-waiting state, not a misconfiguration. related_pod_name carries the pod. + // Derived structurally, not from the event message — reachable via the Karpenter path + // today. + DISRUPTION_BLOCK_REASON_POD_NOMINATED = 7; + // Karpenter's own `disruption.budgets` allowance for the NodePool is currently spent, so + // it throttled itself. Operationally the opposite of every other value here: a config + // choice the cluster's owner made, not an obstruction to go find, which is why it is not + // folded into OTHER. Reported against the NodePool rather than a node, so it counts as a + // blocking event and never as a blocked node. Karpenter-only. + DISRUPTION_BLOCK_REASON_DISRUPTION_BUDGET = 8; + // Karpenter's scheduling simulation found nowhere for the node's pods to go, so draining + // it would leave them pending. Same situation as NO_PLACE_TO_MOVE_PODS, which is spelled + // to match Cluster Autoscaler's own unremovable reason verbatim and is therefore kept + // CAS-only; the per-pod sub-reason stays readable in the verbatim `message`. + DISRUPTION_BLOCK_REASON_PODS_WOULD_NOT_SCHEDULE = 9; +} + message Event { string id = 1; string kind = 2; @@ -1704,6 +2056,13 @@ message Event { map labels = 24; string involved_object_uid = 25; + // Set only on Karpenter `DisruptionBlocked` events; UNSPECIFIED on every other event. + DisruptionBlockReason disruption_block_reason = 26; + // The PodDisruptionBudget that blocked eviction, as "namespace/name". Set only + // alongside DISRUPTION_BLOCK_REASON_PDB_VIOLATION; absent — not empty-string — + // otherwise, since "no PDB was involved" is not the same as "a PDB with no name". + optional string blocking_pdb_name = 27; + google.protobuf.Timestamp created_at = 41; google.protobuf.Timestamp updated_at = 42; google.protobuf.Timestamp last_seen = 43; @@ -1711,6 +2070,11 @@ message Event { string updated_at_age = 45; string last_seen_age = 46; google.protobuf.Timestamp deleted_at = 47; + + // The pod behind a DISRUPTION_BLOCK_REASON_DO_NOT_DISRUPT_ANNOTATION or + // DISRUPTION_BLOCK_REASON_POD_NOMINATED classification, as "namespace/name". Same + // absent-means-not-applicable contract as blocking_pdb_name. + optional string related_pod_name = 48; } message EventDatapointInfo { diff --git a/internal/proto/api/v1/hpa_connector.proto b/internal/proto/api/v1/hpa_connector.proto new file mode 100644 index 0000000..ff0aaa2 --- /dev/null +++ b/internal/proto/api/v1/hpa_connector.proto @@ -0,0 +1,67 @@ +// dakr/proto/api/v1/hpa_connector.proto +syntax = "proto3"; + +package api.v1; + +option go_package = "github.com/devzero-inc/services/dakr/gen/api/v1;gen"; + +import "google/protobuf/empty.proto"; +import "google/protobuf/timestamp.proto"; + +message HPAConnector { + string id = 1; + string cluster_id = 2; + string team_id = 3; + string name = 4; + string type = 5; + map config = 6; + optional string auth_secret_ref = 7; + string status = 8; + optional google.protobuf.Timestamp last_health_check = 9; + optional string health_error = 10; + google.protobuf.Timestamp created_at = 11; + google.protobuf.Timestamp updated_at = 12; + optional string auth_secret_namespace = 13; +} + +message CreateHPAConnectorRequest { + string cluster_id = 1; + string name = 2; + string type = 3; + map config = 4; + optional string auth_secret_ref = 5; + optional string auth_secret_namespace = 6; +} + +message UpdateHPAConnectorRequest { + string id = 1; + string name = 2; + map config = 3; + optional string auth_secret_ref = 4; + optional string auth_secret_namespace = 5; +} + +message GetHPAConnectorRequest { + string id = 1; +} + +message ListHPAConnectorsRequest { + string cluster_id = 1; + optional string type = 2; +} + +message ListHPAConnectorsResponse { + repeated HPAConnector connectors = 1; +} + +message DeleteHPAConnectorRequest { + string id = 1; +} + +service HPAConnectorService { + rpc CreateHPAConnector(CreateHPAConnectorRequest) returns (HPAConnector); + rpc UpdateHPAConnector(UpdateHPAConnectorRequest) returns (HPAConnector); + rpc DeleteHPAConnector(DeleteHPAConnectorRequest) returns (google.protobuf.Empty); + rpc ListHPAConnectors(ListHPAConnectorsRequest) returns (ListHPAConnectorsResponse); + rpc GetHPAConnector(GetHPAConnectorRequest) returns (HPAConnector); +} diff --git a/internal/proto/api/v1/k8s.proto b/internal/proto/api/v1/k8s.proto index 82886dc..e6e5557 100644 --- a/internal/proto/api/v1/k8s.proto +++ b/internal/proto/api/v1/k8s.proto @@ -68,6 +68,103 @@ message GetWorkloadsRequest { repeated string node_group_names = 25 [deprecated = true]; // Prefer filters.status instead optional WorkloadFilters filters = 31; // Optional advanced filters; when set, overrides show_deleted behavior via filters.status + + // The two flags below independently control which half of + // WorkloadItem.optimization_status gets computed. Split because a team on + // MPA_V2 with is_enabled=false is permanently locked into exactly one + // system (is_active=true -> v2-only, is_active=false -> legacy-only) and + // the unused system should never be queried; only when is_enabled=true + // (team is in a self-service/transition state) does the caller request + // both. Adds batched lookups — leave both false unless the caller renders + // optimization status. + bool include_legacy_optimization_status = 32; + bool include_v2_optimization_status = 33; +} + +// ListWorkloadsPaginatedRequest fetches a single keyset-paginated page of +// top-level workloads for a cluster+timerange. Additive alternative to +// GetWorkloads for large clusters; existing GetWorkloads callers are unaffected. +message ListWorkloadsPaginatedRequest { + string team_id = 1; // Unique identifier for the team. + string cluster_id = 2; // Unique identifier for the cluster. + optional google.protobuf.Timestamp start_time = 3; + optional google.protobuf.Timestamp end_time = 4; + optional WorkloadFilters filters = 5; // Optional advanced filters (same message GetWorkloads uses). + bool include_legacy_optimization_status = 6; + bool include_v2_optimization_status = 7; + int32 page_size = 8; // Max items per page; server clamps to a sane range. + string page_token = 9; // Opaque cursor from a prior response; empty = first page. + string sort_order = 10; // "asc" | "desc" (default "desc": highest sort_field value first). + string sort_field = 11; // "cost" | "cpu" | "memory" | "gpu" (default "cost"). Selects which metric orders the page. +} + +// GetWorkloadsSummaryRequest computes cluster-wide aggregate breakdowns (summary +// cards, top-N lists, treemaps) over the FULL filtered workload set in a single +// pass. Companion to ListWorkloadsPaginated: this pays the full-scan cost once +// per page load, while ListWorkloadsPaginated serves the cheap table body per +// scroll. +message GetWorkloadsSummaryRequest { + string team_id = 1; + string cluster_id = 2; + optional google.protobuf.Timestamp start_time = 3; + optional google.protobuf.Timestamp end_time = 4; + optional WorkloadFilters filters = 5; // Same WorkloadFilters message as ListWorkloadsPaginatedRequest. +} + +// WorkloadMetricEntry is a single workload's contribution to one metric. value +// is whatever the enclosing breakdown is sorted by; requested/limit/usage carry +// the full picture so the frontend can render tooltips and compute utilization +// without a second round-trip. For the cost breakdown, requested is the +// requested cost, usage is the usage cost, and limit is 0 (no limit-cost +// concept). +message WorkloadMetricEntry { + string uid = 1; + string name = 2; + string kind = 3; + string namespace = 4; + double value = 5; // The metric this breakdown is sorted by (usage for cpu/mem/gpu, requested cost for cost, overprovisioned amount for optimization_potential). + double requested = 6; // Cluster-wide requested amount for this workload (millicores / bytes / gpu-count / requested cost). + double limit = 7; // Configured limit for this workload (0 for the cost breakdown). + double usage = 8; // Observed usage for this workload (millicores / bytes / gpu-count / usage cost). + bool is_deleted = 9; // Whether this workload is soft-deleted. The frontend needs this to open the workload drawer correctly when a caller clicks a treemap/top-N node built from this entry, the same way it already does for table rows sourced from WorkloadItem.deleted_at. +} + +// WorkloadMetricBreakdown is a top-N + "other" rollup of one metric across all +// top-level workloads matching the filters. +message WorkloadMetricBreakdown { + repeated WorkloadMetricEntry top_entries = 1; // Top N by this metric, descending. + double other_value = 2; // Sum of value across everything NOT in top_entries. + int32 other_count = 3; // How many workloads are folded into other_value. + double total = 4; // Sum of value across ALL workloads (top_entries + other). + double requested_total = 5; // Sum of requested across ALL workloads; pair with total (usage) for request-utilization %. + int32 positive_count = 6; // How many workloads (top_entries + other, combined) have value > 0 for this metric. Use this, not top_entries+other_count, as the denominator for "N% of workloads account for ~80%" style displays — other_count includes workloads with zero value for this metric (e.g. a workload with no CPU usage still gets folded into "other"), which understates the percentage. + int32 top80_count = 7; // How many workloads, ranked by this metric descending, are needed to reach ~80% of total. Computed server-side over the FULL dataset, not just top_entries (which is capped at 50) — use this instead of walking top_entries client-side, which silently caps at 50 and under-reports on flatter distributions where more than 50 workloads are needed to reach 80%. +} + +// GetWorkloadsSummaryResponse carries one usage/cost breakdown per metric plus +// the total matching top-level workload count. The optimization_potential_* +// breakdowns re-rank the same workloads by the overprovisioned amount +// (requested - usage) for that metric, feeding each treemap's "show +// optimization potential" toggle without an approximation. +message GetWorkloadsSummaryResponse { + WorkloadMetricBreakdown cost = 1; + WorkloadMetricBreakdown cpu_usage = 2; + WorkloadMetricBreakdown memory_usage = 3; + WorkloadMetricBreakdown gpu_usage = 4; + int32 total_workload_count = 5; // Total top-level workloads matching filters. + WorkloadMetricBreakdown optimization_potential_cost = 6; // Ranked by overprovisioned cost (requested cost - usage cost), descending. + WorkloadMetricBreakdown optimization_potential_cpu = 7; // Ranked by overprovisioned cpu (cpu request - cpu usage, millicores), descending. + WorkloadMetricBreakdown optimization_potential_memory = 8; // Ranked by overprovisioned memory (memory request - memory usage, bytes), descending. + WorkloadMetricBreakdown optimization_potential_gpu = 9; // Ranked by overprovisioned gpu (gpu request - gpu usage, gpu-count), descending. +} + +// ListWorkloadsPaginatedResponse is one page of workloads plus the cursor for +// the next page and the total matching count (before pagination). +message ListWorkloadsPaginatedResponse { + repeated WorkloadItem workload_items = 1; // This page's workloads. + string next_page_token = 2; // Opaque cursor for the next page; empty = no more data. + int64 total_count = 3; // Total workloads matching the filters, before pagination. + int32 page_size = 4; // Effective page size applied after clamping; reflects the requested/clamped size, not len(workload_items). } // GetResourcesRequest is uset to fetch resources from db. @@ -76,8 +173,10 @@ message GetResourcesRequest { optional string cluster_id = 2; // Unique identifier for the cluster. K8sObjectKind kind = 3; // Type of object to get. optional string search = 4; // Search term to filter resources by name - + Pagination pagination = 11; // Pagination parameters + + repeated ResourceFieldFilter filters = 12; // Optional field-level filters; multiple filters AND together } // GetPodsRequest is used to fetch Pod resources from db. @@ -182,6 +281,18 @@ message GetResourcesResponse { Pagination pagination = 2; // Pagination information } +// GetResourceFilterOptionsRequest asks for the distinct filterable field values for a resource kind. +message GetResourceFilterOptionsRequest { + string team_id = 1; + optional string cluster_id = 2; + K8sObjectKind kind = 3; +} + +// GetResourceFilterOptionsResponse returns the available filter options per field. +message GetResourceFilterOptionsResponse { + repeated ResourceFilterFieldOptions options = 1; +} + // CreateClusterRequest is used to create a new cluster. message CreateClusterRequest { string team_id = 1; // Unique identifier for the team. @@ -382,6 +493,90 @@ message GetLatestContainerRequestLimitsResponse { repeated ContainerRequestLimits containers = 1; } +// GetNodeGPUMigInstancesRequest requests the most recent MIG-instance telemetry for a node. +message GetNodeGPUMigInstancesRequest { + string team_id = 1; + string cluster_id = 2; + optional string node_id = 3; // Unique identifier for the node. + optional string node_uid = 4; // alternatively -> Unique identifier for the node. +} + +// GetNodeGPUMigInstancesResponse returns the node's most recent MIG-instance telemetry. +message GetNodeGPUMigInstancesResponse { + repeated GPUMigInstance instances = 1; + optional google.protobuf.Timestamp collected_at = 2; +} + +// GetNodeGPUMigInstanceTimeseriesRequest requests per-MIG-instance +// utilization as a time series for a node over a time range. +message GetNodeGPUMigInstanceTimeseriesRequest { + string team_id = 1; + string cluster_id = 2; + optional string node_id = 3; + optional string node_uid = 4; + google.protobuf.Timestamp start_time = 5; + google.protobuf.Timestamp end_time = 6; +} + +// GPUMigInstanceDataPoint is one timestamped sample of a single MIG +// instance's utilization. +message GPUMigInstanceDataPoint { + google.protobuf.Timestamp timestamp = 1; + double tensor_active = 2; + double dram_active = 3; + double graphics_engine_active = 4; + double framebuffer_used = 5; + double framebuffer_total = 6; +} + +// GPUMigInstanceTimeseries is one MIG instance's identity plus its +// utilization samples over the requested time range. +message GPUMigInstanceTimeseries { + string mig_instance_id = 1; + string mig_profile = 2; + string device_uuid = 3; + string model_name = 4; + repeated GPUMigInstanceDataPoint points = 5; +} + +// GetNodeGPUMigInstanceTimeseriesResponse returns one series per MIG +// instance present on the node during the requested range. +message GetNodeGPUMigInstanceTimeseriesResponse { + repeated GPUMigInstanceTimeseries instances = 1; +} + +// GetContainerIndividualGPUMetricsRequest requests the most recent per-GPU breakdown per container. +message GetContainerIndividualGPUMetricsRequest { + string team_id = 1; + string cluster_id = 2; + string uid = 3; +} + +// GetContainerIndividualGPUMetricsResponse returns per-container per-GPU breakdowns. +message GetContainerIndividualGPUMetricsResponse { + repeated ContainerIndividualGPUMetrics containers = 1; +} + +// LanguageVersions holds every distinct version detected for one language +// across a cluster's workloads. +message LanguageVersions { + string language = 1; + repeated string versions = 2; +} + +// GetWorkloadLanguagesRequest requests the distinct languages/versions +// detected across a cluster's workloads (used to populate filter dropdowns). +message GetWorkloadLanguagesRequest { + string team_id = 1; + string cluster_id = 2; +} + +// GetWorkloadLanguagesResponse returns every distinct language and its +// detected versions for the requested cluster. +message GetWorkloadLanguagesResponse { + repeated LanguageVersions languages = 1; +} + // Request to get forecasted workloads message GetForecastWorkloadsRequest { string team_id = 1; @@ -596,6 +791,10 @@ message GetLatestOperatorVersionResponse { OperatorInfo trezr_info = 41; OperatorInfo trezr_helm_info = 42; + + // checkpoint-restore-operator helm chart (snapshot policies). Placeholder + // version until the DevZero-authored chart is published. + OperatorInfo snapshot_helm_info = 51; } message GalaxyGetWorkloadPerspectiveRequest { @@ -1038,6 +1237,15 @@ service K8SService { // GetWorkloads retrieves all workloads for a specific cluster. rpc GetWorkloads(GetWorkloadsRequest) returns (GetWorkloadsResponse); + // ListWorkloadsPaginated retrieves a single keyset-paginated page of top-level + // workloads for a cluster. Additive alternative to GetWorkloads for large clusters. + rpc ListWorkloadsPaginated(ListWorkloadsPaginatedRequest) returns (ListWorkloadsPaginatedResponse); + + // GetWorkloadsSummary computes cluster-wide aggregate breakdowns (cost/cpu/ + // memory/gpu top-N + other) over the full filtered workload set in one pass. + // Companion to ListWorkloadsPaginated for summary cards, top-N lists, treemaps. + rpc GetWorkloadsSummary(GetWorkloadsSummaryRequest) returns (GetWorkloadsSummaryResponse); + // GetWorkload retrieves detailed information for a specific workload. rpc GetWorkload(GetWorkloadRequest) returns (GetWorkloadResponse); @@ -1053,6 +1261,22 @@ service K8SService { // GetLatestContainerRequestLimits retrieves the most recent request/limit values per container for a workload. rpc GetLatestContainerRequestLimits(GetLatestContainerRequestLimitsRequest) returns (GetLatestContainerRequestLimitsResponse); + // GetNodeGPUMigInstances retrieves the most recent MIG-instance telemetry for a node. + // Returns an empty instances list for nodes with no MIG-partitioned GPUs. + rpc GetNodeGPUMigInstances(GetNodeGPUMigInstancesRequest) returns (GetNodeGPUMigInstancesResponse); + + // GetNodeGPUMigInstanceTimeseries retrieves per-MIG-instance utilization as + // a time series for a node over a time range. Returns an empty instances + // list for nodes with no MIG-partitioned GPUs. + rpc GetNodeGPUMigInstanceTimeseries(GetNodeGPUMigInstanceTimeseriesRequest) returns (GetNodeGPUMigInstanceTimeseriesResponse); + + // GetContainerIndividualGPUMetrics retrieves the most recent per-GPU breakdown for every + // container in a workload that has GPU data. + rpc GetContainerIndividualGPUMetrics(GetContainerIndividualGPUMetricsRequest) returns (GetContainerIndividualGPUMetricsResponse); + + // GetWorkloadLanguages retrieves the distinct detected languages/versions across a cluster's workloads. + rpc GetWorkloadLanguages(GetWorkloadLanguagesRequest) returns (GetWorkloadLanguagesResponse); + // GetForecastWorkloads retrieves all workloads for a specific cluster. rpc GetForecastWorkloads(GetForecastWorkloadsRequest) returns (GetForecastWorkloadsResponse) { option deprecated = true; @@ -1067,6 +1291,9 @@ service K8SService { // GetResources retrivers specific resource and their details from db, simulating informer. rpc GetResources(GetResourcesRequest) returns (GetResourcesResponse); + // GetResourceFilterOptions returns the distinct filterable field values for a resource kind. + rpc GetResourceFilterOptions(GetResourceFilterOptionsRequest) returns (GetResourceFilterOptionsResponse); + // GetPods retrieves Pod resources and their details from db. rpc GetPods(GetPodsRequest) returns (GetPodsResponse); @@ -1108,6 +1335,32 @@ service K8SService { // ListTags lists all tags for a team. rpc ListTags(ListTagsRequest) returns (ListTagsResponse); + + // GetMigPartedConfig retrieves the NVIDIA mig-parted ConfigMap collected + // from a cluster: the declared MIG partitioning profiles. Per-node applied + // state rides NodeDetails (mig_config_desired/mig_config_state). + rpc GetMigPartedConfig(GetMigPartedConfigRequest) returns (GetMigPartedConfigResponse); +} + +message GetMigPartedConfigRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetMigPartedConfigResponse { + // Whether a mig-parted ConfigMap has been collected for this cluster. + bool found = 1; + string name = 2; + string namespace = 3; + // Config schema version (e.g. v1). + string version = 4; + // Parsed profile map from config.yaml as JSON: + // {profile-name: [{devices, mig-enabled, mig-devices}, ...]}. + string mig_configs_json = 5; + // Original config.yaml text; authoritative when parse_error is set. + string raw = 6; + string parse_error = 7; + google.protobuf.Timestamp last_seen = 8; } // ClusterMutationService manages mutating cluster resources. diff --git a/internal/proto/api/v1/profiling.proto b/internal/proto/api/v1/profiling.proto index 53489ef..86c530b 100644 --- a/internal/proto/api/v1/profiling.proto +++ b/internal/proto/api/v1/profiling.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package api.v1; import "google/protobuf/timestamp.proto"; +import "google/type/money.proto"; import "api/v1/common.proto"; option go_package = "github.com/devzero-inc/services/dakr/gen/api/v1;gen"; @@ -12,6 +13,13 @@ option java_package = "gen.api.v1"; service ProfilingService { rpc GetWorkloadProfiles(GetWorkloadProfilesRequest) returns (GetWorkloadProfilesResponse); + + // GetWorkloadProfileAvailability is a lightweight check the frontend uses to + // decide whether the 1D/7D DB-snapshot tabs should be enabled (and default + // to) versus falling back to a live compute. It never reads snapshot payloads + // — only per-window row counts and the most recent computed_at. + rpc GetWorkloadProfileAvailability(GetWorkloadProfileAvailabilityRequest) + returns (GetWorkloadProfileAvailabilityResponse); } message ProfilingWorkloadKey { @@ -26,12 +34,36 @@ message GetWorkloadProfilesRequest { optional google.protobuf.Timestamp start_time = 11; optional google.protobuf.Timestamp end_time = 12; + + // When set to 1D or 7D, serve from the persisted workload_profile_cache + // snapshot for that window instead of computing live over start_time/end_time. + // UNSPECIFIED (default) preserves today's live-compute behavior. + ProfileWindow window = 13; } message GetWorkloadProfilesResponse { repeated WorkloadProfileResult workload_profiles = 1; } +message GetWorkloadProfileAvailabilityRequest { + string team_id = 1; + string cluster_id = 2; +} + +// ProfileWindowAvailability summarizes the cached-snapshot state for a single +// profile window. available reflects both presence (workload_count > 0) and +// freshness (latest_computed_at within the window's staleness threshold). +message ProfileWindowAvailability { + bool available = 1; + google.protobuf.Timestamp latest_computed_at = 2; + int32 workload_count = 3; +} + +message GetWorkloadProfileAvailabilityResponse { + ProfileWindowAvailability window_1d = 1; + ProfileWindowAvailability window_7d = 2; +} + message WorkloadProfileResult { string kind = 1; string uid = 2; @@ -39,6 +71,17 @@ message WorkloadProfileResult { ProfilingClassification classification = 4; double confidence = 5; ProfileDataQuality data_quality = 6; + + // The window over which this profile's distributions were computed. + google.protobuf.Timestamp window_start = 7; + google.protobuf.Timestamp window_end = 8; + + // distribution_source identifies how the percentile distributions were + // derived. "exact_timeseries" = exact percentiles over the deduplicated + // busiest-pod-per-minute series (engine path); "sketch" = GK sketch + // aggregates (tail may collapse onto max — do not label as P99 on fleet + // screens). + string distribution_source = 9; } message ContainerProfileResult { @@ -200,6 +243,45 @@ message ContainerProfileSnapshot { bool insufficient_data = 12; int64 current_cpu_request_millicores = 13; int64 current_memory_request_bytes = 14; + // Container-level startup timing (scheduled -> Ready condition). + double avg_time_to_ready_ms = 15; + double p50_time_to_ready_ms = 16; + double p75_time_to_ready_ms = 17; + double p95_time_to_ready_ms = 18; + double p99_time_to_ready_ms = 19; + double p999_time_to_ready_ms = 20; + double max_time_to_ready_ms = 21; + // Container-level startup timing (container create -> Running state). + double avg_time_to_running_ms = 22; + double p50_time_to_running_ms = 23; + double p75_time_to_running_ms = 24; + double p95_time_to_running_ms = 25; + double p99_time_to_running_ms = 26; + double p999_time_to_running_ms = 27; + double max_time_to_running_ms = 28; +} + +// WorkloadPeerConnectivity describes one outbound (egress) internal +// workload-to-workload traffic edge from the profiled workload to a destination +// workload in the same cluster, aggregated over the profile window. Only +// internal cluster traffic is represented here (destination workload +// name/namespace populated); external egress is out of scope. +message WorkloadPeerConnectivity { + // Stable owner-workload UID of the destination, resolved at ingestion. Used + // for stable peer identity — name/namespace alone can collide across workload + // replacements. + string dst_workload_uid = 1; + string dst_workload_name = 2; + string dst_namespace = 3; + // traffic_type mirrors models.TrafficType (e.g. INTERNAL_SAME_NODE, + // INTERNAL_SAME_AZ, INTERNAL_CROSS_AZ). Kept as a string to match the + // ClickHouse-stored classification. + string traffic_type = 4; + // Total transmit/receive bytes over the profile window for this edge. + int64 tx_bytes = 5; + int64 rx_bytes = 6; + // Total network cost attributed to this edge over the window. + google.type.Money cost = 7; } message WorkloadProfileSnapshot { @@ -209,4 +291,34 @@ message WorkloadProfileSnapshot { ProfileDataQuality data_quality = 4; google.protobuf.Timestamp computed_at = 5; string ui_url = 6; + // Workload-level startup aggregates, pooled across every container of every + // pod in the window. Mirrors WorkloadHealthSummary's startup fields. + double avg_time_to_ready_ms = 7; + double p50_time_to_ready_ms = 8; + double p75_time_to_ready_ms = 9; + double p95_time_to_ready_ms = 10; + double p99_time_to_ready_ms = 11; + double p999_time_to_ready_ms = 12; + double max_time_to_ready_ms = 13; + // Always false from this pipeline: the batched cluster-wide fetch does not + // compute a previous-period comparison, matching the existing precedent in + // GetWorkloadHealthSummaries's cluster-list handler. + bool startup_degraded = 14; + // False when no container_startup_lifecycles rows matched this workload in + // the window — i.e. no pod lifecycle transitions (Pending, ContainerCreating, + // Running, or Ready) were observed for it, so the zero-valued timing fields + // above mean "no data" rather than a real zero-latency startup. + // + // Reflects workload-level (time_to_ready_ms) presence only. A workload can + // have has_startup_data=false with all *_time_to_ready_ms fields zero, while + // its containers[].{avg,p50,...}_time_to_running_ms are still populated — + // e.g. containers that reached Running but never became Ready in the + // window. Do not use this flag to gate reads of container-level + // *_time_to_running_ms; check each container's own fields instead. + bool has_startup_data = 15; + + // peers carries the top outbound internal workload-to-workload traffic edges + // from this workload over the profile window (capped, ranked by tx+rx bytes). + // Only internal cluster traffic is included; external egress is excluded. + repeated WorkloadPeerConnectivity peers = 16; } diff --git a/internal/proto/api/v1/recommendation.proto b/internal/proto/api/v1/recommendation.proto index f9eb451..1c8c34e 100644 --- a/internal/proto/api/v1/recommendation.proto +++ b/internal/proto/api/v1/recommendation.proto @@ -12,6 +12,7 @@ import "google/type/money.proto"; import "api/v1/common.proto"; import "api/v1/instance.proto"; import "api/v1/k8s.proto"; +import "api/v1/hpa_connector.proto"; import "api/v1/profiling.proto"; service K8sRecommendationService { @@ -121,6 +122,26 @@ service K8sRecommendationService { rpc DeleteNodePolicy(DeleteNodePolicyRequest) returns (DeleteNodePolicyResponse); rpc SuggestedNodePolicy(SuggestedNodePolicyRequest) returns (SuggestedNodePolicyResponse); rpc SuggestedKarpenterConfig(SuggestedKarpenterConfigRequest) returns (SuggestedKarpenterConfigResponse); + // SuggestNodePolicyImprovements returns evidence-cited improvement suggestions for a + // node policy's NodePool/NodeClass fields, computed per (policy, cluster) pair over a + // profile window. Serves the latest precomputed row when fresh; recomputes + // synchronously when the row is missing or stale (policy edited since, or the rule + // engine version changed). Inline drafts (`policy` set) always compute live. + rpc SuggestNodePolicyImprovements(SuggestNodePolicyImprovementsRequest) returns (SuggestNodePolicyImprovementsResponse); + // ListClusterNodePolicySuggestions returns the latest suggestions for every node + // policy on a cluster — dakr-authored and cluster-managed mirrors alike — one entry + // per policy, so a cluster-wide triage view does not need one + // SuggestNodePolicyImprovements call per policy. Always serves precomputed rows from + // the same node_policy_suggestions table SuggestNodePolicyImprovements reads, + // populated on a cadence by a per-cluster batch job; never computes live, so a large + // cluster's worth of policies can never block this call on a synchronous evidence + // load. A policy with no row yet, or a row stale enough to recompute, is reported via + // `stale` (per policy and in aggregate) rather than blocking the response, and a + // background refresh of the whole cluster is enqueued when any row needs one. Carries + // no `original`/`suggested` NodePolicy payload per policy — accepting a suggestion + // still goes through SuggestNodePolicyImprovements for that one policy, which is + // where the compiled accept-all/per-field composition already lives. + rpc ListClusterNodePolicySuggestions(ListClusterNodePolicySuggestionsRequest) returns (ListClusterNodePolicySuggestionsResponse); // GenerateNodePoliciesFromKarpenter generates NodePolicy objects from existing Karpenter resources // (NodePools and EC2NodeClasses) for a given cluster. rpc GenerateNodePoliciesFromKarpenter(GenerateNodePoliciesFromKarpenterRequest) returns (GenerateNodePoliciesFromKarpenterResponse); @@ -150,14 +171,44 @@ service K8sRecommendationService { // render "9/10 labelled, 1 failed". rpc GetCheckpointApplyStatus(GetCheckpointApplyStatusRequest) returns (GetCheckpointApplyStatusResponse); + // GetClusterCheckpointLabelCoverage returns per-node-group counts for the + // dakr.devzero.io/checkpoint-node label across every policy-managed node + // group in a cluster: how many live nodes carry the label, how many have a + // pending SSA apply, how many failed. The FE renders an "X/Y labeled" + // subtext under the checkpoint chip in NodeGroupsTable. Source-of-truth + // for live label state; the per-batch GetCheckpointApplyStatus only sees + // nodes that were in a batch. + rpc GetClusterCheckpointLabelCoverage(GetClusterCheckpointLabelCoverageRequest) returns (GetClusterCheckpointLabelCoverageResponse); + + // ListNodeGroupCheckpointLabelState returns per-node label state for one + // node group: has-label, last apply attempt state, last error. Used by the + // NodeGroupPanelContent Nodes tab to render a per-node Checkpoint label + // column. Scoped to one node group so the per-panel-open payload stays + // bounded. + rpc ListNodeGroupCheckpointLabelState(ListNodeGroupCheckpointLabelStateRequest) returns (ListNodeGroupCheckpointLabelStateResponse); + // GetNodeAnnotationReadiness checks how many nodes in a cluster have been // annotated with AWS metadata by the Karpenter fork's node metadata controller. rpc GetNodeAnnotationReadiness(GetNodeAnnotationReadinessRequest) returns (GetNodeAnnotationReadinessResponse); + // DetectClusterAutoscaler classifies which autoscaler family manages the + // cluster from live signals (Karpenter CRDs, cluster-autoscaler Deployment, + // cast.ai provisioner Deployment / cast-labeled nodes). Used by the + // migration wizard entry to parameterize the journey by source autoscaler. + rpc DetectClusterAutoscaler(DetectClusterAutoscalerRequest) returns (DetectClusterAutoscalerResponse); + // Migration wizard state management rpc GetMigrationState(GetMigrationStateRequest) returns (GetMigrationStateResponse); rpc UpdateMigrationState(UpdateMigrationStateRequest) returns (UpdateMigrationStateResponse); + // Karpenter migration wizard + rpc GetKarpenterMigrationState(GetKarpenterMigrationStateRequest) returns (GetKarpenterMigrationStateResponse); + rpc UpdateKarpenterMigrationState(UpdateKarpenterMigrationStateRequest) returns (UpdateKarpenterMigrationStateResponse); + rpc DetectKarpenterOwnershipConflicts(DetectKarpenterOwnershipConflictsRequest) returns (DetectKarpenterOwnershipConflictsResponse); + rpc AcknowledgeKarpenterOwnershipConflict(AcknowledgeKarpenterOwnershipConflictRequest) returns (AcknowledgeKarpenterOwnershipConflictResponse); + rpc GetKarpenterSourceResources(GetKarpenterSourceResourcesRequest) returns (GetKarpenterSourceResourcesResponse); + rpc GetKarpenterAdoptionStatus(GetKarpenterAdoptionStatusRequest) returns (GetKarpenterAdoptionStatusResponse); + // NodePool validation phone-home rpc ReportNodePoolValidation(ReportNodePoolValidationRequest) returns (ReportNodePoolValidationResponse); rpc GetNodePoolValidations(GetNodePoolValidationsRequest) returns (GetNodePoolValidationsResponse); @@ -172,6 +223,7 @@ service K8sRecommendationService { rpc GetInstanceSizes(GetInstanceSizesRequest) returns (GetInstanceSizesResponse); rpc GetInstanceCategories(GetInstanceCategoriesRequest) returns (GetInstanceCategoriesResponse); + rpc GetInstanceShapes(GetInstanceShapesRequest) returns (GetInstanceShapesResponse); rpc GetInstanceCPUs(GetInstanceCPUsRequest) returns (GetInstanceCPUsResponse); rpc GetInstanceTypeNames(GetInstanceTypeNamesRequest) returns (GetInstanceTypeNamesResponse); @@ -181,6 +233,11 @@ service K8sRecommendationService { rpc CreatePodDisruptionBudget(CreatePodDisruptionBudgetRequest) returns (CreatePodDisruptionBudgetResponse); // GetPDBRecommendationForWorkload retrieves the existing PDB recommendation for a workload (if any) rpc GetPDBRecommendationForWorkload(GetPDBRecommendationForWorkloadRequest) returns (GetPDBRecommendationForWorkloadResponse); + // ListWorkloadStructuralHealth returns every workload with at least one open + // structural-health finding -- disruption-fragility (single-replica / no-PDB / + // ineffective-PDB) and any net-new structural check (e.g. topology- + // concentration) -- composed into one per-workload report each. + rpc ListWorkloadStructuralHealth(ListWorkloadStructuralHealthRequest) returns (ListWorkloadStructuralHealthResponse); // Storage Recommendation Policies rpc CreateStorageRecommendationPolicy(CreateStorageRecommendationPolicyRequest) returns (CreateStorageRecommendationPolicyResponse); @@ -216,11 +273,32 @@ service K8sRecommendationService { rpc CreateWorkloadOptimizationPolicy(CreateWorkloadOptimizationPolicyRequest) returns (CreateWorkloadOptimizationPolicyResponse); rpc ListWorkloadOptimizationPolicies(ListWorkloadOptimizationPoliciesRequest) returns (ListWorkloadOptimizationPoliciesResponse); rpc GetWorkloadOptimizationPolicy(GetWorkloadOptimizationPolicyRequest) returns (GetWorkloadOptimizationPolicyResponse); + rpc GetWorkloadOptimizationPolicyByWorkload(GetWorkloadOptimizationPolicyByWorkloadRequest) returns (GetWorkloadOptimizationPolicyByWorkloadResponse); rpc UpdateWorkloadOptimizationPolicy(UpdateWorkloadOptimizationPolicyRequest) returns (UpdateWorkloadOptimizationPolicyResponse); + // The sole way to change an existing policy's disabled state. See message doc. + rpc ToggleWorkloadOptimizationPolicyDisabled(ToggleWorkloadOptimizationPolicyDisabledRequest) returns (ToggleWorkloadOptimizationPolicyDisabledResponse); rpc DeleteWorkloadOptimizationPolicy(DeleteWorkloadOptimizationPolicyRequest) returns (DeleteWorkloadOptimizationPolicyResponse); + // Dry-run: which workloads would this policy's targeting selectors match, + // right now, without saving anything. Works against unsaved/edited + // targeting fields (policy_id optional — set in edit mode to distinguish + // "already owned by this policy" from "owned by someone else"). + rpc PreviewWorkloadOptimizationPolicyMatches(PreviewWorkloadOptimizationPolicyMatchesRequest) returns (PreviewWorkloadOptimizationPolicyMatchesResponse); + + // Scheduler Policies: CRUD + targeting preview + rpc CreateSchedulerPolicy(CreateSchedulerPolicyRequest) returns (CreateSchedulerPolicyResponse); + rpc ListSchedulerPolicies(ListSchedulerPoliciesRequest) returns (ListSchedulerPoliciesResponse); + rpc UpdateSchedulerPolicy(UpdateSchedulerPolicyRequest) returns (UpdateSchedulerPolicyResponse); + rpc ToggleSchedulerPolicyDisabled(ToggleSchedulerPolicyDisabledRequest) returns (ToggleSchedulerPolicyDisabledResponse); + rpc DeleteSchedulerPolicy(DeleteSchedulerPolicyRequest) returns (DeleteSchedulerPolicyResponse); + rpc PreviewSchedulerPolicyTargets(PreviewSchedulerPolicyTargetsRequest) returns (PreviewSchedulerPolicyTargetsResponse); + // Read RPC for the enrolled-workloads drill-down (spec 4.5): every + // enrollment episode for a policy, regardless of lifecycle state. + rpc ListSchedulerPolicyEnrollments(ListSchedulerPolicyEnrollmentsRequest) returns (ListSchedulerPolicyEnrollmentsResponse); // MPA V3: Workload Rules (CRUD) rpc UpsertManualWorkloadRule(UpsertManualWorkloadRuleRequest) returns (UpsertManualWorkloadRuleResponse); + // The sole way to change an EXISTING rule's disabled state. See message doc. + rpc ToggleWorkloadRuleDisabled(ToggleWorkloadRuleDisabledRequest) returns (ToggleWorkloadRuleDisabledResponse); rpc PreviewWorkloadRule(PreviewWorkloadRuleRequest) returns (PreviewWorkloadRuleResponse); rpc GetWorkloadRulesByPolicy(GetWorkloadRulesByPolicyRequest) returns (GetWorkloadRulesByPolicyResponse); rpc ListWorkloadRules(ListWorkloadRulesRequest) returns (ListWorkloadRulesResponse); @@ -228,11 +306,64 @@ service K8sRecommendationService { rpc GetWorkloadRuleByWorkload(GetWorkloadRuleByWorkloadRequest) returns (GetWorkloadRuleByWorkloadResponse); rpc GetWorkloadByWorkloadRule(GetWorkloadByWorkloadRuleRequest) returns (GetWorkloadByWorkloadRuleResponse); rpc DeleteWorkloadRule(DeleteWorkloadRuleRequest) returns (DeleteWorkloadRuleResponse); + rpc DeleteAllWorkloadRules(DeleteAllWorkloadRulesRequest) returns (DeleteAllWorkloadRulesResponse); + rpc BulkDeleteWorkloadRules(BulkDeleteWorkloadRulesRequest) returns (BulkDeleteWorkloadRulesResponse); + rpc BulkToggleWorkloadRulesDisabled(BulkToggleWorkloadRulesDisabledRequest) returns (BulkToggleWorkloadRulesDisabledResponse); rpc GetWorkloadContainerNames(GetWorkloadContainerNamesRequest) returns (GetWorkloadContainerNamesResponse); rpc BatchAutoOptimizeWorkloads(BatchAutoOptimizeWorkloadsRequest) returns (BatchAutoOptimizeWorkloadsResponse); + rpc BatchUpsertManualWorkloadRules(BatchUpsertManualWorkloadRulesRequest) returns (BatchUpsertManualWorkloadRulesResponse); + rpc BatchPreviewWorkloadRules(BatchPreviewWorkloadRulesRequest) returns (BatchPreviewWorkloadRulesResponse); + rpc ApplyOneTimeOptimization(ApplyOneTimeOptimizationRequest) returns (ApplyOneTimeOptimizationResponse); + + // DeleteRuleAndApplyRecommendation is the v2 panic button: atomically deletes a WorkloadRule + // (triggering CRD removal from the cluster) and creates a one-time WorkloadRecommendation + // from user-adjusted values. After this call the workload receives no further auto-recommendations + // until a new rule is created. + rpc DeleteRuleAndApplyRecommendation(DeleteRuleAndApplyRecommendationRequest) returns (DeleteRuleAndApplyRecommendationResponse); // Get current node pool config status and recent apply history for a cluster rpc GetNodeRecommendationStatus(GetNodeRecommendationStatusRequest) returns (GetNodeRecommendationStatusResponse); + + // ---- Snapshot policies (resilience) — spec §5 ---- + rpc CreateSnapshotPolicies(CreateSnapshotPoliciesRequest) returns (CreateSnapshotPoliciesResponse); + rpc ListSnapshotPolicies(ListSnapshotPoliciesRequest) returns (ListSnapshotPoliciesResponse); + rpc UpdateSnapshotPolicy(UpdateSnapshotPolicyRequest) returns (UpdateSnapshotPolicyResponse); + rpc DeleteSnapshotPolicy(DeleteSnapshotPolicyRequest) returns (DeleteSnapshotPolicyResponse); + rpc CreateSnapshotPolicyTargets(CreateSnapshotPolicyTargetsRequest) returns (CreateSnapshotPolicyTargetsResponse); + rpc ListSnapshotPolicyTargets(ListSnapshotPolicyTargetsRequest) returns (ListSnapshotPolicyTargetsResponse); + rpc UpdateSnapshotPolicyTarget(UpdateSnapshotPolicyTargetRequest) returns (UpdateSnapshotPolicyTargetResponse); + rpc DeleteSnapshotPolicyTarget(DeleteSnapshotPolicyTargetRequest) returns (DeleteSnapshotPolicyTargetResponse); + + // ---- Forensic snapshot policies (runtime security) — spec §5 ---- + rpc CreateForensicSnapshotPolicies(CreateForensicSnapshotPoliciesRequest) returns (CreateForensicSnapshotPoliciesResponse); + rpc ListForensicSnapshotPolicies(ListForensicSnapshotPoliciesRequest) returns (ListForensicSnapshotPoliciesResponse); + rpc UpdateForensicSnapshotPolicy(UpdateForensicSnapshotPolicyRequest) returns (UpdateForensicSnapshotPolicyResponse); + rpc DeleteForensicSnapshotPolicy(DeleteForensicSnapshotPolicyRequest) returns (DeleteForensicSnapshotPolicyResponse); + rpc CreateForensicSnapshotPolicyTargets(CreateForensicSnapshotPolicyTargetsRequest) returns (CreateForensicSnapshotPolicyTargetsResponse); + rpc ListForensicSnapshotPolicyTargets(ListForensicSnapshotPolicyTargetsRequest) returns (ListForensicSnapshotPolicyTargetsResponse); + rpc UpdateForensicSnapshotPolicyTarget(UpdateForensicSnapshotPolicyTargetRequest) returns (UpdateForensicSnapshotPolicyTargetResponse); + rpc DeleteForensicSnapshotPolicyTarget(DeleteForensicSnapshotPolicyTargetRequest) returns (DeleteForensicSnapshotPolicyTargetResponse); + // Arms a forensic capture run: the ONLY way run_generation moves. + rpc TriggerForensicSnapshotRun(TriggerForensicSnapshotRunRequest) returns (TriggerForensicSnapshotRunResponse); + + // ListReferencedAuthentications returns the distinct KEDA authenticationRef objects + // referenced by active WorkloadRules in a cluster. Each entry carries the + // name, kind (TriggerAuthentication or ClusterTriggerAuthentication), + // the count of rules that reference it, and the namespaces those rules live in. + // No credential or secret data is returned. + rpc ListReferencedAuthentications(ListReferencedAuthenticationsRequest) returns (ListReferencedAuthenticationsResponse); + + // ---- Targeting preview + read model + delivery status ---- + rpc PreviewSnapshotPolicyTargetMatches(PreviewSnapshotPolicyTargetMatchesRequest) returns (PreviewSnapshotPolicyTargetMatchesResponse); + rpc PreviewForensicSnapshotPolicyTargetMatches(PreviewForensicSnapshotPolicyTargetMatchesRequest) returns (PreviewForensicSnapshotPolicyTargetMatchesResponse); + rpc GetSnapshotPolicyTargetRenderedScope(GetSnapshotPolicyTargetRenderedScopeRequest) returns (GetSnapshotPolicyTargetRenderedScopeResponse); + rpc GetForensicSnapshotPolicyTargetRenderedScope(GetForensicSnapshotPolicyTargetRenderedScopeRequest) returns (GetForensicSnapshotPolicyTargetRenderedScopeResponse); + rpc GetSnapshotRecommendationStatus(GetSnapshotRecommendationStatusRequest) returns (GetSnapshotRecommendationStatusResponse); + rpc GetForensicSnapshotRecommendationStatus(GetForensicSnapshotRecommendationStatusRequest) returns (GetForensicSnapshotRecommendationStatusResponse); + // Compiled-YAML previews are implemented by the phase-3 compiler; until + // then the handlers return CodeUnimplemented. + rpc PreviewSnapshotRecommendationConfig(PreviewSnapshotRecommendationConfigRequest) returns (PreviewSnapshotRecommendationConfigResponse); + rpc PreviewForensicSnapshotRecommendationConfig(PreviewForensicSnapshotRecommendationConfigRequest) returns (PreviewForensicSnapshotRecommendationConfigResponse); } message GetRecommendationsRequest { @@ -362,12 +493,10 @@ message GetPreviewWorkloadRecommendationRequest { // Moment in time for which the recommendations are requested // If not set, the current time is used google.protobuf.Timestamp timestamp = 8; - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - google.protobuf.Duration vpa_lookback = 9; - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - google.protobuf.Duration hpa_lookback = 10; + // 9, 10: removed vpa_lookback / hpa_lookback — never read by either engine. + // The metrics window comes from the policy's loopback_period_seconds. + reserved 9, 10; + reserved "vpa_lookback", "hpa_lookback"; bool include_deleted = 21; } @@ -384,12 +513,10 @@ message GetPreviewWorkloadRecommendationsRequest { // Moment in time for which the recommendations are requested // If not set, the current time is used google.protobuf.Timestamp timestamp = 5; - // Duration to look back for vertical scaling recommendations - // If not set, defaults to policy settings, if those are not set - 24 hours - google.protobuf.Duration vpa_lookback = 6; - // Duration to look back for horizontal scaling recommendations - // If not set, defaults to policy settings, if those are not set - 5 minutes - google.protobuf.Duration hpa_lookback = 7; + // 6, 7: removed vpa_lookback / hpa_lookback — never read by either engine. + // The metrics window comes from the policy's loopback_period_seconds. + reserved 6, 7; + reserved "vpa_lookback", "hpa_lookback"; bool include_deleted = 21; } @@ -747,8 +874,10 @@ message WorkloadPolicyTarget { optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; // Target specific workload kinds optional RegexPattern namespace_pattern = 17; // Target namespaces by name pattern + repeated string workload_names_not_in = 18; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 19; // Exclude specific workload kinds - repeated string node_group_names = 21; // target workloads running on specific nodes + repeated string node_group_names = 21 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. repeated string cluster_ids = 31; @@ -773,8 +902,10 @@ message CreateWorkloadPolicyTargetRequest { optional RegexPattern name_pattern = 14; // Target workloads by name pattern optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; - repeated string node_group_names = 17; + repeated string node_group_names = 17 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 18; // Target namespaces by name pattern + repeated string workload_names_not_in = 19; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 20; // Exclude specific workload kinds repeated string cluster_ids = 21; } @@ -820,8 +951,10 @@ message UpdateWorkloadPolicyTargetRequest { optional RegexPattern name_pattern = 14; // Target workloads by name pattern optional LabelSelector annotation_selector = 15; // Target workloads by annotations repeated string workload_names = 16; - repeated string node_group_names = 17; + repeated string node_group_names = 17 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 18; // Target namespaces by name pattern + repeated string workload_names_not_in = 19; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 20; // Exclude specific workload kinds optional string policy_id = 21; // should only be set when target needs to be attached to diff policy @@ -873,8 +1006,10 @@ message PreviewWorkloadPolicyTargetMatchesRequest { optional RegexPattern name_pattern = 6; // Target workloads by name pattern optional LabelSelector annotation_selector = 7; // Target workloads by annotations repeated string workload_names = 8; - repeated string node_group_names = 9; + repeated string node_group_names = 9 [deprecated = true]; // Deprecated: unused by any active target; removed from the UI. optional RegexPattern namespace_pattern = 10; // Target namespaces by name pattern + repeated string workload_names_not_in = 11; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 12; // Exclude specific workload kinds } message PreviewWorkloadPolicyTargetMatchesResponse { @@ -894,10 +1029,24 @@ message GetPreviewWorkloadPolicyTargetRecommendationsRequest { repeated string workload_names = 9; repeated string node_group_names = 10; optional RegexPattern namespace_pattern = 11; // Target namespaces by name pattern + repeated string workload_names_not_in = 12; // Exclude specific workload names + repeated K8sObjectKind kind_filter_not_in = 13; // Exclude specific workload kinds bool include_deleted = 21; repeated string cluster_ids = 31; + + // Priority of the previewed target; used to determine who wins when a + // competing target exists for the same workload. When absent, collision + // detection is skipped and collisions_by_workload_uid is empty. + optional int32 priority = 32; +} + +message WorkloadCollisionInfo { + string policy_id = 1; + string policy_name = 2; + string target_id = 3; + string target_name = 4; } message GetPreviewWorkloadPolicyTargetRecommendationsResponse { @@ -905,6 +1054,12 @@ message GetPreviewWorkloadPolicyTargetRecommendationsResponse { repeated WorkloadItem workload_items = 2; // Map from workload UID to aggregated percentile summaries across all containers map workload_percentiles = 3; + // Workloads where a competing policy's target beats the previewed target. + // Absent entries mean the current policy wins or no competing target exists. + map collisions_by_workload_uid = 4; + // UIDs of workloads skipped because they are managed by optimization rules (MPA v2). + // Policy-based optimization cannot be applied to these workloads. + repeated string rule_managed_workload_uids = 5; } // WorkloadPercentileSummary aggregates percentile metrics across all containers of a workload. @@ -1041,6 +1196,26 @@ message BalanceGetRecommendationsRequest { // Sent when RuleEvaluatorController generates a recommendation from evaluating a WorkloadRule WorkloadRecommendation in_cluster_recommendation = 21; + // Snapshot policies (spec §8): periodic full snapshot of the + // dakr-managed criu.org CR statuses from the cluster. The operator + // emits no Kubernetes Events — CR status is the entire runtime + // observability channel. dakr ingests with full-sync semantics + // (upsert reported, soft-delete unreported). + SnapshotCRStatusReport snapshot_cr_status_report = 31; + + // Periodic full-sync report of scheduler enrollment state observed + // in-cluster: original-scheduler captures at first application. + // Full-sync semantics mirror SnapshotCRStatusReport. Revert acks do + // NOT ride this message — they use apply with + // RECOMMENDATION_TYPE_SCHEDULER_POLICY and the enrollment id. + SchedulerEnrollmentReport scheduler_enrollment_report = 32; + + // Fail-open scheduler revert events observed by the admission + // failsafe: pods steered away from an unhealthy tracked scheduler at + // CREATE time. Batched per stream tick, replica-local (each tunr + // replica reports only what its own webhook process observed). + SchedulerRevertEventReport scheduler_revert_event_report = 33; + // health check APIs OperatorHealth operator_health = 71; AgentHealth agent_health = 81; @@ -1080,6 +1255,19 @@ message BalanceGetRecommendationsResponse { // KarpenterSettings CRD push-down KarpenterSettingsRecommendation karpenter_settings = 62; + + // Snapshot policy CRD bundles (checkpoint-restore-operator, spec §7) + SnapshotRecommendation snapshot_recommendation = 63; + ForensicSnapshotRecommendation forensic_snapshot_recommendation = 64; + + // HPA connector CRD push-down + BatchHPAConnectors batch_hpa_connectors = 65; + + // Full desired scheduler-policy set for this cluster plus pending + // revert instructions. Hash-gated full-sync push (see + // scheduler_policy_delivery.go); tunr reconciles it into the + // cluster-scoped SchedulerPolicy CRD and executes reverts. + SchedulerPolicySync scheduler_policy_sync = 66; } string request_id = 99; // optional } @@ -1134,15 +1322,58 @@ message WorkloadRule { // in-place pod vertical scaling instead of triggering pod restarts. bool use_in_place_vertical_scaling = 70; + // Opt-in: allow an in-place resize to LOWER a container's memory limit. + // Only consulted when use_in_place_vertical_scaling is true, and it never + // relaxes the Kubernetes version gate — a decrease still additionally + // requires a cluster new enough to accept one. Default false because + // shrinking a live container's memory limit can OOM-kill it. + bool allow_in_place_memory_limit_decrease = 71; + // UI display fields (not sent to cluster, only used for listing) string status = 80; // "active" or "inactive" string sync_status = 81; // "pending", "synced", or "failed" string current_source = 82; // "crd", "policy", "auto_optimization", "manual", "pulumi_manual", "pulumi_auto", "terraform_manual", "terraform_auto" google.protobuf.Timestamp created_at = 83; google.protobuf.Timestamp updated_at = 84; + // True when the underlying workload (cluster_id, namespace, kind, name) + // is no longer present in the cluster. Populated by ListWorkloadRules + // at read time via a presence lookup against the workload tables — NOT + // persisted on the rule itself. Orthogonal to `status` (which reflects + // whether the rule's policy is enabled) — an Active rule can be + // orphaned if its workload was deleted, and will be cleaned up by the + // orphan janitor after a grace period. + bool is_orphaned = 85; // Per-container resource configurations (VPA). When empty, workload-level rules apply to all containers. repeated ContainerResourceRuleConfig containers = 90; + + // JVM heap optimization overrides for this rule. + JVMHeapRuleConfig jvm_heap_rule = 91; + + // Per-rule override of the JVM CPU startup floor (millicores). Standalone — + // deliberately NOT inside jvm_heap_rule and not gated by its enabled flag + // (the floor is always-on for detected JVMs). Unset = inherit policy / + // system default (75m). Explicit 0 = floor disabled for this rule. + optional int64 jvm_cpu_startup_floor_millicores = 92; + + // Rule-wide on/off switch, independent of `status`/`sync_status`. A + // disabled rule still exists (status stays "active") but every CP loop + // and the in-cluster operator treat it as a full no-op: no further + // regeneration, no evaluation, no emergency OOM/throttle response. + bool disabled = 93; + + // Per-rule override of the metrics lookback window (seconds). Unset = + // inherit the owning policy's window, else the 7-day default. + // + // Mirrored onto the CRD for visibility only — the operator evaluates off + // zxporter's rolling 5-minute window and never queries history. + optional int32 lookback_period_seconds = 94; + + // KEDA ScaledObject template authored by dakr and carried to tunr. + // When set, tunr owns the ScaledObject lifecycle (create/update/delete) + // rather than generating its own HPA. Renumbered 94→95 on the main merge + // (main took 94 for lookback_period_seconds). + optional KEDAScaledObjectTemplate keda_scaled_object = 95; } message ResourceRuleConfig { @@ -1169,6 +1400,50 @@ message ResourceRuleConfig { // the produced BaseRequest differs from the user's expectation. Not // persisted — recomputed on every generation/preview. repeated string notes = 14; + + // Recommendation floor (rules/v2, request only): the recommended request + // is never lowered below floor_percent% (1-100) of initial_request, the + // cached immutable baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. initial_request is editable + // through the generic manual-rule surface like min_request (no special + // protection). Unset floor_percent = floor disabled. Resolved in the + // in-cluster tunr evaluator, not pre-resolved by dakr. + optional int64 initial_request = 15; + optional int64 floor_percent = 16; + + // Recommendation ceiling (rules/v2, request only): the recommended request + // is never raised above ceiling_percent% (1-1000) of initial_request. The + // mirror of floor_percent; a ceiling below 100 is intentionally allowed as + // a baseline-relative cap distinct from max_request. Unset = ceiling + // disabled. Resolved in the in-cluster tunr evaluator, not pre-resolved by + // dakr. + optional int64 ceiling_percent = 17; + + // Limit floor/ceiling (rules/v2, limit only): the recommended limit is + // never lowered below limit_floor_percent% (1-100) nor raised above + // limit_ceiling_percent% (1-1000) of initial_limit, the cached immutable + // initial-limit baseline sourced from workload_resource_baselines and + // refreshed by GenerateAutoRule every cycle. Applied only when limits + // adjustment is enabled and limits removal is not; the recommended + // request always wins over the limit ceiling (the limit is never clamped + // below the request). Unset = bound disabled. Resolved in the in-cluster + // tunr evaluator, not pre-resolved by dakr. + optional int64 initial_limit = 18; + optional int64 limit_floor_percent = 19; + optional int64 limit_ceiling_percent = 20; + + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + optional bool request_use_rss = 21; + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + optional bool limit_use_rss = 22; + + // Memory-only: request-equivalent baseline on the *limit* basis (bytes). The + // generator emits this only when the limit basis differs from the request + // basis (RSS vs working set); 0 otherwise, meaning "derive the limit as + // request × limit_multiplier" (byte-identical default). NOT pre-multiplied. + // Consumed by the in-cluster tunr evaluator's normal-mode baseline path. + int64 base_limit = 23; } message HPAMetricTrigger { @@ -1179,6 +1454,7 @@ message HPAMetricTrigger { map metadata = 5; // Free-form key-value for external scalers (e.g. serverAddress, query for Prometheus) optional string server_address = 6; // Frontend-friendly: Prometheus server URL (packed into metadata by service layer) optional string query = 7; // Frontend-friendly: PromQL query (packed into metadata by service layer) + optional string connector_id = 8; // References HPAConnector by dakr-side UUID } // HPABehavior, HPAScalingRules, HPAScalingPolicy are defined in common.proto @@ -1205,6 +1481,17 @@ message ContainerResourceConfig { // Human-readable annotations from the engine for this container. // See ResourceRuleConfig.notes for semantics. repeated string notes = 9; + + // Memory-only: size the memory REQUEST recommendation from RSS instead of working set. + optional bool request_use_rss = 10; + // Memory-only: derive the limit from an RSS-based recommendation instead of working set + // (the limit multiplier still applies to whichever basis is selected). + optional bool limit_use_rss = 11; + + // Memory-only: request-equivalent baseline on the *limit* basis (bytes), + // emitted only when the limit basis differs from the request basis; 0 + // otherwise. See ResourceRuleConfig.base_limit for full semantics. + int64 base_limit = 12; } // Per-container resource rule config with CPU/Memory/GPU. @@ -1215,21 +1502,31 @@ message ContainerResourceRuleConfig { ContainerResourceConfig gpu_rule = 4; } +// JVMHeapRuleConfig mirrors the policy-level JVM heap knobs as per-rule overrides. +// Gated by enabled; the optional knobs are overrides — unset = use the default. +message JVMHeapRuleConfig { + bool enabled = 1; + optional float target_percentile = 2; + optional float headroom_multiplier = 3; + optional float non_heap_overhead_percent = 4; + optional int64 non_heap_overhead_bytes = 5; + optional int64 min_heap_bytes = 6; + optional int64 max_heap_bytes = 7; + bool prefer_container_support = 8; +} + message HPARuleConfig { + reserved 4, 5, 12; + reserved "target_utilization", "primary_metric", "target_memory_utilization"; bool enabled = 1; optional int32 min_replicas = 2; optional int32 max_replicas = 3; - optional float target_utilization = 4; - optional HPAMetricType primary_metric = 5; optional float max_replica_change_percent = 6; repeated HPAMetricTrigger metrics = 7; optional HPABehavior behavior = 8; optional string composite_formula = 9; optional HPAFallback fallback = 10; optional int32 scale_down_cooldown_seconds = 11; - // Target memory utilization (0.0-1.0). Separate from target_utilization (CPU) - // to allow independent tuning per resource. - optional float target_memory_utilization = 12; } message EmergencyResponseConfig { @@ -1242,6 +1539,48 @@ message EmergencyResponseConfig { float cpu_throttling_multiplier = 7; } +// KEDAScaledObjectTemplate is the user-authored KEDA ScaledObject configuration +// carried from dakr to the in-cluster tunr operator. tunr materialises it into +// a live ScaledObject and owns the lifecycle (create/update/delete). +message KEDAScaledObjectTemplate { + repeated KEDATrigger triggers = 1; + optional int32 min_replica_count = 2; + optional int32 max_replica_count = 3; + optional int32 idle_replica_count = 4; + optional int32 polling_interval = 5; + optional int32 cooldown_period = 6; + optional int32 initial_cooldown_period = 7; + optional KEDAFallback fallback = 8; + optional KEDAAdvanced advanced = 9; +} + +message KEDATrigger { + string type = 1; + string name = 2; + map metadata = 3; + string metric_type = 4; + optional KEDAAuthenticationRef authentication_ref = 5; + bool use_cached_metrics = 6; +} + +message KEDAAuthenticationRef { + string name = 1; + string kind = 2; +} + +message KEDAFallback { + int32 failure_threshold = 1; + int32 replicas = 2; + string behavior = 3; +} + +message KEDAAdvanced { + bool restore_to_original_replica_count = 1; + // advanced_behavior_json carries the k8s HorizontalPodAutoscalerBehavior as an + // opaque JSON string so dakr never re-models k8s types; tunr unmarshals it. + string advanced_behavior_json = 2; +} + // PercentileValues contains pre-computed percentile values for a single resource axis message PercentileValues { int64 p50 = 1; @@ -1280,6 +1619,11 @@ message BatchWorkloadRules { repeated string rule_ids_to_delete = 2; // rule IDs whose CRDs should be deleted from cluster } +message BatchHPAConnectors { + repeated HPAConnector connectors = 1; + repeated string connector_ids_to_delete = 2; +} + message WorkloadWithActiveRecommendations { repeated WorkloadIdentifier workloads = 1; // picking this pattern since caller has to iterate over the list anyway // TODO support pagination @@ -1361,6 +1705,43 @@ message GetPDBRecommendationForWorkloadResponse { optional GenericResourceRecommendation recommendation = 1; } +// StructuralHealthFinding is a single structural-health finding for a workload, +// composed from either disruption-fragility or a net-new structural check (e.g. +// topology-concentration). See dakr/services/structuralhealth. +message StructuralHealthFinding { + // "DISRUPTION_FRAGILITY" | "TOPOLOGY_CONCENTRATION" + string check_type = 1; + // "HIGH" | "MEDIUM" + string severity = 2; + // e.g. "NO_PDB_MULTI_REPLICA" (fragility) or "ALL_REPLICAS_ONE_NODE" (topology) + string reason_code = 3; + google.protobuf.Timestamp first_seen_at = 4; + // Check-specific structured payload (e.g. replica_count/pdb_name for + // fragility findings, node_count for topology findings), JSON-encoded since + // its shape varies per check type rather than being modeled as a oneof. + string detail_json = 5; +} + +// WorkloadStructuralHealth is one workload's fully composed set of open +// structural-health findings across every check type. +message WorkloadStructuralHealth { + string cluster_id = 1; + string namespace = 2; + string kind = 3; // "Deployment" | "StatefulSet" + string name = 4; + string uid = 5; + repeated StructuralHealthFinding findings = 6; +} + +message ListWorkloadStructuralHealthRequest { + string cluster_id = 1; + string team_id = 2; +} + +message ListWorkloadStructuralHealthResponse { + repeated WorkloadStructuralHealth workloads = 1; +} + message ReconcileWorkload { K8sObjectKind kind = 1; string workload_name = 2; @@ -1520,6 +1901,20 @@ message ContainerRecommendation { ResourceRecommendation recommended_limit = 5; double optimization_score = 6; + + // Per-element env var mutations for this container (merge key: name). + // The operator merges these into the live container.Env; entries not + // referenced here are left untouched. + repeated EnvVarMutation env_mutations = 11; + + // Per-flag command/arg mutations for this container. Used to carry + // command-line directives (e.g. JVM -Xmx) already lowered by the control + // plane into a concrete flag edit. + repeated CommandArgMutation command_arg_mutations = 12; + + // Whether this container was observed OOM-killed, driving the memory + // recommendation. + bool oom_triggered = 13; } message KedaScaledObjectRecommendation { @@ -1549,6 +1944,55 @@ enum ActionToTake { ACTION_TO_TAKE_IGNORE = 2; // dont fuck with this } +// MutationAction is the per-element analog of ActionToTake for list/map-shaped +// fields (env vars, nodeSelector, tolerations, command/arg flags). The action +// lives on each element so the operator can merge deltas into the live spec +// instead of replacing the whole list. IGNORE is implicit: omit the element. +enum MutationAction { + MUTATION_ACTION_UNSPECIFIED = 0; + MUTATION_ACTION_UPSERT = 1; // add the element, or replace the one matching the merge key + MUTATION_ACTION_REMOVE = 2; // delete the element matching the merge key +} + +// ArgTarget selects which container field a CommandArgMutation edits. +enum ArgTarget { + ARG_TARGET_UNSPECIFIED = 0; + ARG_TARGET_ARGS = 1; // container.args + ARG_TARGET_COMMAND = 2; // container.command +} + +// EnvVarMutation is a per-element edit to a container's env list. Merge key is +// `name`. value_from (secret/configMap refs) is intentionally deferred. +message EnvVarMutation { + MutationAction action = 1; + string name = 2; // merge key + optional string value = 3; // literal value for UPSERT +} + +// CommandArgMutation is a per-flag edit to a container's command or args list. +// The control plane lowers higher-level intent (e.g. JVM heap sizing) into this +// concrete flag edit so the operator stays generic. +message CommandArgMutation { + MutationAction action = 1; + ArgTarget target = 2; // command vs args + string flag = 3; // e.g. "-Xmx" + optional string value = 4; // e.g. "512m"; empty for valueless flags +} + +// NodeSelectorMutation is a per-key edit to the pod's nodeSelector map. +message NodeSelectorMutation { + MutationAction action = 1; + string key = 2; // merge key + optional string value = 3; // value for UPSERT +} + +// TolerationMutation is a per-element edit to the pod's tolerations list. +// Element identity is the full tuple. +message TolerationMutation { + MutationAction action = 1; + Toleration toleration = 2; +} + // The pod this Toleration is attached to tolerates any taint that matches // the triple using the matching operator . message Toleration { @@ -1692,6 +2136,15 @@ message VerticalScalingOptimizationTarget { // Whether to actively remove limits from workloads (CPU only for now). // Takes precedence over limits_adjustment_enabled when true. bool limits_removal_enabled = 42; + + // Memory-only: when true, size the memory REQUEST recommendation from RSS + // (resident set size) instead of the default working set. Ignored for CPU/GPU. + optional bool request_use_rss = 43; + + // Memory-only: when true, the limit is derived from an RSS-based recommendation + // instead of the default working-set recommendation (the Limit multiplier still + // applies to whichever basis is selected). Ignored for CPU/GPU. + optional bool limit_use_rss = 44; } message HorizontalScalingOptimizationTarget { @@ -1812,10 +2265,8 @@ message WorkloadRecommendationPolicy { // Minutes to wait between applying recommendations (prevents thrashing) optional int32 cooldown_minutes = 96; - // Deprecated: no longer used. The legacy policy flow no longer creates workload rules. - // Workload rules are created via auto-optimization or the new WorkloadOptimizationPolicy flow. - // Field retained for wire-compatibility; will be reserved in a future cleanup. - bool enable_incluster_mpa = 97; + reserved 97; + reserved "enable_incluster_mpa"; // Feature flag: Enable In-Place Pod Vertical Scaling for this policy. // Requires Kubernetes >= v1.33 on all attached clusters. @@ -1823,6 +2274,13 @@ message WorkloadRecommendationPolicy { // without triggering rolling restarts. bool enable_in_place_vertical_scaling = 103; + // Opt-in escape hatch for the riskiest half of in-place scaling: allowing a + // resize to LOWER a container's memory limit on a running pod. Gated behind + // enable_in_place_vertical_scaling and, independently, behind the cluster's + // Kubernetes version — this flag only ever removes DevZero's own refusal, it + // never makes an unsupported cluster accept the decrease. Default false. + bool allow_in_place_memory_limit_decrease = 121; + // Policy-driven automation: enable PDB creation for workloads under this policy bool pdb_enabled = 98; @@ -1834,6 +2292,53 @@ message WorkloadRecommendationPolicy { optional float pmax_ratio_threshold = 101; // default: 3.0 optional google.protobuf.Timestamp deleted_at = 102; + + // JVM heap optimization. Gated by jvm_heap_optimization_enabled; the optional + // knobs are overrides — unset means "use the current system default". + bool jvm_heap_optimization_enabled = 104; + optional float jvm_heap_target_percentile = 105; + optional float jvm_heap_headroom_multiplier = 106; + optional float jvm_non_heap_overhead_percent = 107; + optional int64 jvm_non_heap_overhead_bytes = 108; + optional int64 jvm_min_heap_bytes = 109; + optional int64 jvm_max_heap_bytes = 110; + bool jvm_prefer_container_support = 111; + + // Minimum CPU request (millicores) for detected JVM containers, protecting + // JVM startup (classloading, JIT warmup, agent instrumentation) from CPU + // starvation under node contention. Standalone knob — part of the always-on + // "respect JVM state" path, NOT gated by jvm_heap_optimization_enabled. + // Unset = system default (75m). Explicit 0 = floor disabled (only the + // generic CPU minimum applies). + optional int64 jvm_cpu_startup_floor_millicores = 112; + + // Recommendation floor percentage (per resource, request only): the + // recommended request is never lowered below pct% (1-100) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). Unset = floor disabled. + optional int64 cpu_floor_percent = 113; + optional int64 memory_floor_percent = 114; + + // Recommendation ceiling percentage (per resource, request only): the + // recommended request is never raised above pct% (1-1000) of the + // container's immutable initial-request baseline + // (workload_resource_baselines). A ceiling below 100 is intentionally + // allowed as a baseline-relative cap distinct from max_request. Unset = + // ceiling disabled. + optional int64 cpu_ceiling_percent = 115; + optional int64 memory_ceiling_percent = 116; + + // Limit floor/ceiling percentage (per resource, limit only): the + // recommended limit is never lowered below the floor pct (1-100) nor + // raised above the ceiling pct (1-1000) of the container's immutable + // initial-limit baseline (workload_resource_baselines). Applied only when + // that resource's limits adjustment is enabled and limits removal is not; + // the recommended request always wins over the limit ceiling (the limit + // is never clamped below the request). Unset = bound disabled. + optional int64 cpu_limit_floor_percent = 117; + optional int64 memory_limit_floor_percent = 118; + optional int64 cpu_limit_ceiling_percent = 119; + optional int64 memory_limit_ceiling_percent = 120; } message GetPolicyRecommendedDefaultsRequest { @@ -1869,6 +2374,22 @@ message BalanceApplyRecommendationResponse { optional string error = 4; // Optional live migration metadata, populated when recommendation used live migration. optional LiveMigrationResult live_migration_result = 5; + // image_changed signals the operator retired this recommendation because the + // target workload's container image changed since it was applied (a new + // release), so its image-tied tuned values (env/cmd/nodeSelector/toleration) + // were not pinned onto the new image. The control plane records this as + // Superseded — not a failure — so the optimizer re-derives a fresh + // recommendation for the new image. Only set for spec-mutating workload recs. + bool image_changed = 6; + // applied_at is the terminal-phase timestamp the operator stamped on the + // WorkloadRecommendation CRD (Status.AppliedAt). For MPA v2 (rule-based) + // recommendations, the control plane's DB row primary key is derived from + // recommendation_id + applied_at (see k8sconverters.DeriveWorkloadRecommendationID), + // so this is required to target the correct row for this apply cycle instead + // of the workload's static, un-derived recommendation_id. Unset for legacy + // (non-rule) recommendations and older operators — callers must fall back + // to recommendation_id in that case. + optional google.protobuf.Timestamp applied_at = 7; } // LiveMigrationResult provides structured metadata about a live migration attempt. @@ -1888,6 +2409,13 @@ message LiveMigrationResult { string target_node = 6; // Checkpoint image size in bytes. int64 checkpoint_size_bytes = 7; + // Whether checkpoint/restore or the recommendation itself was intentionally + // skipped (for example, because live migration is unsupported, the workload + // had no running Pods, or there was no effective resource change). + bool skipped = 8; + // Stable, human-readable reason the operation was skipped. Empty when + // skipped is false. + string skip_reason = 9; } message NodeGroupReference { @@ -1953,10 +2481,15 @@ message WorkloadRecommendation { bool use_live_migration = 21; LiveMigDeletionPropagation del_prop = 22; - optional string reasoning = 31; + // Why this recommendation was generated, set once at creation. For + // recommendations with no rule_id (policy-based / one-time), this is + // never touched again after generation — see `success`/`error` for the + // operator's terminal outcome instead. rule_id (MPA v2) rows may still + // have the operator's post-hoc status message appended. + optional string reasoning = 31; repeated Toleration current_tolerations = 41; - repeated Toleration recommended_tolerations = 42; + repeated Toleration recommended_tolerations = 42 [deprecated = true]; // superseded by toleration_mutations (per-element merge) optional RecommendationStatus status = 51; @@ -1968,6 +2501,20 @@ message WorkloadRecommendation { optional string rule_id = 73; + // CurrentSource of the governing WorkloadRule (MPA v2), e.g. "auto_optimization", + // "policy", "manual". Only set when rule_id is populated. Mirrors WorkloadRule.current_source + // so the recommendations list can show/link the governing rule without a second RPC. + optional string rule_source = 104; + + // The original spec.recommendation_id from the WorkloadRecommendation CRD. For MPA v2 + // (rule-based) rows, recommendation_id (field 1, this message's row ID) is deliberately + // re-derived per apply cycle so each evaluation gets its own history row — but audit log + // entries and live-migration checkpoint/restore events are always stamped with this + // original, un-derived ID. Clients querying audit logs or C/R status/events for a + // recommendation MUST use this field, not recommendation_id, or the query returns nothing + // for MPA v2 rows. Equal to recommendation_id for legacy rows (which never derive it). + optional string source_recommendation_id = 105; + ActionToTake replica_count_action = 81; // suggests if operator should set recommended_replica_count // Result of live migration when this recommendation was applied with use_live_migration (populated after apply). @@ -1976,6 +2523,12 @@ message WorkloadRecommendation { // Error message when status is failed or apply failed. optional string error = 83; + // Operator's terminal status message for any non-failure outcome (applied, + // or superseded via image-changed/skip). Mirrors `error` for the + // non-failure side. Only populated for recommendations with no rule_id + // (policy-based and one-time recs) — see reasoning field note below. + optional string success = 106; + // Backend-computed cost impact (current vs recommended). optional CostImpact cost_impact = 91; @@ -1984,8 +2537,159 @@ message WorkloadRecommendation { // without triggering rolling restarts (requires k8s >= v1.33). bool use_in_place_vertical_scaling = 92; + // Whether the operator may lower a container's memory limit while applying + // this recommendation in place. Copied from the owning rule/policy at + // generation time so the operator's apply-time preflight can decide without + // re-reading the rule. Independent of, and additional to, the cluster + // version check. + bool allow_in_place_memory_limit_decrease = 109; + // Impact score (0-1) indicating optimization opportunity. Higher = more waste. double impact_score = 93; + + // Pod-scoped per-element nodeSelector mutations (merge key: key). + repeated NodeSelectorMutation node_selector_mutations = 101; + + // Pod-scoped per-element toleration mutations. Supersedes the deprecated + // recommended_tolerations full-list field. + repeated TolerationMutation toleration_mutations = 102; + + // Container image (keyed by container name) the recommendation was derived + // from — the "source" release. The operator compares this against a + // workload's live images to detect that a new release shipped and retire a + // recommendation whose tuned values (resources, JVM heap, …) were computed + // for the old image, so they are not pinned onto the new one (e.g. a stale + // -Xmx that could OOM the new build). + map source_images = 103; + + // Force-restart directive when no resource fields changed but a restart + // was still requested (e.g. re-apply after an image change). + ActionToTake restart_action_to_take = 107; + + // Structured reasoning payload (insights, per-container deltas, HPA + // context, decision trace). Only populated for mpav1 (policy_id set) + // recommendations generated after this field shipped; absent for mpav2, + // one-time, and historical rows — consumers fall back to `reasoning`. + optional ReasoningDetails reasoning_details = 108; +} + +// ReasoningDetails is the structured form of a recommendation's `reasoning` +// prose. schema_version tracks the payload shape (currently 1). +message ReasoningDetails { + int32 schema_version = 1; + repeated ReasoningInsight insights = 2; + repeated ReasoningContainerChange container_changes = 3; + optional ReasoningReplicas replicas = 4; + repeated ReasoningDecision decisions = 5; + double confidence_score = 6; + double risk_score = 7; + double effective_deadband_percent = 8; +} + +enum ReasoningInsightSeverity { + REASONING_INSIGHT_SEVERITY_UNSPECIFIED = 0; + REASONING_INSIGHT_SEVERITY_INFO = 1; + REASONING_INSIGHT_SEVERITY_LOW = 2; + REASONING_INSIGHT_SEVERITY_MEDIUM = 3; + REASONING_INSIGHT_SEVERITY_HIGH = 4; + REASONING_INSIGHT_SEVERITY_CRITICAL = 5; +} + +enum ReasoningInsightType { + REASONING_INSIGHT_TYPE_UNSPECIFIED = 0; + REASONING_INSIGHT_TYPE_PATTERN = 1; + REASONING_INSIGHT_TYPE_ANOMALY = 2; + REASONING_INSIGHT_TYPE_TREND = 3; + REASONING_INSIGHT_TYPE_OPTIMIZATION = 4; + REASONING_INSIGHT_TYPE_RISK = 5; + REASONING_INSIGHT_TYPE_PROFILE = 6; +} + +enum ReasoningDecisionKind { + REASONING_DECISION_KIND_UNSPECIFIED = 0; + REASONING_DECISION_KIND_CONSTRAINT_OVERRIDE = 1; + REASONING_DECISION_KIND_POLICY_CONFLICT = 2; + REASONING_DECISION_KIND_POLICY_FLOOR = 3; + REASONING_DECISION_KIND_POLICY_CEILING = 4; + REASONING_DECISION_KIND_PLATFORM_FLOOR = 5; + REASONING_DECISION_KIND_SAFETY_FLOOR = 6; + REASONING_DECISION_KIND_SUPPRESSION = 7; + REASONING_DECISION_KIND_FEATURE_DOWNGRADE = 8; + REASONING_DECISION_KIND_MODIFICATION = 9; + REASONING_DECISION_KIND_NORMALIZATION = 10; + REASONING_DECISION_KIND_POLICY_LIMIT_FLOOR = 11; + REASONING_DECISION_KIND_POLICY_LIMIT_CEILING = 12; +} + +message ReasoningEvidence { + string type = 1; + string description = 2; + double confidence = 3; +} + +message ReasoningInsight { + string id = 1; + ReasoningInsightType type = 2; + ReasoningInsightSeverity severity = 3; + double confidence = 4; + string title = 5; + string description = 6; + string impact = 7; + repeated ReasoningEvidence evidence = 8; +} + +// Raw units: millicores for CPU, bytes for memory. Before = actuals at +// generation time, after = final recommendation. Percent changes are for +// the consumer to compute (avoids the legacy divide-by-zero Inf%). +message ReasoningResourceEdge { + int64 request_before = 1; + int64 request_after = 2; + int64 limit_before = 3; + int64 limit_after = 4; +} + +message ReasoningContainerChange { + string container = 1; + ReasoningResourceEdge cpu = 2; + ReasoningResourceEdge memory = 3; + ReasoningResourceEdge gpu = 4; + bool oom_triggered = 5; +} + +message ReasoningUtilization { + double cpu_current = 1; + double cpu_target = 2; + double memory_current = 3; + double memory_target = 4; +} + +message ReasoningHistoricalPattern { + string pattern = 1; + bool is_oscillating = 2; + double change_frequency = 3; +} + +message ReasoningReplicas { + int32 current = 1; + int32 recommended = 2; + int32 min = 3; + int32 max = 4; + string reason = 5; + string primary_metric = 6; + ReasoningUtilization utilization = 7; + string workload_type = 8; + ReasoningHistoricalPattern historical_pattern = 9; +} + +message ReasoningDecision { + ReasoningDecisionKind kind = 1; + string container = 2; // empty = workload-scoped + string resource = 3; // cpu | memory | gpu | "" + string field = 4; // request | limit | replicas | "" + optional int64 intended = 5; + optional int64 actual = 6; + string constraint = 7; // open-ended machine-readable cause token + string message = 8; } enum LiveMigDeletionPropagation { @@ -2196,8 +2900,10 @@ message GenerateNodePoliciesFromNodeGroupsResponse { // eligibility carries per-node-group "may this be migrated?" information // computed from the current node observations. The wizard reads this to // disable Step 3 rows for groups the operator must NOT migrate, with a - // tooltip explaining why. Always parallel-keyed by group name (matches - // NodePolicy.name). Empty when every group is migratable. + // tooltip explaining why. Keyed by group name (matches NodePolicy.name) + // and populated for every discovered group — including groups that are + // already managed by an existing node policy, which carry the + // "already_migrated" reason and have NO corresponding entry in policies. repeated NodeGroupMigrationEligibility eligibility = 4; } @@ -2237,6 +2943,13 @@ message NodeGroupMigrationEligibility { // "azure_sku_confidential" — source pool runs a Confidential Compute // SKU (DC* / EC*). kp-azure's isConfidential // predicate excludes these. + // "already_migrated" — the group is already managed by a live node + // policy with a live target scoped to this + // cluster. Unlike the other reasons, such + // groups are excluded from the policies list + // entirely (regenerating would create a + // duplicate policy); the entry exists so the + // UI can explain why the group is absent. // // Advisory reasons (migratable stays true; show as caveat): // "azure_sku_nvme_under_cig" — source pool's SKU is NVMe-only @@ -2250,6 +2963,10 @@ message NodeGroupMigrationEligibility { // from the same family. Operator should know // the launched nodes won't exactly match the // source pool. + // "cast_ai_live_migration_pool" — the group hosts cast.ai + // live-migration components, which stop + // working once those components are disabled + // during this migration. repeated string reasons = 3; } @@ -2279,6 +2996,23 @@ message GetNodeAnnotationReadinessResponse { string aks_cluster_resource_group = 7; } +message DetectClusterAutoscalerRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DetectClusterAutoscalerResponse { + // One of: karpenter | cluster_autoscaler | cast_ai | transitioning | unmanaged. + // Plain string (not an enum) so new families ship without a proto bump, + // matching node_scheduling_health.proto's autoscaler_type convention. + string autoscaler_type = 1; + // Per-family raw booleans so the wizard can pick the SOURCE autoscaler even + // while autoscaler_type reads transitioning (mid-migration both are live). + bool has_karpenter = 2; + bool has_cluster_autoscaler = 3; + bool has_cast_ai = 4; +} + // Migration wizard state message GetMigrationStateRequest { string team_id = 1; @@ -2307,6 +3041,94 @@ message UpdateMigrationStateResponse { string id = 1; } +// Karpenter migration wizard +message GetKarpenterMigrationStateRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetKarpenterMigrationStateResponse { + string id = 1; + string cluster_id = 2; + string status = 3; + int32 current_step = 4; + string state_json = 5; + google.protobuf.Timestamp created_at = 6; + google.protobuf.Timestamp updated_at = 7; +} + +message UpdateKarpenterMigrationStateRequest { + string team_id = 1; + string cluster_id = 2; + string status = 3; + int32 current_step = 4; + string state_json = 5; +} + +message UpdateKarpenterMigrationStateResponse { + string id = 1; +} + +message KarpenterOwnershipConflict { + string id = 1; + string resource_kind = 2; + string resource_name = 3; + string owner_tool = 4; + google.protobuf.Timestamp detected_at = 5; + google.protobuf.Timestamp acknowledged_at = 6; // unset if not yet acknowledged + string acknowledged_by = 7; +} + +message DetectKarpenterOwnershipConflictsRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DetectKarpenterOwnershipConflictsResponse { + repeated KarpenterOwnershipConflict conflicts = 1; // includes previously-acknowledged ones so the UI can show history + bool already_dev_zero_managed = 2; // true if karpDeployment.IsDevZeroManaged() — short-circuit signal for Detect step +} + +message AcknowledgeKarpenterOwnershipConflictRequest { + string team_id = 1; + string conflict_id = 2; + string acknowledged_by = 3; +} + +message AcknowledgeKarpenterOwnershipConflictResponse { + string id = 1; +} + +message KarpenterSourceResource { + string kind = 1; // "NodePool" | "EC2NodeClass" | "AKSNodeClass" | "GCENodeClass" + string name = 2; + string yaml = 3; +} + +message GetKarpenterSourceResourcesRequest { + string team_id = 1; + string cluster_id = 2; +} + +message GetKarpenterSourceResourcesResponse { + repeated KarpenterSourceResource resources = 1; +} + +message NodePoolAdoptionStatus { + string node_pool_name = 1; + bool ready = 2; +} + +message GetKarpenterAdoptionStatusRequest { + string team_id = 1; + string cluster_id = 2; + repeated string node_pool_names = 3; +} + +message GetKarpenterAdoptionStatusResponse { + repeated NodePoolAdoptionStatus statuses = 1; +} + // NodePool validation message ReportNodePoolValidationRequest { string cluster_id = 1; @@ -2381,6 +3203,23 @@ enum NodeGroupCheckpointState { NODE_GROUP_CHECKPOINT_STATE_ENABLED = 5; } +// CheckpointReason explains *why* a node group is stuck in CONFIGURED — surfaced +// as a tooltip modifier line, never as a distinct chip. Multiple reasons can be +// true at once; backend picks the most actionable one. +enum CheckpointReason { + CHECKPOINT_REASON_UNSPECIFIED = 0; + // dakr-operator on this cluster predates per-node SSA fan-out. Existing + // nodes won't be labeled until the operator upgrades. + CHECKPOINT_REASON_OPERATOR_OUTDATED = 1; + // Label applied, but no node has reported criu_configured=true yet. Most + // likely the customer hasn't deployed (or hasn't finished deploying) the + // CRIU DaemonSet. + CHECKPOINT_REASON_DAEMONSET_NOT_DETECTED = 2; + // Some nodes joined recently (<5 min) and haven't been probed yet. State + // will resolve on the next operator tick. + CHECKPOINT_REASON_NEW_NODES_PROBING = 3; +} + message NodeGroupCheckpointStatus { NodeGroupCheckpointState state = 1; // Associated node policy (empty when NOT_DZ_MANAGED). @@ -2390,6 +3229,9 @@ message NodeGroupCheckpointStatus { // to / clusters it targets — toggling the label affects all of them. repeated string shared_node_pool_names = 4; repeated string shared_cluster_ids = 5; + // Why this NG is in CONFIGURED (vs ENABLED). UNSPECIFIED for non-CONFIGURED + // states. + CheckpointReason reason = 6; } message GetNodeGroupsCheckpointStatusRequest { @@ -2437,6 +3279,7 @@ message NodePolicy { LabelSelector instance_hypervisors = 13; // self explanatory LabelSelector instance_generations = 14; // self explanatory; UI: Generation; e.g., 4 (Azure), 5 (AWS) LabelSelector instance_sizes = 15; // UI: Size; eg: Standard_D4s (Azure), large (AWS) + LabelSelector instance_shapes = 116; // GCP-only: standard/highcpu/highmem shape token LabelSelector instance_types = 16; // UI: Type; eg: Standard_D4s_v2 (Azure), m4.2xlarge (AWS) // AWS only — karpenter.k8s.aws/instance-local-nvme. Ephemeral NVMe GiB per // node. Karpenter-provider-gcp/-azure/-oci have no equivalent label; this @@ -2449,6 +3292,7 @@ message NodePolicy { optional string instance_hypervisors_tip = 29; optional string instance_generations_tip = 30; optional string instance_sizes_tip = 31; + optional string instance_shapes_tip = 117; optional string instance_local_nvme_tip = 114; LabelSelector zones = 36; // abstract, per-cloud mapping @@ -2498,6 +3342,22 @@ message NodePolicy { google.protobuf.Timestamp created_at = 110; google.protobuf.Timestamp updated_at = 111; google.protobuf.Timestamp deleted_at = 112; + + // "dakr" (user-authored, pushed to cluster) or "cluster" (read-only, + // computed from Karpenter CRDs NOT labeled devzero.io/managed-by=dakr — i.e. + // anything dakr does not own; see repositories.scopeNotDakrManaged). + string source = 115; + // For source == "cluster" only: the cluster whose Karpenter NodePool this + // policy mirrors. A cluster-managed policy belongs to exactly one cluster and + // has no NodePolicyTargets, so this is the frontend's only way to scope it + // (e.g. for suggestions). Empty for dakr-authored policies. + string source_cluster_id = 118; + // For source == "cluster" only: NodePool requirement keys on the mirrored CRD + // that this message has no field for (Azure/GCP SKU keys, custom label + // requirements). Computed per request like source and source_cluster_id, never + // stored, and empty for dakr-authored policies — which are authoritative by + // construction, since dakr compiled the NodePool from them. + repeated string unrepresented_requirement_keys = 119; } message PreviewNodeRecommendationConfigRequest { @@ -2538,6 +3398,248 @@ message SuggestedKarpenterConfigResponse { map ng_to_suggested = 11; } +message SuggestNodePolicyImprovementsRequest { + string team_id = 1; + // Required. Suggestions are computed per (policy, cluster) pair: the evidence is the + // cluster's live NodePools/nodes/workloads attributed to this policy. + string cluster_id = 2; + // Stored policy to evaluate. Takes precedence over `policy`, mirroring + // PreviewNodeRecommendationConfigRequest. + string policy_id = 3; + // Inline draft to evaluate when `policy_id` is empty. Always computed live, never + // persisted. + NodePolicy policy = 4; + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + ProfileWindow window = 5; +} + +message SuggestNodePolicyImprovementsResponse { + NodePolicy original = 1; + // Deep copy of `original` with every suggestion applied — the "accept all" payload. + NodePolicy suggested = 2; + repeated NodePolicySuggestion suggestions = 3; + SuggestionContext context = 4; + google.protobuf.Timestamp computed_at = 5; + // False when the response was computed synchronously for this request rather than + // served from a precomputed row. + bool from_cache = 6; + // True when the served row predates the policy's current revision (or an engine + // rule-set change). A background refresh has been enqueued; clients should surface + // the computed_at staleness and may refetch shortly. Large clusters serve stale + // rather than recomputing in the request path. + bool stale = 7; +} + +message ListClusterNodePolicySuggestionsRequest { + string team_id = 1; + string cluster_id = 2; + // Evidence lookback window. Defaults to PROFILE_WINDOW_7D when unspecified. + ProfileWindow window = 3; +} + +message ListClusterNodePolicySuggestionsResponse { + repeated NodePolicySuggestionsForPolicy policies = 1; + // The oldest computed_at among the included policies — the bound a caller can trust + // the whole response by, even though each policy's own row has its own computed_at. + google.protobuf.Timestamp computed_at = 2; + // True when at least one policy has no row yet, or a row stale enough to recompute. + // A background refresh of the whole cluster has been enqueued; clients should + // surface staleness and may refetch shortly, the same contract as + // SuggestNodePolicyImprovementsResponse.stale. + bool stale = 3; +} + +// NodePolicySuggestionsForPolicy is one policy's entry in a cluster-wide suggestions +// list: everything ListClusterNodePolicySuggestions can say about a single policy +// without the original/suggested NodePolicy payload SuggestNodePolicyImprovements +// carries — that RPC is still where accepting a suggestion happens. +message NodePolicySuggestionsForPolicy { + string policy_id = 1; + string policy_name = 2; + // "dakr" or "cluster", mirroring NodePolicy.source — cluster-managed mirrors get + // suggestions surfaced here the same as dakr-authored policies, visualization-only: + // accepting one still routes to that mirror's own Karpenter manifest, not this RPC. + string policy_source = 3; + repeated NodePolicySuggestion suggestions = 4; + SuggestionContext context = 5; + google.protobuf.Timestamp computed_at = 6; + // True when this policy's own row is missing, predates its current revision, or + // predates an engine rule-set change — same definition as + // SuggestNodePolicyImprovementsResponse.stale, just scoped to this one policy. + bool stale = 7; +} + +// SuggestionGroup is the policy component a suggestion belongs to. The UI groups cards +// by this axis. +enum SuggestionGroup { + SUGGESTION_GROUP_UNSPECIFIED = 0; + SUGGESTION_GROUP_DISRUPTION = 1; + SUGGESTION_GROUP_REQUIREMENTS = 2; + SUGGESTION_GROUP_CAPACITY_TYPE = 3; + SUGGESTION_GROUP_ZONES = 4; + SUGGESTION_GROUP_LIMITS = 5; + SUGGESTION_GROUP_NODECLASS = 6; + SUGGESTION_GROUP_COMPATIBILITY = 7; + // SUGGESTION_GROUP_COVERAGE is the one group whose suggestions do not mutate this + // NodePolicy at all: field_path, current_value_yaml and suggested_value_yaml are all + // empty, and the suggestion never resolves to an Apply(). It surfaces workloads + // attributed to this pool that have no legacy (mpav1) WorkloadRecommendationPolicy + // coverage, which is a gap in DevZero's separate workload-optimization product, not a + // NodePolicy misconfiguration. + SUGGESTION_GROUP_COVERAGE = 8; +} + +// SuggestionFlavor is the benefit a suggestion delivers. The UI renders this as a chip +// alongside severity. +enum SuggestionFlavor { + SUGGESTION_FLAVOR_UNSPECIFIED = 0; + SUGGESTION_FLAVOR_COST = 1; + SUGGESTION_FLAVOR_RELIABILITY = 2; + SUGGESTION_FLAVOR_PERFORMANCE = 3; + SUGGESTION_FLAVOR_SECURITY = 4; + SUGGESTION_FLAVOR_BEST_PRACTICE = 5; + SUGGESTION_FLAVOR_COMPATIBILITY = 6; +} + +enum SuggestionSeverity { + SUGGESTION_SEVERITY_UNSPECIFIED = 0; + SUGGESTION_SEVERITY_INFO = 1; + SUGGESTION_SEVERITY_RECOMMENDED = 2; + SUGGESTION_SEVERITY_STRONG = 3; +} + +// EvidenceScope records what population an evidence item was measured against. POOL means +// the nodes attributed to this policy's live NodePools; CLUSTER is the cold-start +// fallback for policies with no live nodes yet. +enum EvidenceScope { + EVIDENCE_SCOPE_UNSPECIFIED = 0; + EVIDENCE_SCOPE_POOL = 1; + EVIDENCE_SCOPE_CLUSTER = 2; +} + +message NodePolicySuggestion { + // Stable rule identifier, e.g. "disruption.consolidation_policy". Stable across + // engine versions so the frontend can special-case rendering per rule. + string rule_id = 1; + SuggestionGroup group = 2; + SuggestionFlavor flavor = 3; + SuggestionSeverity severity = 4; + // NodePolicy field the suggestion mutates, as a proto field path relative to + // NodePolicy, e.g. "disruption.consolidate_after", "capacity_types" or "limits.cpu". + // This names the FIRST (or only) field the suggestion changes; additional_field_changes + // below carries the rest for the rare suggestion that changes more than one. Two + // guarantees the per-card accept in the UI depends on, over the union of this path and + // every additional_field_changes[].field_path. First, the paths name exactly what this + // suggestion changes and nothing more: taking `original` and copying only these paths' + // values out of `suggested` yields the same policy as applying this one suggestion, so a + // card can be accepted on its own. Second, at most one suggestion per response claims a + // given path, and no claimed path is an ancestor of another — "limits" and "limits.cpu" + // never both appear — so accepting one card can never carry a neighbouring card's change + // with it. A rule with a finding on fields that do not belong together emits separate + // suggestions instead of naming their parent. + // + // Empty for a SUGGESTION_GROUP_COVERAGE suggestion, the one deliberate exception: it names + // no field because it does not mutate this NodePolicy at all. current_value_yaml and + // suggested_value_yaml are empty for the same reason. + string field_path = 5; + string title = 6; + // Detailed explanation of why this change is being suggested, written against the + // cited evidence. Rendered as the card body. + string rationale = 7; + // Display-ready YAML renderings of the field's current and suggested values, for + // field_path above. + string current_value_yaml = 8; + string suggested_value_yaml = 9; + repeated SuggestionEvidence evidence = 10; + // A directly attributable, non-overlapping monthly saving: a price delta (spot vs + // on-demand, gp2 vs gp3, a cheaper eligible candidate) applied to a known quantity. Safe + // to sum across every suggestion in a response, including others on the same policy, + // because each rule that sets this draws from its own independent price comparison — + // never from a shared, policy-wide figure two rules could both cite. + optional double estimated_monthly_savings_usd = 11; + // Additional NodePolicy fields this suggestion mutates together with field_path, when + // loosening several selector fields as one combination fits the population better than + // loosening any single one. Empty for almost every suggestion; see field_path's comment + // for the guarantees that apply across the whole set. + repeated SuggestionFieldChange additional_field_changes = 12; + // The most this suggestion could save if fully realized, for a rule whose saving is real + // but not directly attributable to this one change: reclaiming a pool's idle capacity + // (disruption.consolidation_policy, disruption.consolidate_after, disruption.budgets, + // requirements.size_mismatch) all draw the same ceiling from that pool's own idle spend, + // since each only widens Karpenter's ability to reclaim it rather than guaranteeing it + // does. Unlike estimated_monthly_savings_usd, this is NOT safe to sum across a policy: + // when more than one suggestion on the same policy sets it, the true ceiling is the + // maximum across them, not their total, because they are bounds on the same underlying + // capacity rather than independent savings. A rule never sets both this and + // estimated_monthly_savings_usd on the same suggestion. + optional double upper_bound_monthly_savings_usd = 13; +} + +// SuggestionFieldChange is one additional NodePolicy field a suggestion mutates, beyond +// field_path/current_value_yaml/suggested_value_yaml on NodePolicySuggestion, which always +// name the first (or only) one. Almost every suggestion touches exactly one field and +// leaves NodePolicySuggestion.additional_field_changes empty; only a combination-search +// suggestion (currently just requirements.overpinned) populates it. +message SuggestionFieldChange { + string field_path = 1; + string current_value_yaml = 2; + string suggested_value_yaml = 3; +} + +// SuggestionEvidence is one observed data point cited by a suggestion, e.g. +// label="p95 CPU utilization (7d)", value="22%", detail="across 14 nodes managed by +// nodepool workers-a". +message SuggestionEvidence { + string label = 1; + string value = 2; + string detail = 3; + EvidenceScope scope = 4; + // The workloads this citation names, in the order they appear in `detail` and in + // the rationale. Carries the identity behind the "namespace/name" text so the UI + // can open each one's drawer, which needs the uid and kind that the display + // string drops. Empty for citations about nodes or pricing rather than + // workloads, and for a workload whose metadata read missed it (the display + // string falls back to a bare uid there, and the drawer needs the kind too). + repeated SuggestionWorkloadRef workloads = 5; +} + +// SuggestionWorkloadRef identifies one workload named by a suggestion well enough +// to open its drawer: the panel takes uid, kind and the cluster the suggestion was +// computed for. +message SuggestionWorkloadRef { + string uid = 1; + // Kubernetes kind as written on the owner ("Deployment", "StatefulSet"), not the + // K8sObjectKind enum: this is passed straight to GetWorkload, which matches on + // the string. + string kind = 2; + string namespace = 3; + string name = 4; + // Exactly the text this workload appears as in `detail` and in the rationale, so + // the UI links the same token the sentence was written with instead of + // reassembling one and hoping it matches. + string display = 5; +} + +// SuggestionContext describes the evidence population a suggestion run was computed +// against, so the UI can qualify the results ("based on 14 nodes across 2 nodepools, +// last 7d, 23 workload profiles"). +message SuggestionContext { + ProfileWindow window = 1; + // Live NodePool names attributed to the policy via the dakr.devzero.io/node-policy-id + // annotation. Empty on cold-start. + repeated string matched_node_pools = 2; + int32 node_count = 3; + EvidenceScope evidence_scope = 4; + // Number of fresh workload profile snapshots that informed the run. + int32 workload_profile_count = 5; + // For cluster-managed policies only: NodePool requirement keys present on the + // customer's CRD that this policy view cannot represent (Azure/GCP SKU keys, + // custom label requirements). Non-empty means both the suggestions and the + // compiled preview describe a partial picture of the real NodePool, and the + // UI should say so. Always empty for dakr-authored policies. + repeated string unrepresented_requirement_keys = 6; +} + message GetAvailableKindsByTargetingFiltersRequest { string team_id = 1; repeated string cluster_ids = 2; @@ -2752,6 +3854,14 @@ message GetInstanceSizesResponse { repeated InstanceSize instance_sizes = 1; } +message GetInstanceShapesRequest { + repeated string cloud_providers = 1; // Cloud provider names (e.g., "aws", "azure", "gcp") +} + +message GetInstanceShapesResponse { + repeated InstanceShape instance_shapes = 1; +} + // -- Submessages -- message InstanceFamily { @@ -2759,6 +3869,11 @@ message InstanceFamily { string provider_name = 2; } +message InstanceShape { + string name = 1; + string provider_name = 2; +} + message InstanceSize { string name = 1; string provider_name = 2; @@ -2906,6 +4021,7 @@ message AzureNodeClassSpec { map tags = 5; optional AzureKubeletConfiguration kubelet = 6; optional int32 max_pods = 7; + optional string image_version = 8; } message AzureKubeletConfiguration { @@ -2983,6 +4099,89 @@ message RawKarpenterSpec { string nodeclass_yaml = 2; } +// SnapshotRecommendation delivers one rendered resilience-family config +// (spec §7): the multi-doc criu.org/v1 apply bundle compiled by the render +// worker — anchor ConfigMap first, then CheckpointSchedule / +// CheckpointRestoreOperator CRs sorted by name. tunr applies it verbatim +// under the dz-snapshot-crds prune stream; the config ID is echoed back in +// the apply ACK. +message SnapshotRecommendation { + bytes compiled_resources_yaml = 1; + string snapshot_cfg_id = 2; + string content_hash = 3; +} + +// ForensicSnapshotRecommendation is the forensic-family twin +// (ForensicSnapshotChain CRs, dz-forensic-crds prune stream). Kept separate +// from SnapshotRecommendation so neither family's apply can ever prune the +// other's resources (spec §7). +message ForensicSnapshotRecommendation { + bytes compiled_resources_yaml = 1; + string forensic_cfg_id = 2; + string content_hash = 3; +} + +// SnapshotCRStatusReport carries the current statuses of every dakr-managed +// criu.org CR on the cluster (tunr-side reporter, spec §8). +message SnapshotCRStatusReport { + repeated SnapshotCRStatus resources = 1; +} + +// SnapshotCRStatus is one CR's identity + raw status subtree. Annotations +// carry the dakr.devzero.io policy/target ID keys the compiler stamped; +// status_json is the CR's .status marshaled verbatim (dakr parses). +message SnapshotCRStatus { + string kind = 1; + string name = 2; + string namespace = 3; + string uid = 4; + map annotations = 5; + bytes status_json = 6; +} + +// SnapshotCRRuntimeStatus is one CR's ingested runtime state, projected for +// reads. One shape serves both families; family-irrelevant fields are unset. +message SnapshotCRRuntimeStatus { + string cluster_id = 1; + string kind = 2; + string name = 3; + string namespace = 4; + // ForensicSnapshotChain only: Pending/Running/Completed/Failed. + string phase = 11; + int32 snapshot_count = 12; + int32 attempt_count = 13; + int32 failure_count = 14; + // CheckpointSchedule only. INTERVAL-TRIGGER-ONLY counter: checkpoints + // fired by annotation/threshold/event triggers never bump it — label + // this "interval activity", or trigger-only schedules read as dead. + int32 checkpoints_created = 21; + string error_message = 31; + // lastCheckpointTime (schedules) / lastSnapshotTime (chains). + google.protobuf.Timestamp last_activity_time = 41; + google.protobuf.Timestamp start_time = 42; + google.protobuf.Timestamp completion_time = 43; + // When dakr last ingested this CR's status. + google.protobuf.Timestamp observed_at = 44; +} + +// SnapshotPolicyTargetStatus aggregates a target's ingested CR statuses +// (capped; ordered namespace, name). +message SnapshotPolicyTargetStatus { + repeated SnapshotCRRuntimeStatus resources = 1; +} + +// SnapshotPrereqs surfaces cluster prerequisites derivable from already- +// ingested state (spec §7). CRIU-on-nodes and container-runtime checkpoint +// support need node-level probing no collector performs yet — deferred; a +// cluster can pass these checks and still fail applies for those reasons +// (surfaced through apply events). +message SnapshotPrereqs { + string kubernetes_version = 1; + // Kubernetes >= 1.30 (ContainerCheckpoint enabled by default). + bool kubernetes_version_supported = 2; + bool metrics_server_present = 3; +} + message NodeRecommendation { AWSKarpenterSpec aws = 1; AKSKarpenterSpec aks = 2; @@ -3078,6 +4277,10 @@ enum RecommendationType { RECOMMENDATION_TYPE_PVC_STORAGE = 5; RECOMMENDATION_TYPE_WORKLOAD_RULE = 6; RECOMMENDATION_TYPE_KARPENTER_SETTINGS = 7; + RECOMMENDATION_TYPE_SNAPSHOT_CRD = 8; + RECOMMENDATION_TYPE_FORENSIC_SNAPSHOT_CRD = 9; + RECOMMENDATION_TYPE_HPA_CONNECTOR = 10; + RECOMMENDATION_TYPE_SCHEDULER_POLICY = 11; } enum HPAMetricType { @@ -3436,14 +4639,22 @@ message ListWorkloadCPUThrottleEventsResponse { // MPA V3: Workload Optimization Policy messages // ============================================================================ +// StringSetSelector is an include/exclude selector for a set of string values. +// If In is non-empty, the value must match one entry. NotIn entries are always +// excluded. Both empty = match all. +message StringSetSelector { + repeated string in = 1; + repeated string not_in = 2; +} + message WorkloadOptimizationPolicyProto { string id = 1; string team_id = 2; string name = 3; optional string description = 4; - bool enabled = 5; + bool disabled = 5; repeated string cluster_ids = 6; - repeated string namespace_selector = 7; + optional StringSetSelector namespace_selector = 7; google.protobuf.Timestamp created_at = 8; google.protobuf.Timestamp updated_at = 9; map cluster_names = 10; // cluster_id → display name @@ -3459,19 +4670,63 @@ message WorkloadOptimizationPolicyProto { optional string defragmentation_schedule = 16; bool live_migration_enabled = 17; bool use_in_place_vertical_scaling = 18; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 32; // HPA: when true, WorkloadRules generated from this policy have HPA // enabled. Two-way bound to HPARuleConfig.Enabled on the WorkloadRule CRD. bool hpa_enabled = 19; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 20; + optional LabelSelector label_selector = 21; + optional RegexPattern name_pattern = 22; + optional RegexPattern namespace_pattern = 23; + + // How far back to analyze CPU/memory/GPU usage when generating rules from + // this policy. Unset = 7 days. Clamped to the team's tier cap on write. + optional int32 lookback_period_seconds = 24; + // Generic (workload-level, no-per-container) optimization settings this + // policy applies to every rule it generates — the same shape a manual + // rule's ManualRuleFields carries. Unset sub-fields mean "not configured + // for this axis"; the engine computes it as if this policy had no + // constraint at all. + ResourceRuleConfig cpu_rule = 25; + ResourceRuleConfig memory_rule = 26; + ResourceRuleConfig gpu_rule = 27; + HPARuleConfig hpa_rule = 28; + JVMHeapRuleConfig jvm_heap_rule = 29; + optional int64 jvm_cpu_startup_floor_millicores = 30; + EmergencyResponseConfig emergency_response = 31; +} + +// GenericOptimizationSettings bundles the optional, workload-level (no +// per-container) resource/HPA/JVM/emergency settings a +// WorkloadOptimizationPolicy can apply to every rule it generates. Mirrors +// ManualRuleFields but omits fields that only make sense for a single +// concrete rule (containers, disabled, startup_period_seconds). Sent as a +// single optional block on create/update: omitted entirely means "leave +// every one of these columns unset/unchanged"; present means apply whichever +// sub-fields are themselves set, exactly like ManualRuleFields already does +// for a manual rule. +message GenericOptimizationSettings { + ResourceRuleConfig cpu_rule = 1; + ResourceRuleConfig memory_rule = 2; + ResourceRuleConfig gpu_rule = 3; + HPARuleConfig hpa_rule = 4; + JVMHeapRuleConfig jvm_heap_rule = 5; + optional int64 jvm_cpu_startup_floor_millicores = 6; + EmergencyResponseConfig emergency_response = 7; } message CreateWorkloadOptimizationPolicyRequest { string team_id = 1; string name = 2; optional string description = 3; - bool enabled = 4; + bool disabled = 4; repeated string cluster_ids = 5; - repeated string namespace_selector = 6; + optional StringSetSelector namespace_selector = 6; // Scheduling & Triggers repeated ActionTrigger action_triggers = 7; @@ -3484,8 +4739,25 @@ message CreateWorkloadOptimizationPolicyRequest { optional string defragmentation_schedule = 12; bool live_migration_enabled = 13; bool use_in_place_vertical_scaling = 14; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 31; bool hpa_enabled = 15; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 16; + optional LabelSelector label_selector = 17; + optional RegexPattern name_pattern = 18; + optional RegexPattern namespace_pattern = 19; + + // Metrics lookback window in seconds. Unset = 7 days. + optional int32 lookback_period_seconds = 20; + // Optional. Omitted entirely (the field's zero-value nil pointer) means + // every new resource/HPA/JVM/emergency column is left at NULL — the + // policy relies purely on engine auto-computation. When present, only + // the sub-fields actually populated within it are written. + GenericOptimizationSettings settings = 30; } message CreateWorkloadOptimizationPolicyResponse { @@ -3514,14 +4786,35 @@ message GetWorkloadOptimizationPolicyResponse { WorkloadOptimizationPolicyProto policy = 1; } +// GetWorkloadOptimizationPolicyByWorkload looks up the optimization policy +// attached to a workload's rule in a single hop. Returns found = false when +// no rule exists for those coordinates or the rule has no policy attached. +message GetWorkloadOptimizationPolicyByWorkloadRequest { + string team_id = 1; + string cluster_id = 2; + string namespace = 3; + string kind = 4; + string workload_name = 5; +} + +message GetWorkloadOptimizationPolicyByWorkloadResponse { + WorkloadOptimizationPolicyProto policy = 1; +} + message UpdateWorkloadOptimizationPolicyRequest { + // 5 was "disabled", 21 was "rule_action" — disable transitions for an + // existing policy now go exclusively through + // ToggleWorkloadOptimizationPolicyDisabled, never through this general + // update. Reserved so the numbers can't be silently reused with different + // semantics. + reserved 5, 21; + string team_id = 1; string policy_id = 2; optional string name = 3; optional string description = 4; - optional bool enabled = 5; repeated string cluster_ids = 6; - repeated string namespace_selector = 7; + optional StringSetSelector namespace_selector = 7; // Scheduling & Triggers repeated ActionTrigger action_triggers = 8; @@ -3534,54 +4827,428 @@ message UpdateWorkloadOptimizationPolicyRequest { optional string defragmentation_schedule = 13; optional bool live_migration_enabled = 14; optional bool use_in_place_vertical_scaling = 15; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + optional bool allow_in_place_memory_limit_decrease = 31; optional bool hpa_enabled = 16; + + // Targeting selectors (MPA v2 extended targeting) + optional StringSetSelector kind_selector = 17; + optional LabelSelector label_selector = 18; + optional RegexPattern name_pattern = 19; + optional RegexPattern namespace_pattern = 20; + + // Metrics lookback window in seconds. Omitting it leaves the stored window + // alone rather than resetting it. A change reaches the policy's rules on + // their next generation pass. + optional int32 lookback_period_seconds = 22; + // Optional. Omitted entirely means leave every existing + // resource/HPA/JVM/emergency setting on this policy untouched — the same + // "only update when the client explicitly sends a value" convention + // already used above for cron_schedule/cooldown_minutes/etc. When + // present, each sub-field within it (cpu_rule, hpa_rule, ...) is applied + // independently: a sub-field left unset inside a present `settings` + // block leaves that axis's current value untouched too, exactly + // mirroring how ManualRuleFields already behaves for a manual rule edit. + GenericOptimizationSettings settings = 30; +} + +// ToggleWorkloadOptimizationPolicyDisabled is the sole way to change an +// existing policy's disabled state (creation sets the initial value directly +// via CreateWorkloadOptimizationPolicyRequest.disabled). Splitting this out +// from the general update keeps the branchy "what happens to a policy's +// existing rules when it goes disabled" logic in one place, not entangled +// with unrelated field updates. +message ToggleWorkloadOptimizationPolicyDisabledRequest { + string team_id = 1; + string policy_id = 2; + bool disabled = 3; + // Only consulted when transitioning enabled -> disabled. Unspecified + // defaults to KEEP (detach) — never a silent hard delete. Ignored when + // enabling, or when the policy is already in the requested state. + optional WorkloadRuleAction rule_action = 4; +} + +message ToggleWorkloadOptimizationPolicyDisabledResponse { + WorkloadOptimizationPolicyProto policy = 1; } message UpdateWorkloadOptimizationPolicyResponse { WorkloadOptimizationPolicyProto policy = 1; } +// WorkloadRuleAction is what should happen to a policy's already-generated +// rules when the policy is disabled. Modeled as an enum (not a bool) because +// KEEP/REMOVE won't stay the only two options. +enum WorkloadRuleAction { + WORKLOAD_RULE_ACTION_UNSPECIFIED = 0; + // Detach: rules survive and keep optimizing, but revert to + // auto_optimization ownership instead of being regenerated by this policy. + WORKLOAD_RULE_ACTION_KEEP = 1; + // Delete the rules and their in-cluster CRDs; workloads are no longer + // optimized by them. + WORKLOAD_RULE_ACTION_REMOVE = 2; + // Detach AND disable: same detach semantics as KEEP, but the rules become + // full no-ops (disabled=true) until manually re-enabled. Re-enabling this + // policy does NOT automatically re-enable them. + WORKLOAD_RULE_ACTION_DISABLE = 3; +} + message DeleteWorkloadOptimizationPolicyRequest { + // 3 was "delete_rules" (bool) — replaced by the same 3-way rule_action + // used by ToggleWorkloadOptimizationPolicyDisabled, so deleting a policy + // supports KEEP/DISABLE/REMOVE for its rules, not just keep-or-remove. + reserved 3; + string team_id = 1; string policy_id = 2; - bool delete_rules = 3; // if true, delete associated rules; if false, detach (set policy_id=null) + // Controls what happens to the policy's already-generated rules. + // Unspecified/omitted defaults to KEEP (detach) — never a silent hard + // delete. + optional WorkloadRuleAction rule_action = 4; } message DeleteWorkloadOptimizationPolicyResponse {} +// PreviewWorkloadOptimizationPolicyMatches: dry-run targeting preview. Mirrors +// CreateWorkloadOptimizationPolicyRequest's targeting fields exactly (plus +// optional policy_id) — deliberately excludes operational fields (triggers, +// scheduling, HPA/scaling flags) since those don't affect which workloads +// match, only what happens once a rule is generated for them. +message PreviewWorkloadOptimizationPolicyMatchesRequest { + string team_id = 1; + // Optional. Set in edit mode so matches already owned by this policy can + // be distinguished from matches owned by a different policy. Omit in + // create mode, where there is no "this policy" yet. + optional string policy_id = 2; + repeated string cluster_ids = 3; + optional StringSetSelector namespace_selector = 4; + optional StringSetSelector kind_selector = 5; + optional LabelSelector label_selector = 6; + optional RegexPattern name_pattern = 7; + optional RegexPattern namespace_pattern = 8; +} + +enum WorkloadOptimizationPolicyMatchStatus { + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_UNSPECIFIED = 0; + // No workload_rule exists yet for this workload — saving the policy as + // configured would create one. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_NEW_RULE = 1; + // A rule already exists and is owned by this policy (edit mode only) — + // saving would leave it as-is (recalibration happens on its own cadence). + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_ALREADY_OWNED_BY_THIS_POLICY = 2; + // Matched the selector, but a manually-managed rule already exists — + // this policy will never touch it. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_MANUAL = 3; + // Matched the selector, but a CRD-managed (kubectl-applied) rule already + // exists — this policy will never touch it. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_CRD = 4; + // Matched the selector, but a different policy already owns the rule — + // this policy will not steal it. See owning_policy_id/owning_policy_name. + WORKLOAD_OPTIMIZATION_POLICY_MATCH_STATUS_SKIPPED_OWNED_BY_OTHER_POLICY = 5; +} + +message WorkloadOptimizationPolicyMatch { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string name = 4; + string uid = 5; + WorkloadOptimizationPolicyMatchStatus status = 6; + // Populated only when status = SKIPPED_OWNED_BY_OTHER_POLICY. + optional string owning_policy_id = 7; + optional string owning_policy_name = 8; +} + +message PreviewWorkloadOptimizationPolicyMatchesResponse { + // Capped (see total_matched vs. total_returned below) — ordered by + // cluster, namespace, kind, name. + repeated WorkloadOptimizationPolicyMatch matched_workloads = 1; + // Total workloads that matched the selector across all requested + // clusters, before the cap was applied. + int32 total_matched = 2; + // How many of total_matched are actually included in matched_workloads. + // total_returned < total_matched means the result was capped — narrow the + // targeting to see the rest. + int32 total_returned = 3; +} + // ============================================================================ -// MPA V3: Workload Rule listing messages +// Scheduler Policies: CRUD, preview, and stream sync messages // ============================================================================ -message GetWorkloadRulesByPolicyRequest { - string team_id = 1; - string policy_id = 2; +message SchedulerPolicyTargetProto { + string id = 1; // empty on create; set on update to preserve identity + repeated string cluster_ids = 2; // empty = all team clusters + StringSetSelector namespace_selector = 3; + StringSetSelector kind_selector = 4; + LabelSelector label_selector = 5; + RegexPattern name_pattern = 6; + RegexPattern namespace_pattern = 7; } -message GetWorkloadRulesByPolicyResponse { - repeated WorkloadRule managed_rules = 1; - repeated WorkloadRule excluded_rules = 2; - map cluster_names = 3; +message SchedulerPolicyProto { + string id = 1; + string team_id = 2; + string name = 3; + optional string description = 4; + bool disabled = 5; + string scheduler_name = 6; + bool override_custom_scheduler = 7; + repeated SchedulerPolicyTargetProto targets = 8; + google.protobuf.Timestamp created_at = 9; + google.protobuf.Timestamp updated_at = 10; + // set while a delete waits for revert acks (spec 4.5) + optional google.protobuf.Timestamp delete_requested_at = 11; + // live enrollment count, filled by List (not persisted) + int32 enrolled_workloads = 12; + map cluster_names = 13; // cluster_id -> display name, union of target clusters +} + +message CreateSchedulerPolicyRequest { + string team_id = 1; + string name = 2; + optional string description = 3; + bool override_custom_scheduler = 4; + repeated SchedulerPolicyTargetProto targets = 5; } +message CreateSchedulerPolicyResponse { SchedulerPolicyProto policy = 1; } -message ListWorkloadRulesRequest { +message ListSchedulerPoliciesRequest { string team_id = 1; + // When set, only policies with at least one live target covering this + // cluster are returned. Omitted (unset) returns every policy for the + // team, unfiltered. optional string cluster_id = 2; } +message ListSchedulerPoliciesResponse { repeated SchedulerPolicyProto policies = 1; } -message ListWorkloadRulesResponse { - repeated WorkloadRule rules = 1; - map cluster_names = 2; // cluster_id → display name - map policy_names = 3; // policy_id → policy name +message UpdateSchedulerPolicyRequest { + string team_id = 1; + string policy_id = 2; + optional string name = 3; + optional string description = 4; + optional bool override_custom_scheduler = 5; + // full replacement of the target set (targets with ids are updated, + // without ids created, missing ones removed) — omitted (empty) list + // means "leave targets unchanged", carried by this flag: + bool replace_targets = 6; + repeated SchedulerPolicyTargetProto targets = 7; } +message UpdateSchedulerPolicyResponse { SchedulerPolicyProto policy = 1; } -message GetWorkloadRuleByIDRequest { +message ToggleSchedulerPolicyDisabledRequest { string team_id = 1; - string rule_id = 2; + string policy_id = 2; + bool disabled = 3; +} +message ToggleSchedulerPolicyDisabledResponse { + SchedulerPolicyProto policy = 1; + // active enrollments flipped to pending_revert by disabling + int32 reverts_initiated = 2; } -message GetWorkloadRuleByIDResponse { +message DeleteSchedulerPolicyRequest { + string team_id = 1; + string policy_id = 2; + // force skips reverts: enrollments are abandoned in place (spec 4.5) + bool force = 3; +} +message DeleteSchedulerPolicyResponse { + // DELETED: no live enrollments existed (or force) — policy soft-deleted now. + // REVERTING: reverts initiated; delete finalizes when acks arrive. + enum Outcome { + OUTCOME_UNSPECIFIED = 0; + OUTCOME_DELETED = 1; + OUTCOME_REVERTING = 2; + } + Outcome outcome = 1; + int32 reverts_initiated = 2; +} + +message PreviewSchedulerPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; // set when editing, for diff classification + repeated SchedulerPolicyTargetProto targets = 3; +} +message SchedulerPolicyTargetMatch { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string name = 4; + enum Status { + STATUS_UNSPECIFIED = 0; + NEW_ENROLLMENT = 1; // would enroll + ALREADY_ENROLLED_THIS_POLICY = 2; // no change + ENROLLED_BY_OTHER_POLICY = 3; // precedence: stays with its owner + } + Status status = 5; + optional string owning_policy_id = 6; + optional string owning_policy_name = 7; + // workload spec's current schedulerName ("" = unset/default) + string current_scheduler = 8; +} +message PreviewSchedulerPolicyTargetsResponse { + repeated SchedulerPolicyTargetMatch matched_workloads = 1; + int32 total_matched = 2; + int32 total_returned = 3; // capped at 500, deterministic prefix + // Count over the FULL match set (like total_matched), not just the + // capped/returned prefix: matches whose current_scheduler is neither + // empty nor default-scheduler. + int32 custom_scheduler_count = 4; +} + +message ListSchedulerPolicyEnrollmentsRequest { + string team_id = 1; + string policy_id = 2; +} +message SchedulerPolicyEnrollment { + string cluster_id = 1; + string namespace = 2; + string kind = 3; + string workload_name = 4; + enum State { + STATE_UNSPECIFIED = 0; + STATE_ACTIVE = 1; + STATE_PENDING_REVERT = 2; + STATE_REVERTED = 3; + STATE_ABANDONED = 4; + } + State state = 5; + // Original scheduler captured in the workload's baseline. Unset when no + // baseline row exists yet (spec 3.3); an empty string is a real value — + // the baseline captured the field as unset on the workload, not "unknown". + optional string original_scheduler_name = 6; + google.protobuf.Timestamp enrolled_at = 7; + optional google.protobuf.Timestamp unenrolled_at = 8; +} +message ListSchedulerPolicyEnrollmentsResponse { + repeated SchedulerPolicyEnrollment enrollments = 1; + map cluster_names = 2; // cluster_id -> display name +} + +message SchedulerPolicySync { + repeated SchedulerPolicyProto policies = 1; + repeated SchedulerRevertInstruction reverts = 2; + // Opaque fingerprint of (policies, reverts, scheduler_settings); tunr + // echoes it in its next enrollment report so dakr can log convergence. + // Not used for correctness. + string sync_fingerprint = 3; + // Rendered dz-scheduler-config.yaml content for this cluster, when a + // settings row exists. Unset when the cluster has no persisted + // SchedulerSettings row — tunr must leave the helm-managed ConfigMap + // untouched in that case, not apply a rendered-defaults config. + SchedulerConfigPayload scheduler_settings = 4; +} + +message SchedulerConfigPayload { + // Complete dz-scheduler-config.yaml content, rendered by dakr. + string rendered_config = 1; + google.protobuf.Timestamp updated_at = 2; +} + +message SchedulerRevertInstruction { + string enrollment_id = 1; // ack correlation id for apply + string namespace = 2; + string kind = 3; + string workload_name = 4; + // literal value to restore; empty string means remove the field + // (baseline recorded the scheduler as unset). tunr prefers the + // on-workload annotation and uses this as fallback (spec 4.5 step 2). + string original_scheduler_name = 5; +} + +message SchedulerEnrollmentReport { + message Observation { + string namespace = 1; + string kind = 2; + string workload_name = 3; + string policy_id = 4; + // pre-mutation scheduler observed at first application; "" = field + // was unset in the workload spec + string original_scheduler_name = 5; + } + repeated Observation observations = 1; + // Echo of the SchedulerPolicySync.sync_fingerprint tunr last applied. + // dakr compares this against the sending stream's current delivery-state + // fingerprint and logs a divergence once per report (Debug/Info) -- + // informational only, never rejected: a stale echo just means tunr's + // report raced an in-flight sync push and will self-correct on the next + // tick. + string sync_fingerprint = 2; + // Full image ref of the running dz-scheduler container (registry/repo:tag), + // as read from the dz-scheduler Deployment's first container. Informational, + // and the version gate the config renderer (#9978) uses to decide which + // rendered-config shape a cluster can accept. "" = unknown or the + // Deployment was not found (scheduler disabled, or not yet observed). + string scheduler_image = 3; +} + +// SchedulerRevertEventReport carries fail-open scheduler revert events +// observed by tunr's admission failsafe: pods steered away from an +// unhealthy tracked scheduler at CREATE time. Pod-level and transient -- +// the owning workload stays enrolled; dakr records these as the negative +// signal for scheduler-impact observability. Batched per stream tick; +// dropped_events counts buffer overflow drops since the last report. +message SchedulerRevertEventReport { + message Event { + string namespace = 1; + string pod_name = 2; + // Owning controller identity when resolvable from ownerRefs at + // admission time; empty for bare pods. + string workload_kind = 3; + string workload_name = 4; + // scheduler-policy id annotation value if the pod carried one. + string policy_id = 5; + string from_scheduler = 6; + string to_scheduler = 7; + // Why the scheduler was considered unhealthy at revert time. + SchedulerUnhealthyReason reason = 8; + google.protobuf.Timestamp occurred_at = 9; + } + repeated Event events = 1; + uint32 dropped_events = 2; +} + +enum SchedulerUnhealthyReason { + SCHEDULER_UNHEALTHY_REASON_UNSPECIFIED = 0; + SCHEDULER_UNHEALTHY_REASON_HEALTHZ_FAILED = 1; + SCHEDULER_UNHEALTHY_REASON_PENDING_PODS_STUCK = 2; +} + +// ============================================================================ +// MPA V3: Workload Rule listing messages +// ============================================================================ + +message GetWorkloadRulesByPolicyRequest { + string team_id = 1; + string policy_id = 2; +} + +message GetWorkloadRulesByPolicyResponse { + repeated WorkloadRule managed_rules = 1; + repeated WorkloadRule excluded_rules = 2; + map cluster_names = 3; +} + +message ListWorkloadRulesRequest { + string team_id = 1; + optional string cluster_id = 2; +} + +message ListWorkloadRulesResponse { + repeated WorkloadRule rules = 1; + map cluster_names = 2; // cluster_id → display name + map policy_names = 3; // policy_id → policy name +} + +message GetWorkloadRuleByIDRequest { + string team_id = 1; + string rule_id = 2; +} + +message GetWorkloadRuleByIDResponse { WorkloadRule rule = 1; string cluster_name = 2; // display name of rule.cluster_id string policy_name = 3; // display name of rule.policy_id (empty if no policy attached) @@ -3625,6 +5292,52 @@ message DeleteWorkloadRuleRequest { message DeleteWorkloadRuleResponse {} +message DeleteAllWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; +} + +message DeleteAllWorkloadRulesResponse {} + +// BulkDeleteWorkloadRules deletes an explicit set of rules within a single +// cluster (e.g. a UI multi-select), triggering CRD removal for each. Scoped +// to cluster_id so the server can validate ownership once and reject any +// rule_ids that don't belong to that cluster, rather than trusting the caller. +message BulkDeleteWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated string rule_ids = 3; +} + +message BulkDeleteWorkloadRulesResponse { + int32 deleted_count = 1; +} + +// BulkToggleWorkloadRulesDisabled flips the disabled flag on an explicit set +// of rules within a single cluster (e.g. a UI multi-select) — each rule +// switches to whatever it currently is NOT, independently of the others, so +// a single call can disable some and enable others in one request. Mirrors +// BulkDeleteWorkloadRules's scoping: rule_ids that do not belong to +// cluster_id are silently excluded rather than erroring. +message BulkToggleWorkloadRulesDisabledRequest { + string team_id = 1; + string cluster_id = 2; + repeated string rule_ids = 3; +} + +message BulkToggleWorkloadRulesDisabledResponse { + int32 updated_count = 1; +} + +message DeleteRuleAndApplyRecommendationRequest { + string team_id = 1; + string rule_id = 2; + string workload_uid = 3; + WorkloadRecommendation workload_recommendation = 4; +} + +message DeleteRuleAndApplyRecommendationResponse {} + // ManualRuleFields carries the user-configurable rule fields shared by the // Upsert and Preview RPCs. Extracted as its own message so the two request // messages stay shape-aligned and the Go conversion logic has a single entry @@ -3644,8 +5357,35 @@ message ManualRuleFields { optional string defragmentation_schedule = 12; bool live_migration_enabled = 13; bool use_in_place_vertical_scaling = 14; + // Only meaningful while use_in_place_vertical_scaling is true. Default + // false; see WorkloadRule.allow_in_place_memory_limit_decrease. + bool allow_in_place_memory_limit_decrease = 20; // Per-container resource configs (VPA). When empty, workload-level rules apply to all containers. repeated ContainerResourceRuleConfig containers = 15; + // JVM heap optimization overrides for this rule. + JVMHeapRuleConfig jvm_heap_rule = 16; + + // Per-rule override of the JVM CPU startup floor (millicores). See + // WorkloadRule.jvm_cpu_startup_floor_millicores for semantics. + optional int64 jvm_cpu_startup_floor_millicores = 17; + + // Rule-wide on/off switch. Only valid when creating a brand-new rule via + // UpsertManualWorkloadRule — the request is REJECTED with an error if this + // is set while updating an existing rule. Use ToggleWorkloadRuleDisabled + // to change an existing rule's disabled state. See WorkloadRule.disabled + // for runtime semantics. optional (not plain bool) so the server can tell + // "omitted" apart from "explicitly false" and enforce the create-only rule. + optional bool disabled = 18; + + // Per-rule metrics lookback override. Unset inherits the owning policy's + // window, else the 7-day default. + optional int32 lookback_period_seconds = 19; + + // KEDA ScaledObject template authored by the user via the manual-rule form. + // Mirrors WorkloadRule.keda_scaled_object; written through by UpsertManualWorkloadRule. + // Field 20 is taken by main's allow_in_place_memory_limit_decrease (added on the + // main merge), so keda_scaled_object is 21. + optional KEDAScaledObjectTemplate keda_scaled_object = 21; } // WorkloadRuleSource identifies who created/last-modified a WorkloadRule. @@ -3687,6 +5427,19 @@ message UpsertManualWorkloadRuleResponse { WorkloadRule rule = 1; } +// ToggleWorkloadRuleDisabled is the sole way to change an EXISTING rule's +// disabled state. UpsertManualWorkloadRule only honors ManualRuleFields.disabled +// when creating a brand-new rule; every other transition goes through here. +message ToggleWorkloadRuleDisabledRequest { + string team_id = 1; + string rule_id = 2; + bool disabled = 3; +} + +message ToggleWorkloadRuleDisabledResponse { + WorkloadRule rule = 1; +} + // PreviewWorkloadRuleRequest mirrors the upsert request but does not // persist anything; returns a side-by-side preview instead. message PreviewWorkloadRuleRequest { @@ -3700,6 +5453,14 @@ message PreviewWorkloadRuleRequest { string workload_uid = 6; ManualRuleFields fields = 10; + + // Optional. Set when this preview is being driven by a + // WorkloadOptimizationPolicy rather than a manual draft (e.g. the policy + // targeting preview's per-row rule detail) — applies the policy's + // operational overrides (currently just hpa_enabled=false, which can only + // disable HPA, never force it on — same clamp real rule generation + // applies) to the materialized pass. Has no effect on engine_projection. + optional string policy_id = 11; } message PreviewWorkloadRuleResponse { @@ -3723,6 +5484,12 @@ message PreviewWorkloadRuleResponse { // workload not yet emitting metrics, etc.). FE renders the materialized // draft + observed view without an engine column. string engine_projection_unavailable_reason = 4; + + // The persisted DB rule for this workload. Null when no rule has been saved + // yet (create mode). Frontend fills ALL form fields directly from this when + // present; falls back to engine_projection for create-mode prefill. + // Engine suggestion chips always compare against engine_projection. + WorkloadRule db_rule = 5; } message GetWorkloadContainerNamesRequest { @@ -3764,6 +5531,78 @@ message BatchAutoOptimizeWorkloadsResponse { repeated BatchAutoOptimizeWorkloadResult results = 1; } +// Identifies a workload by namespace/kind/name. Shared by batch RPCs +// (BatchUpsertManualWorkloadRules, BatchPreviewWorkloadRules). +// workload_uid is only needed for preview (the profiling service uses it). +message BatchWorkloadEntry { + string namespace = 1; + string kind = 2; + string name = 3; + optional string workload_uid = 5; +} + +message BatchUpsertManualWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated BatchWorkloadEntry workloads = 3; + bool auto_generate = 4; + ManualRuleFields fields = 5; // shared across all workloads (only used when auto_generate=false) + WorkloadRuleSource source = 6; +} + +message BatchUpsertManualWorkloadRuleResult { + string namespace = 1; + string kind = 2; + string name = 3; + bool success = 4; + string error = 5; + WorkloadRule rule = 6; +} + +message BatchUpsertManualWorkloadRulesResponse { + repeated BatchUpsertManualWorkloadRuleResult results = 1; +} + +// Batch preview — applies the same ManualRuleFields to multiple workloads +// and returns per-workload previews without persisting anything. +message BatchPreviewWorkloadRulesRequest { + string team_id = 1; + string cluster_id = 2; + repeated BatchWorkloadEntry workloads = 3; + ManualRuleFields fields = 4; // shared across all workloads +} + +message BatchPreviewWorkloadRuleResult { + string namespace = 1; + string kind = 2; + string name = 3; + bool success = 4; + string error = 5; + WorkloadRule materialized_rule = 6; + WorkloadRule engine_projection = 7; + WorkloadProfileResult profile = 8; + string engine_projection_unavailable_reason = 9; +} + +message BatchPreviewWorkloadRulesResponse { + repeated BatchPreviewWorkloadRuleResult results = 1; +} + +// ApplyOneTimeOptimization runs the MPA v2 engine for a workload and immediately +// creates a WorkloadRecommendation (no WorkloadRule persisted). Only allowed when +// no WorkloadRule already exists for the workload — the frontend disables the +// button in edit mode to enforce this at the UI layer too. +message ApplyOneTimeOptimizationRequest { + string team_id = 1; + string cluster_id = 2; + string namespace = 3; + string kind = 4; + string name = 5; + string workload_uid = 6; +} + +message ApplyOneTimeOptimizationResponse {} + // WorkloadProfileManifest is the authoritative key set for a single emit cycle // of profile snapshots for a (cluster, window) pair. The server sends exactly // one manifest followed by zero or more BatchWorkloadProfiles, all tagged with @@ -3859,3 +5698,549 @@ message NodeApplyFailure { string node_name = 1; string error = 2; } + +// NodeCheckpointLabelState describes the last-known per-node apply outcome for +// the checkpoint-restore label. PENDING/FAILED reflect the most recent +// generic_resource_recommendations row; NONE means we have no apply attempt +// on record for the node — has_label may still be true (label inherited via +// the Karpenter NodePool template, or set manually). +enum NodeCheckpointLabelState { + NODE_CHECKPOINT_LABEL_STATE_UNSPECIFIED = 0; + NODE_CHECKPOINT_LABEL_STATE_NONE = 1; + NODE_CHECKPOINT_LABEL_STATE_PENDING = 2; + NODE_CHECKPOINT_LABEL_STATE_APPLIED = 3; + NODE_CHECKPOINT_LABEL_STATE_FAILED = 4; + // REJECTED lumps every other terminal status (superseded, blocked, ignored) + // — the UI surfaces them collectively as "did not apply". + NODE_CHECKPOINT_LABEL_STATE_REJECTED = 5; +} + +message GetClusterCheckpointLabelCoverageRequest { + string team_id = 1; + string cluster_id = 2; +} + +message NodeGroupCheckpointLabelCoverage { + string node_pool_name = 1; + // total_nodes counts live nodes in the group whose node_group_name maps to + // a policy attached to this cluster via an enabled NodePolicyTarget. Nodes + // outside any policy's scope are excluded. + uint32 total_nodes = 2; + uint32 labeled_nodes = 3; + uint32 pending_nodes = 4; + uint32 failed_nodes = 5; + // ready_nodes = label applied AND criu_configured AND agent heartbeat fresh + // (<5 min). Drives the "Active · X/Y ready" / "Awaiting runtime · X/Y ready" + // NG-row subtext. + uint32 ready_nodes = 6; +} + +message GetClusterCheckpointLabelCoverageResponse { + repeated NodeGroupCheckpointLabelCoverage groups = 1; +} + +message ListNodeGroupCheckpointLabelStateRequest { + string team_id = 1; + string cluster_id = 2; + string node_pool_name = 3; +} + +message NodeCheckpointLabelEntry { + string node_name = 1; + bool has_label = 2; + NodeCheckpointLabelState last_apply_state = 3; + string last_error = 4; + // criu_configured = dakr-operator's last probe found criu installed on this + // node. Pair with criu_heartbeat_fresh — a true value with a stale heartbeat + // is not trustworthy. + bool criu_configured = 5; + // criu_heartbeat_fresh = agent_healths.last_ping_at within the last 5 min. + // FE renders "Active" only when has_label + criu_configured + this. + bool criu_heartbeat_fresh = 6; +} + +message ListNodeGroupCheckpointLabelStateResponse { + repeated NodeCheckpointLabelEntry nodes = 1; +} + +// --------------------------------------------------------------------------- +// Snapshot policies (resilience) + forensic snapshot policies (runtime +// security) — spec: dakr/docs/superpowers/specs/2026-07-02-snapshot-policies-design.md +// --------------------------------------------------------------------------- + +message SnapshotPercentBounds { + optional int32 upper = 1; + optional int32 lower = 2; +} + +message SnapshotResourceThreshold { + optional SnapshotPercentBounds cpu_percent = 1; + optional SnapshotPercentBounds memory_percent = 2; + optional int32 poll_interval_seconds = 3; +} + +// CheckpointSchedule behavior (triggers only — scope lives on the target). +message SnapshotSchedulePolicySpec { + optional int64 interval_seconds = 1; + optional SnapshotResourceThreshold resource_threshold = 2; + // Values: NodeDrain | PodEviction | Preemption (validated server-side; the CRD has no enum). + repeated string on_kubernetes_events = 3; + bool on_annotation = 4; +} + +message SnapshotGlobalRetention { + optional bool retain_orphan = 1; + optional int32 max_checkpoints_per_namespace = 2; + optional int32 max_checkpoints_per_pod = 3; + optional int32 max_checkpoints_per_container = 4; + // Sizes are integer MB; the compiler renders them as "Mi" quantities. + optional int32 max_checkpoint_size_mb = 5; + optional int32 max_total_size_per_namespace_mb = 6; + optional int32 max_total_size_per_pod_mb = 7; + optional int32 max_total_size_per_container_mb = 8; +} + +message SnapshotContainerRetentionPolicy { + string namespace = 1; + string pod = 2; + string container = 3; + optional bool retain_orphan = 4; + optional int32 max_checkpoints = 5; + optional int32 max_checkpoint_size_mb = 6; + optional int32 max_total_size_mb = 7; +} + +message SnapshotPodRetentionPolicy { + string namespace = 1; + string pod = 2; + optional bool retain_orphan = 3; + optional int32 max_checkpoints = 4; + optional int32 max_checkpoint_size_mb = 5; + optional int32 max_total_size_mb = 6; +} + +message SnapshotNamespaceRetentionPolicy { + string namespace = 1; + optional bool retain_orphan = 2; + optional int32 max_checkpoints = 3; + optional int32 max_checkpoint_size_mb = 4; + optional int32 max_total_size_mb = 5; +} + +// CheckpointRestoreOperator behavior (cluster-wide retention/GC config). +message SnapshotRetentionPolicySpec { + string checkpoint_directory = 1; + bool apply_policies_immediately = 2; + optional SnapshotGlobalRetention global_retention = 3; + repeated SnapshotContainerRetentionPolicy container_policies = 4; + repeated SnapshotPodRetentionPolicy pod_policies = 5; + repeated SnapshotNamespaceRetentionPolicy namespace_policies = 6; +} + +message SnapshotPolicy { + string policy_id = 1; + string team_id = 2; + string name = 3; + string description = 4; + oneof spec { + SnapshotSchedulePolicySpec schedule = 11; + SnapshotRetentionPolicySpec retention = 12; + } + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} + +enum ForensicPostSnapshotAction { + FORENSIC_POST_SNAPSHOT_ACTION_UNSPECIFIED = 0; + FORENSIC_POST_SNAPSHOT_ACTION_NONE = 1; + FORENSIC_POST_SNAPSHOT_ACTION_DELETE_POD = 2; +} + +message ForensicSnapshotPolicy { + string policy_id = 1; + string team_id = 2; + string name = 3; + string description = 4; + optional int64 interval_seconds = 11; + optional int32 max_snapshots = 12; + optional int64 max_duration_seconds = 13; + string hash_algorithm = 14; + ForensicPostSnapshotAction post_snapshot_action = 15; + // Read-only: 0 = never triggered. Mutable only via + // TriggerForensicSnapshotRun. Create rejects non-zero values; Update + // ignores the field entirely (round-tripped entities carry it). + int32 run_generation = 16; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} + +// Scope shared by both target families. Non-nil criteria combine with AND. +// Empty cluster_ids = NO clusters (deliberately inverted from WorkloadPolicyTarget). +message SnapshotTargetScope { + repeated string cluster_ids = 1; + repeated string namespaces = 11; + optional LabelSelector namespace_selector = 12; + optional RegexPattern namespace_pattern = 13; + optional LabelSelector workload_selector = 14; + optional LabelSelector annotation_selector = 15; + repeated string workload_names = 16; + optional RegexPattern name_pattern = 17; + repeated K8sObjectKind kind_filter = 18; + repeated string node_group_names = 19; + // Passed verbatim into the CR's spec.selector; operators restricted to + // In/NotIn/Exists/DoesNotExist (validated server-side). + optional LabelSelector pod_selector = 21; + repeated string container_names = 22; +} + +// NOTE: the spec's target-level runtime `status` field (§8) is deliberately +// absent — phase 6 (status ingestion) adds it as a backward-compatible field +// at tag 120, mirroring NodePolicyTarget.status. +message SnapshotPolicyTarget { + string target_id = 1; + string policy_id = 2; + string team_id = 3; + string name = 4; + string description = 5; + int32 priority = 6; + bool enabled = 7; + SnapshotTargetScope scope = 11; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; + // Ingested runtime status of the target's compiled CRs (spec §8). + // Populated by ListSnapshotPolicyTargets; unset when nothing ingested. + SnapshotPolicyTargetStatus status = 120; +} + +message ForensicSnapshotPolicyTarget { + string target_id = 1; + string policy_id = 2; + string team_id = 3; + string name = 4; + string description = 5; + int32 priority = 6; + bool enabled = 7; + SnapshotTargetScope scope = 11; + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; + // Ingested runtime status of the target's compiled chain CRs (spec §8). + SnapshotPolicyTargetStatus status = 120; +} + +// ---- CRUD: snapshot policies ---- +message CreateSnapshotPoliciesRequest { + string team_id = 1; + repeated SnapshotPolicy policies = 2; // policy_id/timestamps ignored +} +message CreateSnapshotPoliciesResponse { + repeated SnapshotPolicy policies = 1; +} +message ListSnapshotPoliciesRequest { + string team_id = 1; + int32 limit = 2; + int32 offset = 3; +} +message ListSnapshotPoliciesResponse { + repeated SnapshotPolicy policies = 1; + int64 total = 2; +} +message UpdateSnapshotPolicyRequest { + string team_id = 1; + SnapshotPolicy policy = 2; +} +message UpdateSnapshotPolicyResponse { + SnapshotPolicy policy = 1; +} +message DeleteSnapshotPolicyRequest { + string team_id = 1; + string policy_id = 2; +} +message DeleteSnapshotPolicyResponse { + bool success = 1; +} + +// ---- CRUD: snapshot policy targets ---- +message CreateSnapshotPolicyTargetsRequest { + string team_id = 1; + repeated SnapshotPolicyTarget targets = 2; // target_id/timestamps ignored +} +message CreateSnapshotPolicyTargetsResponse { + repeated SnapshotPolicyTarget targets = 1; +} +message ListSnapshotPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; + int32 limit = 3; + int32 offset = 4; +} +message ListSnapshotPolicyTargetsResponse { + repeated SnapshotPolicyTarget targets = 1; + int64 total = 2; +} +message UpdateSnapshotPolicyTargetRequest { + string team_id = 1; + SnapshotPolicyTarget target = 2; +} +message UpdateSnapshotPolicyTargetResponse { + SnapshotPolicyTarget target = 1; +} +message DeleteSnapshotPolicyTargetRequest { + string team_id = 1; + repeated string target_ids = 2; +} +message DeleteSnapshotPolicyTargetResponse { + bool success = 1; +} + +// ---- CRUD: forensic snapshot policies + targets (mirrors above) ---- +message CreateForensicSnapshotPoliciesRequest { + string team_id = 1; + repeated ForensicSnapshotPolicy policies = 2; +} +message CreateForensicSnapshotPoliciesResponse { + repeated ForensicSnapshotPolicy policies = 1; +} +message ListForensicSnapshotPoliciesRequest { + string team_id = 1; + int32 limit = 2; + int32 offset = 3; +} +message ListForensicSnapshotPoliciesResponse { + repeated ForensicSnapshotPolicy policies = 1; + int64 total = 2; +} +message UpdateForensicSnapshotPolicyRequest { + string team_id = 1; + ForensicSnapshotPolicy policy = 2; +} +message UpdateForensicSnapshotPolicyResponse { + ForensicSnapshotPolicy policy = 1; +} +message DeleteForensicSnapshotPolicyRequest { + string team_id = 1; + string policy_id = 2; +} +message DeleteForensicSnapshotPolicyResponse { + bool success = 1; +} +message CreateForensicSnapshotPolicyTargetsRequest { + string team_id = 1; + repeated ForensicSnapshotPolicyTarget targets = 2; +} +message CreateForensicSnapshotPolicyTargetsResponse { + repeated ForensicSnapshotPolicyTarget targets = 1; +} +message ListForensicSnapshotPolicyTargetsRequest { + string team_id = 1; + optional string policy_id = 2; + int32 limit = 3; + int32 offset = 4; +} +message ListForensicSnapshotPolicyTargetsResponse { + repeated ForensicSnapshotPolicyTarget targets = 1; + int64 total = 2; +} +message UpdateForensicSnapshotPolicyTargetRequest { + string team_id = 1; + ForensicSnapshotPolicyTarget target = 2; +} +message UpdateForensicSnapshotPolicyTargetResponse { + ForensicSnapshotPolicyTarget target = 1; +} +message DeleteForensicSnapshotPolicyTargetRequest { + string team_id = 1; + repeated string target_ids = 2; +} +message DeleteForensicSnapshotPolicyTargetResponse { + bool success = 1; +} + +// ---- Forensic run trigger ---- +message TriggerForensicSnapshotRunRequest { + string team_id = 1; + string policy_id = 2; +} +message TriggerForensicSnapshotRunResponse { + int32 run_generation = 1; +} + +// ---- Targeting preview (shared resolver, spec §6) ---- +message SnapshotResolvedWorkload { + K8sObjectKind kind = 1; + string name = 2; + string uid = 3; + optional LabelSelector pod_selector = 4; // from the workload's pod template + // Summed container resource requests + replicas from the workload spec, + // for the preview's workload table. Zero when the kind has no typed spec + // (Pod, CRDs) or the field is absent (DaemonSet/Job have no replica count). + int32 replicas = 5; + int64 cpu_request_millicores = 6; + int64 memory_request_bytes = 7; +} +message SnapshotResolvedNamespace { + string namespace = 1; + // Present only when workload-scope criteria were used; empty for + // pod_selector-passthrough targets. + repeated SnapshotResolvedWorkload workloads = 2; + bool pod_selector_passthrough = 3; +} +message SnapshotClusterScopePreview { + string cluster_id = 1; + repeated SnapshotResolvedNamespace namespaces = 2; + bool truncated = 3; // fan-out cap hit (spec §6) + string error = 4; // per-cluster resolution error (cluster missing, etc.) +} +message PreviewSnapshotPolicyTargetMatchesRequest { + string team_id = 1; + SnapshotTargetScope scope = 2; // unsaved target scope +} +message PreviewSnapshotPolicyTargetMatchesResponse { + repeated SnapshotClusterScopePreview clusters = 1; +} +message ForensicTargetOverlap { + string target_id = 1; + string policy_id = 2; + string cluster_id = 3; + string namespace = 4; + repeated string workload_uids = 5; +} +message PreviewForensicSnapshotPolicyTargetMatchesRequest { + string team_id = 1; + SnapshotTargetScope scope = 2; + // When previewing edits to an existing target, set this to its id so the + // target's persisted copy is not reported as overlapping itself. + optional string exclude_target_id = 3; +} +message PreviewForensicSnapshotPolicyTargetMatchesResponse { + repeated SnapshotClusterScopePreview clusters = 1; + // Enabled forensic targets whose rendered workloads intersect this scope + // (overlapping forensic captures race on DeletePod — spec §2). Computed + // against the rendered-scope read model, so overlaps reflect each + // target's matches as of its LAST RENDER (up to one render interval + // stale), not a live re-resolution. + repeated ForensicTargetOverlap overlaps = 2; +} + +// ---- Rendered scope (read model, spec §3.5) ---- +message SnapshotRenderedScopeRow { + string cluster_id = 1; + string policy_id = 2; + string target_id = 3; + string namespace = 4; + optional LabelSelector pod_selector = 5; + repeated string container_names = 6; + int32 workload_count = 7; + repeated SnapshotResolvedWorkload workloads = 8; + string config_id = 9; + optional int32 run_generation = 10; // forensic only + google.protobuf.Timestamp updated_at = 51; +} +message GetSnapshotPolicyTargetRenderedScopeRequest { + string team_id = 1; + oneof by { + string target_id = 2; + string policy_id = 3; + } + int32 limit = 4; + int32 offset = 5; +} +message GetSnapshotPolicyTargetRenderedScopeResponse { + repeated SnapshotRenderedScopeRow rows = 1; + int64 total = 2; +} +message GetForensicSnapshotPolicyTargetRenderedScopeRequest { + string team_id = 1; + oneof by { + string target_id = 2; + string policy_id = 3; + } + int32 limit = 4; + int32 offset = 5; +} +message GetForensicSnapshotPolicyTargetRenderedScopeResponse { + repeated SnapshotRenderedScopeRow rows = 1; + int64 total = 2; +} + +// ---- Delivery status (apply layer now; runtime status added in phase 6) ---- +message SnapshotConfigInfo { + string config_id = 1; + string cluster_id = 2; + string content_hash = 3; + string status = 4; // pending | applied | failed + string error = 5; + optional int32 run_generation = 6; // forensic only + string triggered_by = 7; // forensic only + google.protobuf.Timestamp created_at = 51; + google.protobuf.Timestamp updated_at = 52; +} +message SnapshotConfigApplyEventInfo { + string event_id = 1; + string config_id = 2; + string status = 3; + string error = 4; + google.protobuf.Timestamp applied_at = 51; + google.protobuf.Timestamp created_at = 52; +} +message GetSnapshotRecommendationStatusRequest { + string team_id = 1; + string cluster_id = 2; + int32 event_limit = 3; // default 20 +} +message GetSnapshotRecommendationStatusResponse { + optional SnapshotConfigInfo current_config = 1; + repeated SnapshotConfigApplyEventInfo events = 2; + // Ingested runtime status of the cluster's resilience-family CRs. + repeated SnapshotCRRuntimeStatus runtime = 3; + SnapshotPrereqs prereqs = 4; +} +message GetForensicSnapshotRecommendationStatusRequest { + string team_id = 1; + string cluster_id = 2; + int32 event_limit = 3; +} +message GetForensicSnapshotRecommendationStatusResponse { + optional SnapshotConfigInfo current_config = 1; + repeated SnapshotConfigApplyEventInfo events = 2; + // Ingested runtime status of the cluster's ForensicSnapshotChain CRs. + repeated SnapshotCRRuntimeStatus runtime = 3; +} + +// ---- Compiled-config preview (implemented in phase 3; Unimplemented now) ---- +message PreviewSnapshotRecommendationConfigRequest { + string team_id = 1; + string cluster_id = 2; +} +message PreviewSnapshotRecommendationConfigResponse { + string yaml = 1; +} +message PreviewForensicSnapshotRecommendationConfigRequest { + string team_id = 1; + string cluster_id = 2; +} +message PreviewForensicSnapshotRecommendationConfigResponse { + string yaml = 1; +} + +// ---- KEDA shared authentication ---- +message ListReferencedAuthenticationsRequest { + string team_id = 1; + string cluster_id = 2; +} + +// ReferencedAuthentication is a distinct KEDA authenticationRef observed +// across a cluster's active WorkloadRules. +// It carries no credential or secret data. +message ReferencedAuthentication { + string name = 1; + // kind is either TriggerAuthentication or ClusterTriggerAuthentication. + string kind = 2; + // used_by_count is the number of active WorkloadRules that reference this auth object. + int64 used_by_count = 3; + // namespaces lists the namespaces of the referencing WorkloadRules. + repeated string namespaces = 4; +} + +message ListReferencedAuthenticationsResponse { + repeated ReferencedAuthentication authentications = 1; +} diff --git a/internal/provider/cluster_resource.go b/internal/provider/cluster_resource.go index 22a9dd6..3060cb9 100644 --- a/internal/provider/cluster_resource.go +++ b/internal/provider/cluster_resource.go @@ -170,12 +170,16 @@ func (r *ClusterResource) Read(ctx context.Context, req resource.ReadRequest, re getClusterResp, err := r.client.K8SServiceClient.GetCluster(ctx, connect.NewRequest(getClusterReq)) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + resp.State.RemoveResource(ctx) + return + } resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get cluster, got error: %s", err)) return } if getClusterResp.Msg.Cluster == nil { - resp.Diagnostics.AddError("Client Error", "Cluster not found") + resp.State.RemoveResource(ctx) return } @@ -217,7 +221,11 @@ func (r *ClusterResource) Update(ctx context.Context, req resource.UpdateRequest return } - data.Name = types.StringValue(updateClusterResp.Msg.Cluster.CustomName) + updatedName := updateClusterResp.Msg.Cluster.CustomName + if updatedName == "" { + updatedName = updateClusterResp.Msg.Cluster.Name + } + data.Name = types.StringValue(updatedName) // If prior token was empty, rotate it now and persist the new token in state if data.Token.IsNull() || data.Token.IsUnknown() || data.Token.ValueString() == "" { @@ -257,7 +265,7 @@ func (r *ClusterResource) Delete(ctx context.Context, req resource.DeleteRequest } _, err := r.client.ClusterMutationClient.DeleteCluster(ctx, connect.NewRequest(deleteClusterReq)) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete cluster, got error: %s", err)) return } diff --git a/internal/provider/fake_server_lifecycle_extra_test.go b/internal/provider/fake_server_lifecycle_extra_test.go new file mode 100644 index 0000000..ebcd586 --- /dev/null +++ b/internal/provider/fake_server_lifecycle_extra_test.go @@ -0,0 +1,287 @@ +package provider + +import ( + "context" + "fmt" + "testing" + + "connectrpc.com/connect" + "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/types" + + apiv1 "github.com/devzero-inc/terraform-provider-devzero/internal/gen/api/v1" +) + +// --------------------------------------------------------------------------- +// Cluster RPCs on the fake backend (K8SService + ClusterMutationService). +// --------------------------------------------------------------------------- + +func (f *fakeBackend) CreateCluster(_ context.Context, req *connect.Request[apiv1.CreateClusterRequest]) (*connect.Response[apiv1.CreateClusterResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if f.clusters == nil { + f.clusters = map[string]*apiv1.Cluster{} + } + c := &apiv1.Cluster{Id: f.id("cl"), Name: req.Msg.ClusterName, CustomName: req.Msg.ClusterName} + f.clusters[c.Id] = c + return connect.NewResponse(&apiv1.CreateClusterResponse{Cluster: c, Token: "tok-" + c.Id}), nil +} + +func (f *fakeBackend) GetCluster(_ context.Context, req *connect.Request[apiv1.GetClusterRequest]) (*connect.Response[apiv1.GetClusterResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + c, ok := f.clusters[req.Msg.ClusterId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("cluster not found")) + } + return connect.NewResponse(&apiv1.GetClusterResponse{Cluster: c}), nil +} + +func (f *fakeBackend) UpdateCluster(_ context.Context, req *connect.Request[apiv1.UpdateClusterRequest]) (*connect.Response[apiv1.UpdateClusterResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + c, ok := f.clusters[req.Msg.ClusterId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("cluster not found")) + } + c.CustomName = req.Msg.ClusterName + return connect.NewResponse(&apiv1.UpdateClusterResponse{Cluster: c}), nil +} + +func (f *fakeBackend) DeleteCluster(_ context.Context, req *connect.Request[apiv1.DeleteClusterRequest]) (*connect.Response[apiv1.DeleteClusterResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.clusters[req.Msg.ClusterId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("cluster not found")) + } + delete(f.clusters, req.Msg.ClusterId) + return connect.NewResponse(&apiv1.DeleteClusterResponse{}), nil +} + +func (f *fakeBackend) ResetClusterToken(_ context.Context, req *connect.Request[apiv1.ResetClusterTokenRequest]) (*connect.Response[apiv1.ResetClusterTokenResponse], error) { + return connect.NewResponse(&apiv1.ResetClusterTokenResponse{Token: "rotated-" + req.Msg.ClusterId}), nil +} + +// --------------------------------------------------------------------------- +// Cluster lifecycle +// --------------------------------------------------------------------------- + +func TestLifecycle_Cluster(t *testing.T) { + ctx := context.Background() + fake := newFakeClientSetT(t) + r := &ClusterResource{client: fake.cs} + + // Create + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[ClusterResourceModel](t, r, func(m *ClusterResourceModel) { + m.Name = stringVal("prod-cluster") + })}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + + var created ClusterResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + if created.Id.ValueString() == "" || created.Token.ValueString() == "" { + t.Fatalf("expected id and token after create, got %+v", created) + } + + // Update (rename) — token must be preserved, name read back with fallback. + updResp := resource.UpdateResponse{State: createResp.State} + r.Update(ctx, resource.UpdateRequest{ + Plan: buildPlan[ClusterResourceModel](t, r, func(m *ClusterResourceModel) { + m.Id = created.Id + m.Name = stringVal("prod-cluster-renamed") + m.Token = created.Token + }), + State: createResp.State, + }, &updResp) + mustNoDiags(t, "Update", updResp.Diagnostics) + var updated ClusterResourceModel + mustNoDiags(t, "State.Get", updResp.State.Get(ctx, &updated)) + if updated.Name.ValueString() != "prod-cluster-renamed" { + t.Fatalf("Name after update: %q", updated.Name.ValueString()) + } + if updated.Token.ValueString() != created.Token.ValueString() { + t.Fatal("token must be preserved across updates") + } + + // Out-of-band delete → Read drops from state. + fake.backend.mu.Lock() + delete(fake.backend.clusters, created.Id.ValueString()) + fake.backend.mu.Unlock() + readGone := resource.ReadResponse{State: updResp.State} + r.Read(ctx, resource.ReadRequest{State: updResp.State}, &readGone) + mustNoDiags(t, "Read after out-of-band delete", readGone.Diagnostics) + if !readGone.State.Raw.IsNull() { + t.Fatal("expected state removal after out-of-band delete") + } + + // Delete of an already-gone cluster is tolerated. + delResp := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: updResp.State}, &delResp) + mustNoDiags(t, "Delete (already gone)", delResp.Diagnostics) +} + +// --------------------------------------------------------------------------- +// Update lifecycles previously untested end-to-end +// --------------------------------------------------------------------------- + +func TestLifecycle_NodePolicy_Update(t *testing.T) { + ctx := context.Background() + fake := newFakeClientSetT(t) + r := &NodePolicyResource{client: fake.cs} + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[NodePolicyResourceModel](t, r, func(m *NodePolicyResourceModel) { + m.Name = stringVal("pool") + azure := &AzureNodeClass{} + hydrateNested(t, r, "azure", azure) + azure.VnetSubnetId = stringVal("subnet-a") + m.Azure = azure + })}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created NodePolicyResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + + // Update: change the subnet and add a startup taint. + updResp := resource.UpdateResponse{State: createResp.State} + r.Update(ctx, resource.UpdateRequest{ + Plan: buildPlan[NodePolicyResourceModel](t, r, func(m *NodePolicyResourceModel) { + m.Id = created.Id + m.Name = stringVal("pool") + azure := &AzureNodeClass{} + hydrateNested(t, r, "azure", azure) + azure.VnetSubnetId = stringVal("subnet-b") + m.Azure = azure + }), + State: createResp.State, + }, &updResp) + mustNoDiags(t, "Update", updResp.Diagnostics) + var updated NodePolicyResourceModel + mustNoDiags(t, "State.Get", updResp.State.Get(ctx, &updated)) + if updated.Azure == nil || updated.Azure.VnetSubnetId.ValueString() != "subnet-b" { + t.Fatalf("azure.vnet_subnet_id after update: %+v", updated.Azure) + } + fake.backend.mu.Lock() + stored := fake.backend.nodePol[created.Id.ValueString()] + fake.backend.mu.Unlock() + if stored == nil || stored.Azure.GetVnetSubnetId() != "subnet-b" { + t.Fatalf("backend did not receive the updated subnet: %+v", stored) + } +} + +func TestLifecycle_WorkloadPolicyTarget_Update(t *testing.T) { + ctx := context.Background() + fake := newFakeClientSetT(t) + r := &WorkloadPolicyTargetResource{client: fake.cs} + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadPolicyTargetResourceModel](t, r, func(m *WorkloadPolicyTargetResourceModel) { + m.Name = stringVal("t1") + m.PolicyId = stringVal("wp-0001") + m.Enabled = boolValTrue() + m.ClusterIds = stringList("c1") + })}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created WorkloadPolicyTargetResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + + updResp := resource.UpdateResponse{State: createResp.State} + r.Update(ctx, resource.UpdateRequest{ + Plan: buildPlan[WorkloadPolicyTargetResourceModel](t, r, func(m *WorkloadPolicyTargetResourceModel) { + m.Id = created.Id + m.Name = stringVal("t1-renamed") + m.PolicyId = stringVal("wp-0001") + m.Enabled = boolValFalse() + m.ClusterIds = stringList("c1") + m.WorkloadNamesNotIn = stringList("excluded-app") + }), + State: createResp.State, + }, &updResp) + mustNoDiags(t, "Update", updResp.Diagnostics) + + fake.backend.mu.Lock() + stored := fake.backend.wpt[created.Id.ValueString()] + fake.backend.mu.Unlock() + if stored == nil { + t.Fatal("target missing backend-side") + } + if stored.Name != "t1-renamed" || stored.Enabled || len(stored.WorkloadNamesNotIn) != 1 { + t.Fatalf("update not propagated: name=%q enabled=%v notIn=%v", stored.Name, stored.Enabled, stored.WorkloadNamesNotIn) + } +} + +// --------------------------------------------------------------------------- +// Import-shaped Read: state contains only the ID (what ImportState produces). +// The Read must populate the full state from the API alone. +// --------------------------------------------------------------------------- + +func TestLifecycle_WorkloadPolicy_ImportShapedRead(t *testing.T) { + ctx := context.Background() + fake := newFakeClientSetT(t) + r := &WorkloadPolicyResource{client: fake.cs} + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadPolicyResourceModel](t, r, func(m *WorkloadPolicyResourceModel) { + m.Name = stringVal("imported") + m.EnableInPlaceVerticalScaling = boolValTrue() + cpu := &VerticalScalingOptions{} + hydrateNested(t, r, "cpu_vertical_scaling", cpu) + cpu.Enabled = boolValTrue() + m.CPUVerticalScaling = cpu + })}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created WorkloadPolicyResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + + // Simulate `terraform import `: state holds only the id. + importState := emptyState(t, r) + var blank WorkloadPolicyResourceModel + mustNoDiags(t, "hydrate blank", buildPlan[WorkloadPolicyResourceModel](t, r, func(m *WorkloadPolicyResourceModel) { + m.Id = created.Id + }).Get(ctx, &blank)) + mustNoDiags(t, "seed import state", importState.Set(ctx, &blank)) + + readResp := resource.ReadResponse{State: importState} + r.Read(ctx, resource.ReadRequest{State: importState}, &readResp) + mustNoDiags(t, "Read (import-shaped)", readResp.Diagnostics) + + var imported WorkloadPolicyResourceModel + mustNoDiags(t, "State.Get", readResp.State.Get(ctx, &imported)) + if imported.Name.ValueString() != "imported" { + t.Fatalf("import Read did not populate name: %q", imported.Name.ValueString()) + } + if imported.CPUVerticalScaling == nil || !imported.CPUVerticalScaling.Enabled.ValueBool() { + t.Fatalf("import Read did not populate the nested vertical scaling block: %+v", imported.CPUVerticalScaling) + } + if !imported.EnableInPlaceVerticalScaling.ValueBool() { + t.Fatal("import Read did not populate enable_in_place_vertical_scaling") + } +} + +// --------------------------------------------------------------------------- +// small typed-value helpers for this file +// --------------------------------------------------------------------------- + +type fakeHarness struct { + cs *ClientSet + backend *fakeBackend +} + +func newFakeClientSetT(t *testing.T) fakeHarness { + cs, backend := newFakeClientSet(t) + return fakeHarness{cs: cs, backend: backend} +} + +func stringVal(s string) types.String { return types.StringValue(s) } + +func stringList(items ...string) types.List { + vals := make([]attr.Value, 0, len(items)) + for _, it := range items { + vals = append(vals, types.StringValue(it)) + } + return types.ListValueMust(types.StringType, vals) +} + +func boolValTrue() types.Bool { return types.BoolValue(true) } +func boolValFalse() types.Bool { return types.BoolValue(false) } diff --git a/internal/provider/fake_server_test.go b/internal/provider/fake_server_test.go new file mode 100644 index 0000000..94fd1c3 --- /dev/null +++ b/internal/provider/fake_server_test.go @@ -0,0 +1,744 @@ +package provider + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "sync" + "testing" + + "connectrpc.com/connect" + "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-go/tftypes" + + apiv1 "github.com/devzero-inc/terraform-provider-devzero/internal/gen/api/v1" + apiv1connect "github.com/devzero-inc/terraform-provider-devzero/internal/gen/api/v1/apiv1connect" +) + +// --------------------------------------------------------------------------- +// Fake backend: an in-memory implementation of the RPCs the provider calls, +// mimicking the dakr semantics that matter to CRUD correctness (upserts, +// NotFound codes, target invariants, disabled-on-update rejection, virtual +// cluster-sourced node policies in list responses). +// --------------------------------------------------------------------------- + +type fakeBackend struct { + apiv1connect.UnimplementedK8SRecommendationServiceHandler + apiv1connect.UnimplementedK8SServiceHandler + apiv1connect.UnimplementedClusterMutationServiceHandler + + mu sync.Mutex + nextID int + teamID string + nodePol map[string]*apiv1.NodePolicy + nodeTgt map[string]*apiv1.NodePolicyTarget + wp map[string]*apiv1.WorkloadRecommendationPolicy + wpt map[string]*apiv1.WorkloadPolicyTarget + rules map[string]*apiv1.WorkloadRule + clusters map[string]*apiv1.Cluster +} + +func newFakeBackend(teamID string) *fakeBackend { + return &fakeBackend{ + teamID: teamID, + nodePol: map[string]*apiv1.NodePolicy{}, + nodeTgt: map[string]*apiv1.NodePolicyTarget{}, + wp: map[string]*apiv1.WorkloadRecommendationPolicy{}, + wpt: map[string]*apiv1.WorkloadPolicyTarget{}, + rules: map[string]*apiv1.WorkloadRule{}, + clusters: map[string]*apiv1.Cluster{}, + } +} + +func (f *fakeBackend) id(prefix string) string { + f.nextID++ + return fmt.Sprintf("%s-%04d", prefix, f.nextID) +} + +// --- node policies --- + +func (f *fakeBackend) CreateNodePolicies(_ context.Context, req *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + out := make([]*apiv1.NodePolicy, 0, len(req.Msg.Policies)) + for _, p := range req.Msg.Policies { + if p.Id == "" { + p.Id = f.id("np") + } + p.TeamId = req.Msg.TeamId + f.nodePol[p.Id] = p + out = append(out, p) + } + return connect.NewResponse(&apiv1.CreateNodePoliciesResponse{Policies: out}), nil +} + +func (f *fakeBackend) ListNodePolicies(_ context.Context, _ *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + resp := &apiv1.ListNodePoliciesResponse{} + for _, p := range f.nodePol { + resp.Policies = append(resp.Policies, p) + } + // dakr mixes read-only virtual policies mirrored from non-dakr Karpenter + // resources into the list; the provider must skip them. + resp.Policies = append(resp.Policies, &apiv1.NodePolicy{ + Id: "np-virtual-cluster", + Name: "cluster-managed", + Source: "cluster", + }) + return connect.NewResponse(resp), nil +} + +func (f *fakeBackend) UpdateNodePolicy(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyRequest]) (*connect.Response[apiv1.UpdateNodePolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p := req.Msg.Policy + if _, ok := f.nodePol[p.Id]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("node policy not found")) + } + f.nodePol[p.Id] = p + return connect.NewResponse(&apiv1.UpdateNodePolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) DeleteNodePolicy(_ context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.nodePol[req.Msg.PolicyId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("resource not found")) + } + delete(f.nodePol, req.Msg.PolicyId) + var deleted int32 + for id, t := range f.nodeTgt { + if t.PolicyId == req.Msg.PolicyId { + delete(f.nodeTgt, id) + deleted++ + } + } + return connect.NewResponse(&apiv1.DeleteNodePolicyResponse{Success: true, DeletedTargetCount: deleted}), nil +} + +// --- node policy targets --- + +func (f *fakeBackend) CreateNodePolicyTargets(_ context.Context, req *connect.Request[apiv1.CreateNodePolicyTargetsRequest]) (*connect.Response[apiv1.CreateNodePolicyTargetsResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + out := make([]*apiv1.NodePolicyTarget, 0, len(req.Msg.Targets)) + for _, t := range req.Msg.Targets { + if t.TargetId != "" { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("target_id must be empty on create")) + } + if len(t.ClusterIds) > 1 { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("node policy target must target at most one cluster")) + } + t.TargetId = f.id("npt") + f.nodeTgt[t.TargetId] = t + out = append(out, t) + } + return connect.NewResponse(&apiv1.CreateNodePolicyTargetsResponse{Targets: out}), nil +} + +func (f *fakeBackend) ListNodePolicyTargets(_ context.Context, _ *connect.Request[apiv1.ListNodePolicyTargetsRequest]) (*connect.Response[apiv1.ListNodePolicyTargetsResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + resp := &apiv1.ListNodePolicyTargetsResponse{} + for _, t := range f.nodeTgt { + resp.Targets = append(resp.Targets, t) + } + return connect.NewResponse(resp), nil +} + +func (f *fakeBackend) UpdateNodePolicyTarget(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyTargetRequest]) (*connect.Response[apiv1.UpdateNodePolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t := req.Msg.Target + if _, ok := f.nodeTgt[t.TargetId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + if len(t.ClusterIds) > 1 { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("node policy target must target at most one cluster")) + } + f.nodeTgt[t.TargetId] = t + return connect.NewResponse(&apiv1.UpdateNodePolicyTargetResponse{Target: t}), nil +} + +// --- workload policies (v1) --- + +func (f *fakeBackend) CreateWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.CreateWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.CreateWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p := req.Msg.Policy + if p == nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("policy required")) + } + p.PolicyId = f.id("wp") + p.TeamId = req.Msg.TeamId + f.wp[p.PolicyId] = p + return connect.NewResponse(&apiv1.CreateWorkloadRecommendationPolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) GetWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.GetWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.GetWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p, ok := f.wp[req.Msg.PolicyId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload policy not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadRecommendationPolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) UpdateWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.UpdateWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.UpdateWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + p := req.Msg.Policy + if p == nil { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("policy required")) + } + if _, ok := f.wp[p.PolicyId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload policy not found")) + } + f.wp[p.PolicyId] = p + return connect.NewResponse(&apiv1.UpdateWorkloadRecommendationPolicyResponse{Policy: p}), nil +} + +func (f *fakeBackend) DeleteWorkloadRecommendationPolicy(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.DeleteWorkloadRecommendationPolicyResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.wp[req.Msg.PolicyId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload policy not found")) + } + delete(f.wp, req.Msg.PolicyId) + return connect.NewResponse(&apiv1.DeleteWorkloadRecommendationPolicyResponse{Success: true}), nil +} + +// --- workload policy targets --- + +func (f *fakeBackend) CreateWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.CreateWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.CreateWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if len(req.Msg.ClusterIds) == 0 { + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("cluster_ids must name at least one cluster")) + } + t := &apiv1.WorkloadPolicyTarget{ + TargetId: f.id("wpt"), + PolicyId: req.Msg.PolicyId, + TeamId: req.Msg.TeamId, + Name: req.Msg.Name, + Description: req.Msg.Description, + Priority: req.Msg.Priority, + Enabled: req.Msg.Enabled, + NamespaceSelector: req.Msg.NamespaceSelector, + WorkloadSelector: req.Msg.WorkloadSelector, + AnnotationSelector: req.Msg.AnnotationSelector, + KindFilter: req.Msg.KindFilter, + KindFilterNotIn: req.Msg.KindFilterNotIn, + NamePattern: req.Msg.NamePattern, + NamespacePattern: req.Msg.NamespacePattern, + WorkloadNames: req.Msg.WorkloadNames, + WorkloadNamesNotIn: req.Msg.WorkloadNamesNotIn, + NodeGroupNames: req.Msg.NodeGroupNames, //nolint:staticcheck // deprecated upstream but still round-tripped + ClusterIds: req.Msg.ClusterIds, + } + f.wpt[t.TargetId] = t + return connect.NewResponse(&apiv1.CreateWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) GetWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.GetWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.GetWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t, ok := f.wpt[req.Msg.TargetId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) UpdateWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.UpdateWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.UpdateWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + t, ok := f.wpt[req.Msg.TargetId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("target not found")) + } + t.Name = req.Msg.Name + t.Description = req.Msg.Description + t.Priority = req.Msg.Priority + t.Enabled = req.Msg.Enabled + t.NamespaceSelector = req.Msg.NamespaceSelector + t.WorkloadSelector = req.Msg.WorkloadSelector + t.AnnotationSelector = req.Msg.AnnotationSelector + t.KindFilter = req.Msg.KindFilter + t.KindFilterNotIn = req.Msg.KindFilterNotIn + t.NamePattern = req.Msg.NamePattern + t.NamespacePattern = req.Msg.NamespacePattern + t.WorkloadNames = req.Msg.WorkloadNames + t.WorkloadNamesNotIn = req.Msg.WorkloadNamesNotIn + t.NodeGroupNames = req.Msg.NodeGroupNames //nolint:staticcheck // deprecated upstream but still round-tripped + if len(req.Msg.ClusterIds) > 0 { + t.ClusterIds = req.Msg.ClusterIds + } + return connect.NewResponse(&apiv1.UpdateWorkloadPolicyTargetResponse{Target: t}), nil +} + +func (f *fakeBackend) DeleteWorkloadPolicyTarget(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.DeleteWorkloadPolicyTargetResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + found := false + for _, id := range req.Msg.TargetIds { + if _, ok := f.wpt[id]; ok { + delete(f.wpt, id) + found = true + } + } + if !found { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("no workload policy targets found for deletion")) + } + return connect.NewResponse(&apiv1.DeleteWorkloadPolicyTargetResponse{}), nil +} + +// --- workload rules (v2) --- + +func (f *fakeBackend) UpsertManualWorkloadRule(_ context.Context, req *connect.Request[apiv1.UpsertManualWorkloadRuleRequest]) (*connect.Response[apiv1.UpsertManualWorkloadRuleResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + key := req.Msg.ClusterId + "/" + req.Msg.Namespace + "/" + req.Msg.Kind + "/" + req.Msg.Name + var existing *apiv1.WorkloadRule + for _, r := range f.rules { + if r.ClusterId+"/"+r.Namespace+"/"+r.Kind+"/"+r.Name == key { + existing = r + break + } + } + if existing != nil && req.Msg.Fields != nil && req.Msg.Fields.Disabled != nil { + // dakr: fields.disabled cannot be set when updating an existing rule. + return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("fields.disabled cannot be set when updating an existing rule; use ToggleWorkloadRuleDisabled instead")) + } + rule := &apiv1.WorkloadRule{ + ClusterId: req.Msg.ClusterId, + Namespace: req.Msg.Namespace, + Kind: req.Msg.Kind, + Name: req.Msg.Name, + CurrentSource: workloadRuleSourceString(req.Msg.Source), + Status: "active", + SyncStatus: "pending", + Generation: 1, + } + if existing != nil { + rule.RuleId = existing.RuleId + rule.Generation = existing.Generation + 1 + rule.Disabled = existing.Disabled + } else { + rule.RuleId = f.id("wr") + } + if fields := req.Msg.Fields; fields != nil { + rule.CpuRule = fields.CpuRule + rule.MemoryRule = fields.MemoryRule + rule.GpuRule = fields.GpuRule + rule.HpaRule = fields.HpaRule + rule.EmergencyResponse = fields.EmergencyResponse + rule.ActionTriggers = fields.ActionTriggers + rule.DetectionTriggers = fields.DetectionTriggers + rule.SchedulerPlugins = fields.SchedulerPlugins + rule.LiveMigrationEnabled = fields.LiveMigrationEnabled + rule.UseInPlaceVerticalScaling = fields.UseInPlaceVerticalScaling + rule.Containers = fields.Containers + rule.LookbackPeriodSeconds = fields.LookbackPeriodSeconds + rule.StartupPeriodSeconds = fields.StartupPeriodSeconds + rule.CronSchedule = fields.CronSchedule + rule.CooldownMinutes = fields.CooldownMinutes + rule.DefragmentationSchedule = fields.DefragmentationSchedule + if fields.Disabled != nil { + rule.Disabled = *fields.Disabled + } + } + f.rules[rule.RuleId] = rule + return connect.NewResponse(&apiv1.UpsertManualWorkloadRuleResponse{Rule: rule}), nil +} + +func workloadRuleSourceString(s apiv1.WorkloadRuleSource) string { + switch s { + case apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_TERRAFORM_AUTO: + return "terraform_auto" + case apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_TERRAFORM_MANUAL: + return "terraform_manual" + default: + return "manual" + } +} + +func (f *fakeBackend) GetWorkloadRuleByID(_ context.Context, req *connect.Request[apiv1.GetWorkloadRuleByIDRequest]) (*connect.Response[apiv1.GetWorkloadRuleByIDResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + r, ok := f.rules[req.Msg.RuleId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + return connect.NewResponse(&apiv1.GetWorkloadRuleByIDResponse{Rule: r}), nil +} + +func (f *fakeBackend) DeleteWorkloadRule(_ context.Context, req *connect.Request[apiv1.DeleteWorkloadRuleRequest]) (*connect.Response[apiv1.DeleteWorkloadRuleResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + if _, ok := f.rules[req.Msg.RuleId]; !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + delete(f.rules, req.Msg.RuleId) + return connect.NewResponse(&apiv1.DeleteWorkloadRuleResponse{}), nil +} + +func (f *fakeBackend) ToggleWorkloadRuleDisabled(_ context.Context, req *connect.Request[apiv1.ToggleWorkloadRuleDisabledRequest]) (*connect.Response[apiv1.ToggleWorkloadRuleDisabledResponse], error) { + f.mu.Lock() + defer f.mu.Unlock() + r, ok := f.rules[req.Msg.RuleId] + if !ok { + return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("workload rule not found")) + } + r.Disabled = req.Msg.Disabled + return connect.NewResponse(&apiv1.ToggleWorkloadRuleDisabledResponse{Rule: r}), nil +} + +// --------------------------------------------------------------------------- +// Harness plumbing +// --------------------------------------------------------------------------- + +func newFakeClientSet(t *testing.T) (*ClientSet, *fakeBackend) { + t.Helper() + fake := newFakeBackend("team-1") + mux := http.NewServeMux() + mux.Handle(apiv1connect.NewK8SRecommendationServiceHandler(fake)) + mux.Handle(apiv1connect.NewK8SServiceHandler(fake)) + mux.Handle(apiv1connect.NewClusterMutationServiceHandler(fake)) + srv := httptest.NewServer(mux) + t.Cleanup(srv.Close) + return &ClientSet{ + TeamId: "team-1", + ClusterMutationClient: apiv1connect.NewClusterMutationServiceClient(srv.Client(), srv.URL), + K8SServiceClient: apiv1connect.NewK8SServiceClient(srv.Client(), srv.URL), + RecommendationClient: apiv1connect.NewK8SRecommendationServiceClient(srv.Client(), srv.URL), + }, fake +} + +// buildPlan encodes a model into a tfsdk.Plan against the resource's schema. +// The model is first hydrated from an all-null plan so every types.List/Map/ +// Object field carries its proper element type (a zero types.List fails the +// framework's type verification). +func buildPlan[M any](t *testing.T, res resource.Resource, mutate func(*M)) tfsdk.Plan { + t.Helper() + ctx := context.Background() + var schemaResp resource.SchemaResponse + res.Schema(ctx, resource.SchemaRequest{}, &schemaResp) + if schemaResp.Diagnostics.HasError() { + t.Fatalf("schema: %v", schemaResp.Diagnostics) + } + objType, ok := schemaResp.Schema.Type().TerraformType(ctx).(tftypes.Object) + if !ok { + t.Fatal("schema type is not an object") + } + nulls := make(map[string]tftypes.Value, len(objType.AttributeTypes)) + for name, at := range objType.AttributeTypes { + nulls[name] = tftypes.NewValue(at, nil) + } + plan := tfsdk.Plan{Schema: schemaResp.Schema, Raw: tftypes.NewValue(objType, nulls)} + + var model M + if d := plan.Get(ctx, &model); d.HasError() { + t.Fatalf("plan.Get (hydrate): %v", d) + } + mutate(&model) + if d := plan.Set(ctx, &model); d.HasError() { + t.Fatalf("plan.Set: %v", d) + } + return plan +} + +// hydrateNested populates target (a pointer to a nested tfsdk struct) from a +// null object of the named top-level attribute's type, so all its typed +// null fields (types.List/Map/Object) carry their element types. +func hydrateNested(t *testing.T, res resource.Resource, attrName string, target any) { + t.Helper() + ctx := context.Background() + var schemaResp resource.SchemaResponse + res.Schema(ctx, resource.SchemaRequest{}, &schemaResp) + objType, okObj := schemaResp.Schema.Type().TerraformType(ctx).(tftypes.Object) + if !okObj { + t.Fatal("schema type is not an object") + } + at, ok := objType.AttributeTypes[attrName] + if !ok { + t.Fatalf("attribute %q not in schema", attrName) + } + attrType, err := schemaResp.Schema.TypeAtTerraformPath(ctx, tftypes.NewAttributePath().WithAttributeName(attrName)) + if err != nil { + t.Fatalf("type at path %q: %v", attrName, err) + } + obj, ok := at.(tftypes.Object) + if !ok { + t.Fatalf("attribute %q is not an object", attrName) + } + nulls := make(map[string]tftypes.Value, len(obj.AttributeTypes)) + for name, nt := range obj.AttributeTypes { + nulls[name] = tftypes.NewValue(nt, nil) + } + val, err := attrType.ValueFromTerraform(ctx, tftypes.NewValue(obj, nulls)) + if err != nil { + t.Fatalf("value from terraform: %v", err) + } + if d := tfsdk.ValueAs(ctx, val, target); d.HasError() { + t.Fatalf("ValueAs: %v", d) + } +} + +func emptyState(t *testing.T, res resource.Resource) tfsdk.State { + t.Helper() + ctx := context.Background() + var schemaResp resource.SchemaResponse + res.Schema(ctx, resource.SchemaRequest{}, &schemaResp) + objType := schemaResp.Schema.Type().TerraformType(ctx) + return tfsdk.State{Schema: schemaResp.Schema, Raw: tftypes.NewValue(objType, nil)} +} + +func mustNoDiags(t *testing.T, what string, d interface{ HasError() bool }) { + t.Helper() + if d.HasError() { + t.Fatalf("%s failed: %+v", what, d) + } +} + +// --------------------------------------------------------------------------- +// Lifecycle tests +// --------------------------------------------------------------------------- + +func TestLifecycle_NodePolicy(t *testing.T) { + ctx := context.Background() + cs, fake := newFakeClientSet(t) + r := &NodePolicyResource{client: cs} + + mutate := func(m *NodePolicyResourceModel) { + m.Name = types.StringValue("azure-pool") + m.Description = types.StringValue("desc") + azure := &AzureNodeClass{} + hydrateNested(t, r, "azure", azure) + azure.VnetSubnetId = types.StringValue("/subscriptions/x/subnet/y") + m.Azure = azure + } + + // Create + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[NodePolicyResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + + var created NodePolicyResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + if created.Id.ValueString() == "" { + t.Fatal("expected id after create") + } + if created.Azure == nil || created.Azure.VnetSubnetId.ValueString() != "/subscriptions/x/subnet/y" { + t.Fatalf("azure block not round-tripped: %+v", created.Azure) + } + + // Read refreshes from the API and must skip the virtual source=="cluster" policy. + readResp := resource.ReadResponse{State: createResp.State} + r.Read(ctx, resource.ReadRequest{State: createResp.State}, &readResp) + mustNoDiags(t, "Read", readResp.Diagnostics) + + // Out-of-band deletion drops the resource from state instead of erroring. + fake.mu.Lock() + delete(fake.nodePol, created.Id.ValueString()) + fake.mu.Unlock() + readGone := resource.ReadResponse{State: createResp.State} + r.Read(ctx, resource.ReadRequest{State: createResp.State}, &readGone) + mustNoDiags(t, "Read after out-of-band delete", readGone.Diagnostics) + if !readGone.State.Raw.IsNull() { + t.Fatal("expected state to be removed after out-of-band delete") + } + + // Recreate, then Delete must call the API (policy actually disappears) and + // a second Delete must tolerate NotFound. + createResp = resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[NodePolicyResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "re-Create", createResp.Diagnostics) + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + + delResp := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: createResp.State}, &delResp) + mustNoDiags(t, "Delete", delResp.Diagnostics) + fake.mu.Lock() + _, still := fake.nodePol[created.Id.ValueString()] + fake.mu.Unlock() + if still { + t.Fatal("Delete did not remove the policy from the backend") + } + delAgain := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: createResp.State}, &delAgain) + mustNoDiags(t, "Delete (already gone)", delAgain.Diagnostics) +} + +func TestLifecycle_NodePolicyTarget(t *testing.T) { + ctx := context.Background() + cs, fake := newFakeClientSet(t) + r := &NodePolicyTargetResource{client: cs} + + mutate := func(m *NodePolicyTargetResourceModel) { + m.Name = types.StringValue("target-1") + m.PolicyId = types.StringValue("np-0001") + m.Enabled = types.BoolValue(true) + m.ClusterIds = types.ListValueMust(types.StringType, []attr.Value{types.StringValue("cluster-1")}) + } + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[NodePolicyTargetResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + + var created NodePolicyTargetResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + if created.Id.ValueString() == "" { + t.Fatal("expected target id") + } + + // Destroy must disable the target (no delete RPC exists). + delResp := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: createResp.State}, &delResp) + mustNoDiags(t, "Delete", delResp.Diagnostics) + fake.mu.Lock() + tgt := fake.nodeTgt[created.Id.ValueString()] + fake.mu.Unlock() + if tgt == nil { + t.Fatal("target should still exist backend-side (no delete RPC)") + } + if tgt.Enabled { + t.Fatal("Delete must disable the target") + } +} + +func TestLifecycle_WorkloadPolicy(t *testing.T) { + ctx := context.Background() + cs, fake := newFakeClientSet(t) + r := &WorkloadPolicyResource{client: cs} + + mutate := func(m *WorkloadPolicyResourceModel) { + m.Name = types.StringValue("policy-1") + m.EnableInPlaceVerticalScaling = types.BoolValue(true) + cpu := &VerticalScalingOptions{} + hydrateNested(t, r, "cpu_vertical_scaling", cpu) + cpu.Enabled = types.BoolValue(true) + cpu.MinRequest = types.Int64Value(10) + m.CPUVerticalScaling = cpu + } + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadPolicyResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created WorkloadPolicyResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + + // Read after out-of-band delete removes from state. + fake.mu.Lock() + delete(fake.wp, created.Id.ValueString()) + fake.mu.Unlock() + readGone := resource.ReadResponse{State: createResp.State} + r.Read(ctx, resource.ReadRequest{State: createResp.State}, &readGone) + mustNoDiags(t, "Read after out-of-band delete", readGone.Diagnostics) + if !readGone.State.Raw.IsNull() { + t.Fatal("expected state removal") + } + + // allow_in_place_memory_limit_decrease without in-place scaling is rejected client-side. + badResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadPolicyResourceModel](t, r, func(m *WorkloadPolicyResourceModel) { + m.Name = types.StringValue("bad") + m.AllowInPlaceMemoryLimitDecrease = types.BoolValue(true) + m.EnableInPlaceVerticalScaling = types.BoolValue(false) + })}, &badResp) + if !badResp.Diagnostics.HasError() { + t.Fatal("expected validation error for allow_in_place_memory_limit_decrease without enable_in_place_vertical_scaling") + } +} + +func TestLifecycle_WorkloadRule(t *testing.T) { + ctx := context.Background() + cs, fake := newFakeClientSet(t) + r := &WorkloadRuleResource{client: cs} + + mutate := func(m *WorkloadRuleResourceModel) { + m.ClusterId = types.StringValue("cluster-1") + m.Namespace = types.StringValue("prod") + m.Kind = types.StringValue("Deployment") + m.Name = types.StringValue("api") + m.Disabled = types.BoolValue(false) + cpu := &ResourceRuleConfigModel{} + hydrateNested(t, r, "cpu_rule", cpu) + cpu.Enabled = types.BoolValue(true) + cpu.MinRequest = types.Int64Value(10) + m.CpuRule = cpu + } + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadRuleResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created WorkloadRuleResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + if created.Id.ValueString() == "" { + t.Fatal("expected rule id") + } + + // Update flipping `disabled` must go through the toggle RPC, not the upsert + // (the fake rejects fields.disabled on update, mirroring dakr). + updatePlan := buildPlan[WorkloadRuleResourceModel](t, r, func(m *WorkloadRuleResourceModel) { + mutate(m) + m.Id = created.Id + m.Disabled = types.BoolValue(true) + }) + updResp := resource.UpdateResponse{State: createResp.State} + r.Update(ctx, resource.UpdateRequest{Plan: updatePlan, State: createResp.State}, &updResp) + mustNoDiags(t, "Update", updResp.Diagnostics) + fake.mu.Lock() + rule := fake.rules[created.Id.ValueString()] + fake.mu.Unlock() + if rule == nil || !rule.Disabled { + t.Fatalf("expected rule to be disabled via toggle RPC, got %+v", rule) + } + + // Delete + idempotent delete. + delResp := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: updResp.State}, &delResp) + mustNoDiags(t, "Delete", delResp.Diagnostics) + delAgain := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: updResp.State}, &delAgain) + mustNoDiags(t, "Delete (already gone)", delAgain.Diagnostics) +} + +func TestLifecycle_WorkloadPolicyTarget(t *testing.T) { + ctx := context.Background() + cs, _ := newFakeClientSet(t) + r := &WorkloadPolicyTargetResource{client: cs} + + mutate := func(m *WorkloadPolicyTargetResourceModel) { + m.Name = types.StringValue("t1") + m.PolicyId = types.StringValue("wp-0001") + m.Enabled = types.BoolValue(true) + m.ClusterIds = types.ListValueMust(types.StringType, []attr.Value{types.StringValue("c1")}) + m.NamePattern = &RegexPattern{ + Pattern: types.StringValue("^api-"), + Flags: types.StringNull(), // omitted: must round-trip as null, not "". + } + } + + createResp := resource.CreateResponse{State: emptyState(t, r)} + r.Create(ctx, resource.CreateRequest{Plan: buildPlan[WorkloadPolicyTargetResourceModel](t, r, mutate)}, &createResp) + mustNoDiags(t, "Create", createResp.Diagnostics) + var created WorkloadPolicyTargetResourceModel + mustNoDiags(t, "State.Get", createResp.State.Get(ctx, &created)) + if created.NamePattern == nil || !created.NamePattern.Flags.IsNull() { + t.Fatalf("expected null flags after round-trip, got %+v", created.NamePattern) + } + + delResp := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: createResp.State}, &delResp) + mustNoDiags(t, "Delete", delResp.Diagnostics) + delAgain := resource.DeleteResponse{} + r.Delete(ctx, resource.DeleteRequest{State: createResp.State}, &delAgain) + mustNoDiags(t, "Delete (already gone)", delAgain.Diagnostics) +} diff --git a/internal/provider/node_policy.go b/internal/provider/node_policy.go index f4428f1..49508ab 100644 --- a/internal/provider/node_policy.go +++ b/internal/provider/node_policy.go @@ -66,7 +66,8 @@ type NodePolicyResourceModel struct { CapacityTypeTip types.String `tfsdk:"capacity_type_tip"` OperatingSystemsTip types.String `tfsdk:"operating_systems_tip"` Labels types.Map `tfsdk:"labels"` - Taints types.List `tfsdk:"taints"` // List of Taint objects + Taints types.List `tfsdk:"taints"` // List of Taint objects + StartupTaints types.List `tfsdk:"startup_taints"` // List of Taint objects Disruption *DisruptionPolicy `tfsdk:"disruption"` Limits *ResourceLimits `tfsdk:"limits"` TaintsTip types.String `tfsdk:"taints_tip"` @@ -77,6 +78,9 @@ type NodePolicyResourceModel struct { NodeClassName types.String `tfsdk:"node_class_name"` Aws *AWSNodeClass `tfsdk:"aws"` Azure *AzureNodeClass `tfsdk:"azure"` + ZonalShift *ZonalShiftConfig `tfsdk:"zonal_shift"` + InstanceLocalNvme *LabelSelector `tfsdk:"instance_local_nvme"` + CloudProviderId types.Int64 `tfsdk:"cloud_provider_id"` Raw types.List `tfsdk:"raw"` // List of RawKarpenterSpec objects } @@ -87,6 +91,13 @@ type Taint struct { Effect types.String `tfsdk:"effect"` } +// ZonalShiftConfig configures behavior during an AWS ARC zonal shift (AWS only). +type ZonalShiftConfig struct { + RespectZonalShift types.Bool `tfsdk:"respect_zonal_shift"` + EvictImpactedNodes types.Bool `tfsdk:"evict_impacted_nodes"` + AllowZoneFallback types.Bool `tfsdk:"allow_zone_fallback"` +} + // DisruptionPolicy defines node disruption policy. type DisruptionPolicy struct { ConsolidateAfter types.String `tfsdk:"consolidate_after"` @@ -178,6 +189,7 @@ type AzureNodeClass struct { Tags types.Map `tfsdk:"tags"` Kubelet *AzureKubeletConfiguration `tfsdk:"kubelet"` MaxPods types.Int32 `tfsdk:"max_pods"` + ImageVersion types.String `tfsdk:"image_version"` } // RawKarpenterSpec defines raw Karpenter YAML specs. @@ -276,6 +288,59 @@ func (r *NodePolicyResource) Schema(ctx context.Context, req resource.SchemaRequ }, }, }, + "startup_taints": schema.ListNestedAttribute{ + Description: "Taints applied to nodes only during startup", + MarkdownDescription: "List of Kubernetes taints applied to nodes only while they start up (Karpenter `startupTaints`). Removed once the node is ready.", + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "key": schema.StringAttribute{ + Description: "Taint key", + Required: true, + }, + "value": schema.StringAttribute{ + Description: "Taint value", + Required: true, + }, + "effect": schema.StringAttribute{ + Description: "Taint effect (NoSchedule, PreferNoSchedule, NoExecute)", + MarkdownDescription: "Taint effect. Valid values: `NoSchedule`, `PreferNoSchedule`, `NoExecute`.", + Required: true, + }, + }, + }, + }, + "zonal_shift": schema.SingleNestedAttribute{ + Description: "AWS ARC zonal shift behavior (AWS only)", + MarkdownDescription: "Behavior during an AWS ARC zonal shift. AWS only — silently ignored for other clouds.", + Optional: true, + Attributes: map[string]schema.Attribute{ + "respect_zonal_shift": schema.BoolAttribute{ + Description: "Master opt-in. When false the other fields are ignored", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "evict_impacted_nodes": schema.BoolAttribute{ + Description: "Also terminate existing nodes in the impacted zone (respects PDBs)", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "allow_zone_fallback": schema.BoolAttribute{ + Description: "Expand a single-zone policy to other zones when its zone is impacted", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + }, + }, + "instance_local_nvme": labelSelectorAttribute("Ephemeral NVMe storage per node in GiB (AWS only; karpenter.k8s.aws/instance-local-nvme)"), + "cloud_provider_id": schema.Int64Attribute{ + Description: "Cloud provider ID this policy is intended for (informational)", + MarkdownDescription: "Cloud provider ID this policy is intended for: `1` = AWS, `2` = Azure, `3` = GCP, `4` = OCI. Informational/UI filter — compilation always uses the target cluster's provider.", + Optional: true, + }, "disruption": schema.SingleNestedAttribute{ Description: "Node disruption policy configuration", MarkdownDescription: "Configuration for node disruption policies including consolidation and expiration settings.", @@ -581,6 +646,94 @@ func (r *NodePolicyResource) Schema(ctx context.Context, req resource.SchemaRequ }, }, }, + "capacity_reservation_selector_terms": schema.ListNestedAttribute{ + Description: "Capacity reservation selector terms", + MarkdownDescription: "Selects EC2 Capacity Reservations that nodes launched by this policy may use. Terms are ORed; criteria within a term are ANDed.", + Optional: true, + NestedObject: schema.NestedAttributeObject{ + Attributes: map[string]schema.Attribute{ + "id": schema.StringAttribute{ + Description: "Capacity reservation ID", + Optional: true, + }, + "owner_id": schema.StringAttribute{ + Description: "AWS account ID that owns the capacity reservation", + Optional: true, + }, + "tags": schema.MapAttribute{ + Description: "Tags to match on the capacity reservation", + Optional: true, + ElementType: types.StringType, + }, + }, + }, + }, + "kubelet": schema.SingleNestedAttribute{ + Description: "Kubelet configuration overrides", + MarkdownDescription: "Kubelet configuration overrides applied to nodes launched by this policy (maps to the EC2NodeClass `spec.kubelet` block).", + Optional: true, + Attributes: map[string]schema.Attribute{ + "cluster_dns": schema.ListAttribute{ + Description: "Cluster DNS server IPs", + Optional: true, + ElementType: types.StringType, + }, + "max_pods": schema.Int32Attribute{ + Description: "Maximum number of pods per node", + Optional: true, + }, + "pods_per_core": schema.Int32Attribute{ + Description: "Maximum pods per CPU core", + Optional: true, + }, + "system_reserved": schema.MapAttribute{ + Description: "Resources reserved for system daemons (e.g. cpu, memory, ephemeral-storage)", + Optional: true, + ElementType: types.StringType, + }, + "kube_reserved": schema.MapAttribute{ + Description: "Resources reserved for Kubernetes system daemons", + Optional: true, + ElementType: types.StringType, + }, + "eviction_hard": schema.MapAttribute{ + Description: "Hard eviction thresholds (e.g. memory.available = 100Mi)", + Optional: true, + ElementType: types.StringType, + }, + "eviction_soft": schema.MapAttribute{ + Description: "Soft eviction thresholds", + Optional: true, + ElementType: types.StringType, + }, + "eviction_soft_grace_period": schema.MapAttribute{ + Description: "Grace periods for soft eviction thresholds", + Optional: true, + ElementType: types.StringType, + }, + "eviction_max_pod_grace_period": schema.Int32Attribute{ + Description: "Maximum pod termination grace period (seconds) used on soft eviction", + Optional: true, + }, + "image_gc_high_threshold_percent": schema.Int32Attribute{ + Description: "Disk usage percentage above which image garbage collection runs", + Optional: true, + }, + "image_gc_low_threshold_percent": schema.Int32Attribute{ + Description: "Disk usage percentage below which image garbage collection stops", + Optional: true, + }, + "cpu_cfs_quota": schema.BoolAttribute{ + Description: "Enable CPU CFS quota enforcement for containers that specify CPU limits", + Optional: true, + }, + }, + }, + "context": schema.StringAttribute{ + Description: "EC2 Fleet context (reserved for AWS use)", + MarkdownDescription: "Context passed through to EC2 Fleet launches (`spec.context` on the EC2NodeClass). Reserved for use by AWS.", + Optional: true, + }, }, }, // Azure provider configuration @@ -616,6 +769,61 @@ func (r *NodePolicyResource) Schema(ctx context.Context, req resource.SchemaRequ Description: "Maximum number of pods per node", Optional: true, }, + "image_version": schema.StringAttribute{ + Description: "Pinned node image version", + MarkdownDescription: "Pinned node image version. Requires the DevZero node operator >= 1.8.4.", + Optional: true, + }, + "kubelet": schema.SingleNestedAttribute{ + Description: "Kubelet configuration overrides", + MarkdownDescription: "Kubelet configuration overrides applied to nodes launched by this policy (maps to the AKSNodeClass `spec.kubelet` block).", + Optional: true, + Attributes: map[string]schema.Attribute{ + "cpu_manager_policy": schema.StringAttribute{ + Description: "CPU manager policy (none, static)", + MarkdownDescription: "CPU manager policy. Valid values: `none`, `static`.", + Optional: true, + }, + "cpu_cfs_quota": schema.BoolAttribute{ + Description: "Enable CPU CFS quota enforcement for containers that specify CPU limits", + Optional: true, + }, + "cpu_cfs_quota_period": schema.StringAttribute{ + Description: "CPU CFS quota period (e.g. 100ms)", + Optional: true, + }, + "image_gc_high_threshold_percent": schema.Int32Attribute{ + Description: "Disk usage percentage above which image garbage collection runs", + Optional: true, + }, + "image_gc_low_threshold_percent": schema.Int32Attribute{ + Description: "Disk usage percentage below which image garbage collection stops", + Optional: true, + }, + "topology_manager_policy": schema.StringAttribute{ + Description: "Topology manager policy (none, best-effort, restricted, single-numa-node)", + MarkdownDescription: "Topology manager policy. Valid values: `none`, `best-effort`, `restricted`, `single-numa-node`.", + Optional: true, + }, + "allowed_unsafe_sysctls": schema.ListAttribute{ + Description: "Unsafe sysctls or sysctl patterns allowed on the node", + Optional: true, + ElementType: types.StringType, + }, + "container_log_max_size": schema.StringAttribute{ + Description: "Maximum size of a container log file before rotation (e.g. 50Mi)", + Optional: true, + }, + "container_log_max_files": schema.Int32Attribute{ + Description: "Maximum number of container log files retained per container", + Optional: true, + }, + "pod_pids_limit": schema.Int64Attribute{ + Description: "Maximum number of PIDs per pod", + Optional: true, + }, + }, + }, }, }, // Raw Karpenter specs @@ -768,9 +976,14 @@ func (r *NodePolicyResource) Read(ctx context.Context, req resource.ReadRequest, return } - // Find the policy with matching ID + // Find the policy with matching ID. ListNodePolicies also returns read-only + // virtual policies mirrored from non-dakr Karpenter resources (source == + // "cluster"); those are never managed by Terraform, so skip them. var foundPolicy *apiv1.NodePolicy for _, policy := range listNodePoliciesResp.Msg.Policies { + if policy.Source != "" && policy.Source != "dakr" { + continue + } if policy.Id == data.Id.ValueString() { foundPolicy = policy break @@ -778,7 +991,8 @@ func (r *NodePolicyResource) Read(ctx context.Context, req resource.ReadRequest, } if foundPolicy == nil { - resp.Diagnostics.AddError("Client Error", "Node policy not found") + // Deleted out of band — drop it from state so the plan recreates it. + resp.State.RemoveResource(ctx) return } @@ -834,10 +1048,20 @@ func (r *NodePolicyResource) Delete(ctx context.Context, req resource.DeleteRequ return } - // No-op delete: just remove from state - // The API doesn't provide a delete endpoint, so we just remove it from Terraform state - // The policy will remain in the backend - tflog.Warn(ctx, "Node policy delete is a no-op operation. The policy will remain in the backend.") + _, err := r.client.RecommendationClient.DeleteNodePolicy(ctx, connect.NewRequest(&apiv1.DeleteNodePolicyRequest{ + TeamId: r.client.TeamId, + PolicyId: data.Id.ValueString(), + })) + if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + // Already gone — treat delete as successful. + return + } + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete node policy, got error: %s", err)) + return + } + + tflog.Trace(ctx, "deleted node policy (targets are cascade-deleted server-side)") } func (r *NodePolicyResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { @@ -1016,6 +1240,44 @@ func (m *NodePolicyResourceModel) toProto(ctx context.Context, diags *diag.Diagn policy.Taints = taints } + // Startup taints + if !m.StartupTaints.IsNull() && !m.StartupTaints.IsUnknown() { + startupTaints, err := getElementList(ctx, m.StartupTaints.Elements(), func(ctx context.Context, value Taint) (*apiv1.Taint, error) { + return &apiv1.Taint{ + Key: value.Key.ValueString(), + Value: value.Value.ValueString(), + Effect: value.Effect.ValueString(), + }, nil + }) + if err != nil { + diags.AddError("Conversion Error", fmt.Sprintf("Unable to convert startup taints: %s", err)) + return nil + } + policy.StartupTaints = startupTaints + } + + // Zonal shift (AWS only) + if m.ZonalShift != nil { + policy.ZonalShift = &apiv1.ZonalShiftConfig{ + RespectZonalShift: m.ZonalShift.RespectZonalShift.ValueBool(), + EvictImpactedNodes: m.ZonalShift.EvictImpactedNodes.ValueBool(), + AllowZoneFallback: m.ZonalShift.AllowZoneFallback.ValueBool(), + } + } + + // Instance local NVMe selector (AWS only) + if m.InstanceLocalNvme != nil { + selector, err := m.InstanceLocalNvme.toProto(ctx) + if err != nil { + diags.AddError("Conversion Error", fmt.Sprintf("Unable to convert instance local NVMe selector: %s", err)) + return nil + } + policy.InstanceLocalNvme = selector + } + + // Cloud provider id (informational) + policy.CloudProviderId = m.CloudProviderId.ValueInt64Pointer() + // Disruption policy if m.Disruption != nil { policy.Disruption = m.Disruption.toProto(ctx, diags) @@ -1077,6 +1339,30 @@ func (m *NodePolicyResourceModel) toProto(ctx context.Context, diags *diag.Diagn } // fromProto converts protobuf message to Terraform model. +// taintAttrTypes is the Terraform object shape shared by taints and startup_taints. +var taintAttrTypes = map[string]attr.Type{ + "key": types.StringType, + "value": types.StringType, + "effect": types.StringType, +} + +// taintListFromProto converts API taints into the Terraform list value, or a +// typed null when the list is empty. +func taintListFromProto(taints []*apiv1.Taint) types.List { + if len(taints) == 0 { + return types.ListNull(types.ObjectType{AttrTypes: taintAttrTypes}) + } + values := make([]attr.Value, 0, len(taints)) + for _, taint := range taints { + values = append(values, types.ObjectValueMust(taintAttrTypes, map[string]attr.Value{ + "key": types.StringValue(taint.Key), + "value": types.StringValue(taint.Value), + "effect": types.StringValue(taint.Effect), + })) + } + return types.ListValueMust(types.ObjectType{AttrTypes: taintAttrTypes}, values) +} + func (m *NodePolicyResourceModel) fromProto(policy *apiv1.NodePolicy) { m.Id = types.StringValue(policy.Id) m.Name = types.StringValue(policy.Name) @@ -1142,41 +1428,7 @@ func (m *NodePolicyResourceModel) fromProto(policy *apiv1.NodePolicy) { } // Taints - if len(policy.Taints) > 0 { - taints := make([]attr.Value, 0, len(policy.Taints)) - for _, taint := range policy.Taints { - taints = append(taints, types.ObjectValueMust( - map[string]attr.Type{ - "key": types.StringType, - "value": types.StringType, - "effect": types.StringType, - }, - map[string]attr.Value{ - "key": types.StringValue(taint.Key), - "value": types.StringValue(taint.Value), - "effect": types.StringValue(taint.Effect), - }, - )) - } - m.Taints = types.ListValueMust( - types.ObjectType{ - AttrTypes: map[string]attr.Type{ - "key": types.StringType, - "value": types.StringType, - "effect": types.StringType, - }, - }, - taints, - ) - } else { - m.Taints = types.ListNull(types.ObjectType{ - AttrTypes: map[string]attr.Type{ - "key": types.StringType, - "value": types.StringType, - "effect": types.StringType, - }, - }) - } + m.Taints = taintListFromProto(policy.Taints) // Disruption policy if policy.Disruption != nil { @@ -1192,6 +1444,29 @@ func (m *NodePolicyResourceModel) fromProto(policy *apiv1.NodePolicy) { } // Tooltip fields for node config + // Startup taints + m.StartupTaints = taintListFromProto(policy.StartupTaints) + + // Zonal shift + if policy.ZonalShift != nil { + m.ZonalShift = &ZonalShiftConfig{ + RespectZonalShift: types.BoolValue(policy.ZonalShift.RespectZonalShift), + EvictImpactedNodes: types.BoolValue(policy.ZonalShift.EvictImpactedNodes), + AllowZoneFallback: types.BoolValue(policy.ZonalShift.AllowZoneFallback), + } + } else { + m.ZonalShift = nil + } + + // Instance local NVMe selector + if policy.InstanceLocalNvme != nil { + m.InstanceLocalNvme = labelSelectorFromProto(policy.InstanceLocalNvme) + } else { + m.InstanceLocalNvme = nil + } + + m.CloudProviderId = types.Int64PointerValue(policy.CloudProviderId) + m.TaintsTip = stringPointerValue(policy.TaintsTip) m.DisruptionsTip = stringPointerValue(policy.DisruptionsTip) m.LimitsTip = stringPointerValue(policy.LimitsTip) @@ -2201,6 +2476,11 @@ func (azure *AzureNodeClass) toProto(ctx context.Context, diags *diag.Diagnostic spec.MaxPods = &val } + if !azure.ImageVersion.IsNull() { + val := azure.ImageVersion.ValueString() + spec.ImageVersion = &val + } + if azure.Kubelet != nil { k := &apiv1.AzureKubeletConfiguration{} if !azure.Kubelet.CpuManagerPolicy.IsNull() { @@ -2317,6 +2597,8 @@ func azureNodeClassFromProto(spec *apiv1.AzureNodeClassSpec) *AzureNodeClass { azure.MaxPods = types.Int32Null() } + azure.ImageVersion = stringPointerValue(spec.ImageVersion) + if spec.Kubelet != nil { k := &AzureKubeletConfiguration{} k.CpuManagerPolicy = stringPointerValue(spec.Kubelet.CpuManagerPolicy) diff --git a/internal/provider/node_policy_decode_test.go b/internal/provider/node_policy_decode_test.go new file mode 100644 index 0000000..4fc0891 --- /dev/null +++ b/internal/provider/node_policy_decode_test.go @@ -0,0 +1,277 @@ +package provider + +import ( + "context" + "strings" + "testing" + + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" + "github.com/hashicorp/terraform-plugin-go/tftypes" +) + +// nodePolicySchemaPlan builds a tfsdk.Plan from the real resource schema, the same +// way Terraform core hands a planned value to Create/Update. Every top-level +// attribute not present in `set` is null. Nested objects are built with +// nullObjectWith so they carry every attribute the schema defines. +func nodePolicySchemaPlan(t *testing.T, set map[string]tftypes.Value) tfsdk.Plan { + t.Helper() + ctx := context.Background() + r := &NodePolicyResource{} + var schemaResp resource.SchemaResponse + r.Schema(ctx, resource.SchemaRequest{}, &schemaResp) + if schemaResp.Diagnostics.HasError() { + t.Fatalf("schema: %v", schemaResp.Diagnostics) + } + + objType, ok := schemaResp.Schema.Type().TerraformType(ctx).(tftypes.Object) + if !ok { + t.Fatal("schema type is not an object") + } + vals := make(map[string]tftypes.Value, len(objType.AttributeTypes)) + for name, typ := range objType.AttributeTypes { + if v, ok := set[name]; ok { + vals[name] = v + continue + } + vals[name] = tftypes.NewValue(typ, nil) + } + return tfsdk.Plan{Schema: schemaResp.Schema, Raw: tftypes.NewValue(objType, vals)} +} + +func nodePolicyAttrType(t *testing.T, path ...string) tftypes.Type { + t.Helper() + ctx := context.Background() + r := &NodePolicyResource{} + var schemaResp resource.SchemaResponse + r.Schema(ctx, resource.SchemaRequest{}, &schemaResp) + typ := schemaResp.Schema.Type().TerraformType(ctx) + for _, p := range path { + switch tt := typ.(type) { + case tftypes.Object: + typ = tt.AttributeTypes[p] + case tftypes.List: + typ = tt.ElementType + default: + t.Fatalf("unexpected type %T at %q", typ, p) + } + if typ == nil { + t.Fatalf("attribute %v not in schema", path) + } + } + return typ +} + +// nullObjectWith returns an object of type typ with all attributes null except those in set. +func nullObjectWith(t *testing.T, typ tftypes.Type, set map[string]tftypes.Value) tftypes.Value { + t.Helper() + obj, ok := typ.(tftypes.Object) + if !ok { + t.Fatalf("type %v is not an object", typ) + } + vals := make(map[string]tftypes.Value, len(obj.AttributeTypes)) + for name, at := range obj.AttributeTypes { + if v, ok := set[name]; ok { + vals[name] = v + } else { + vals[name] = tftypes.NewValue(at, nil) + } + } + return tftypes.NewValue(obj, vals) +} + +// Regression for: "Struct defines fields not found in object: kubelet" when an +// `azure {}` block is set (v0.1.6). The Go model had a `kubelet` field the schema +// did not declare, so req.Plan.Get failed before any API call. +func TestNodePolicy_PlanDecode_AzureBlock(t *testing.T) { + ctx := context.Background() + azureType := nodePolicyAttrType(t, "azure") + plan := nodePolicySchemaPlan(t, map[string]tftypes.Value{ + "name": tftypes.NewValue(tftypes.String, "azure-pool"), + "azure": nullObjectWith(t, azureType, map[string]tftypes.Value{ + "vnet_subnet_id": tftypes.NewValue(tftypes.String, "/subscriptions/x/subnet/y"), + }), + }) + + var m NodePolicyResourceModel + diags := plan.Get(ctx, &m) + if diags.HasError() { + t.Fatalf("plan.Get failed: %v", diags) + } + if m.Azure == nil { + t.Fatalf("m.Azure is nil") + } + if got := m.Azure.VnetSubnetId.ValueString(); got != "/subscriptions/x/subnet/y" { + t.Fatalf("got %q, want %s", got, "/subscriptions/x/subnet/y") + } + + var d diag.Diagnostics + proto := m.toProto(ctx, &d, "team-1") + if d.HasError() { + t.Fatalf("toProto failed: %v", d) + } + if proto.Azure == nil { + t.Fatalf("proto.Azure is nil") + } + if got := proto.Azure.GetVnetSubnetId(); got != "/subscriptions/x/subnet/y" { + t.Fatalf("got %q, want %s", got, "/subscriptions/x/subnet/y") + } +} + +// Regression for: "Unable to convert taints: can't unmarshal into *provider.Taint, +// needs FromTerraform5Value method" (v0.1.6). getElementList decoded list elements +// through tftypes.Value.As, which cannot populate tfsdk-tagged structs. +func TestNodePolicy_PlanDecode_Taints(t *testing.T) { + ctx := context.Background() + taintsType, ok := nodePolicyAttrType(t, "taints").(tftypes.List) + if !ok { + t.Fatal("taints attribute is not a list") + } + taint := nullObjectWith(t, taintsType.ElementType, map[string]tftypes.Value{ + "key": tftypes.NewValue(tftypes.String, "dedicated"), + "value": tftypes.NewValue(tftypes.String, "gpu"), + "effect": tftypes.NewValue(tftypes.String, "NoSchedule"), + }) + plan := nodePolicySchemaPlan(t, map[string]tftypes.Value{ + "name": tftypes.NewValue(tftypes.String, "tainted-pool"), + "taints": tftypes.NewValue(taintsType, []tftypes.Value{taint}), + }) + + var m NodePolicyResourceModel + diags := plan.Get(ctx, &m) + if diags.HasError() { + t.Fatalf("plan.Get failed: %v", diags) + } + + var d diag.Diagnostics + proto := m.toProto(ctx, &d, "team-1") + if d.HasError() { + t.Fatalf("toProto failed: %v", d) + } + if len(proto.Taints) != 1 { + t.Fatalf("len(proto.Taints) = %d, want 1", len(proto.Taints)) + } + if got := proto.Taints[0].Key; got != "dedicated" { + t.Fatalf("got %q, want %s", got, "dedicated") + } + if got := proto.Taints[0].Value; got != "gpu" { + t.Fatalf("got %q, want %s", got, "gpu") + } + if got := proto.Taints[0].Effect; got != "NoSchedule" { + t.Fatalf("got %q, want %s", got, "NoSchedule") + } +} + +// The same struct/schema mismatch existed for `aws {}` (kubelet, +// capacity_reservation_selector_terms, context were in the model but not the schema). +func TestNodePolicy_PlanDecode_AwsBlock(t *testing.T) { + ctx := context.Background() + awsType := nodePolicyAttrType(t, "aws") + plan := nodePolicySchemaPlan(t, map[string]tftypes.Value{ + "name": tftypes.NewValue(tftypes.String, "aws-pool"), + "aws": nullObjectWith(t, awsType, map[string]tftypes.Value{ + "ami_family": tftypes.NewValue(tftypes.String, "AL2023"), + }), + }) + + var m NodePolicyResourceModel + diags := plan.Get(ctx, &m) + if diags.HasError() { + t.Fatalf("plan.Get failed: %v", diags) + } + if m.Aws == nil { + t.Fatalf("m.Aws is nil") + } + + var d diag.Diagnostics + proto := m.toProto(ctx, &d, "team-1") + if d.HasError() { + t.Fatalf("toProto failed: %v", d) + } + if proto.Aws == nil { + t.Fatalf("proto.Aws is nil") + } + if got := proto.Aws.GetAmiFamily(); got != "AL2023" { + t.Fatalf("got %q, want %s", got, "AL2023") + } +} + +// Raw karpenter specs also flow through getElementList with a struct element type. +func TestNodePolicy_PlanDecode_Raw(t *testing.T) { + ctx := context.Background() + rawType, ok := nodePolicyAttrType(t, "raw").(tftypes.List) + if !ok { + t.Fatal("raw attribute is not a list") + } + spec := nullObjectWith(t, rawType.ElementType, map[string]tftypes.Value{ + "nodepool_yaml": tftypes.NewValue(tftypes.String, "apiVersion: karpenter.sh/v1\nkind: NodePool\n"), + "nodeclass_yaml": tftypes.NewValue(tftypes.String, ""), + }) + plan := nodePolicySchemaPlan(t, map[string]tftypes.Value{ + "name": tftypes.NewValue(tftypes.String, "raw-pool"), + "raw": tftypes.NewValue(rawType, []tftypes.Value{spec}), + }) + + var m NodePolicyResourceModel + diags := plan.Get(ctx, &m) + if diags.HasError() { + t.Fatalf("plan.Get failed: %v", diags) + } + + var d diag.Diagnostics + proto := m.toProto(ctx, &d, "team-1") + if d.HasError() { + t.Fatalf("toProto failed: %v", d) + } + if len(proto.Raw) != 1 { + t.Fatalf("len(proto.Raw) = %d, want 1", len(proto.Raw)) + } + if !strings.Contains(proto.Raw[0].NodepoolYaml, "kind: NodePool") { + t.Fatalf("%q does not contain %s", proto.Raw[0].NodepoolYaml, "kind: NodePool") + } +} + +// Round-trip guard: whatever fromProto produces must be settable into state +// through the real schema (State.Set uses the same reflection as Plan.Get). +func TestNodePolicy_StateSet_RoundTrip(t *testing.T) { + ctx := context.Background() + azureType := nodePolicyAttrType(t, "azure") + taintsType, ok := nodePolicyAttrType(t, "taints").(tftypes.List) + if !ok { + t.Fatal("taints attribute is not a list") + } + plan := nodePolicySchemaPlan(t, map[string]tftypes.Value{ + "name": tftypes.NewValue(tftypes.String, "rt"), + "azure": nullObjectWith(t, azureType, map[string]tftypes.Value{ + "vnet_subnet_id": tftypes.NewValue(tftypes.String, "subnet"), + }), + "taints": tftypes.NewValue(taintsType, []tftypes.Value{ + nullObjectWith(t, taintsType.ElementType, map[string]tftypes.Value{ + "key": tftypes.NewValue(tftypes.String, "k"), + "value": tftypes.NewValue(tftypes.String, "v"), + "effect": tftypes.NewValue(tftypes.String, "NoExecute"), + }), + }), + }) + + var m NodePolicyResourceModel + if d0 := plan.Get(ctx, &m); d0.HasError() { + t.Fatalf("plan.Get failed: %v", d0) + } + var d diag.Diagnostics + proto := m.toProto(ctx, &d, "team-1") + if d.HasError() { + t.Fatalf("toProto failed: %v", d) + } + proto.Id = "np-123" + + var back NodePolicyResourceModel + back.fromProto(proto) + + state := tfsdk.State{Schema: plan.Schema, Raw: tftypes.NewValue(plan.Schema.Type().TerraformType(ctx), nil)} + setDiags := state.Set(ctx, &back) + if setDiags.HasError() { + t.Fatalf("state.Set failed: %v", setDiags) + } +} diff --git a/internal/provider/node_policy_target.go b/internal/provider/node_policy_target.go index 76cc02d..acf6150 100644 --- a/internal/provider/node_policy_target.go +++ b/internal/provider/node_policy_target.go @@ -5,6 +5,7 @@ import ( "fmt" "connectrpc.com/connect" + "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework/diag" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -13,6 +14,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringdefault" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -85,10 +87,13 @@ func (r *NodePolicyTargetResource) Schema(ctx context.Context, req resource.Sche Default: booldefault.StaticBool(true), }, "cluster_ids": schema.ListAttribute{ - Description: "List of cluster IDs to apply the node policy to", - MarkdownDescription: "List of cluster IDs to apply the node policy to. Must reference existing cluster IDs.", + Description: "Cluster ID to apply the node policy to (at most one)", + MarkdownDescription: "Cluster ID to apply the node policy to. The API accepts at most one cluster per target; create one target per cluster.", Required: true, ElementType: types.StringType, + Validators: []validator.List{ + listvalidator.SizeBetween(1, 1), + }, }, }, } @@ -182,7 +187,8 @@ func (r *NodePolicyTargetResource) Read(ctx context.Context, req resource.ReadRe } if foundTarget == nil { - resp.Diagnostics.AddError("Client Error", "Node policy target not found") + // Deleted out of band — drop it from state so the plan recreates it. + resp.State.RemoveResource(ctx) return } @@ -237,10 +243,26 @@ func (r *NodePolicyTargetResource) Delete(ctx context.Context, req resource.Dele return } - // No-op delete: just remove from state - // The API doesn't provide a delete endpoint, so we just remove it from Terraform state - // The target will remain in the backend - tflog.Warn(ctx, "Node policy target delete is a no-op operation. The target will remain in the backend.") + // The API has no DeleteNodePolicyTarget RPC. Leaving the target enabled + // would keep applying the policy after destroy, so disable it instead. + target := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId) + if resp.Diagnostics.HasError() { + return + } + target.Enabled = false + + _, err := r.client.RecommendationClient.UpdateNodePolicyTarget(ctx, connect.NewRequest(&apiv1.UpdateNodePolicyTargetRequest{ + Target: target, + })) + if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + return + } + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to disable node policy target on destroy, got error: %s", err)) + return + } + + tflog.Warn(ctx, "The API has no delete endpoint for node policy targets; the target was disabled and removed from state, but the row remains in the backend.") } func (r *NodePolicyTargetResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { diff --git a/internal/provider/schema_model_consistency_test.go b/internal/provider/schema_model_consistency_test.go new file mode 100644 index 0000000..4751c99 --- /dev/null +++ b/internal/provider/schema_model_consistency_test.go @@ -0,0 +1,255 @@ +package provider + +import ( + "context" + "testing" + + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" + "github.com/hashicorp/terraform-plugin-go/tftypes" + "google.golang.org/protobuf/proto" +) + +// leafOverrides supplies valid values for attributes whose converters only +// accept a fixed vocabulary (enums). Keyed by attribute name, applied at any +// nesting depth. Anything not listed gets a generic "x" / 1 / true. +var leafOverrides = map[string]tftypes.Value{ + "action_triggers": tftypes.NewValue(tftypes.String, "on_schedule"), + "detection_triggers": tftypes.NewValue(tftypes.String, "pod_creation"), + "operator": tftypes.NewValue(tftypes.String, "In"), + "effect": tftypes.NewValue(tftypes.String, "NoSchedule"), + "kinds": tftypes.NewValue(tftypes.String, "Deployment"), + "workload_kinds": tftypes.NewValue(tftypes.String, "Deployment"), +} + +// populatedValue builds a tftypes.Value of type typ in which every object, +// list, set and map is NON-null (lists/sets get one element, maps one entry) +// and every primitive leaf holds a concrete value ("x", 1, true) unless +// leafOverrides names the attribute. Decoding such a value into a resource +// model exercises every tfsdk struct at every nesting level, which is exactly +// what catches "Struct defines fields not found in object" / "Object defines +// fields not found in struct" mismatches between a schema and its Go model — +// the bug class that broke `azure {}` / `aws {}` in v0.1.6 — and then drives +// every toProto/fromProto branch. +func populatedValue(typ tftypes.Type) tftypes.Value { + return populatedValueNamed("", typ) +} + +func populatedValueNamed(name string, typ tftypes.Type) tftypes.Value { + switch t := typ.(type) { + case tftypes.Object: + vals := make(map[string]tftypes.Value, len(t.AttributeTypes)) + for attrName, at := range t.AttributeTypes { + vals[attrName] = populatedValueNamed(attrName, at) + } + return tftypes.NewValue(t, vals) + case tftypes.List: + return tftypes.NewValue(t, []tftypes.Value{populatedValueNamed(name, t.ElementType)}) + case tftypes.Set: + return tftypes.NewValue(t, []tftypes.Value{populatedValueNamed(name, t.ElementType)}) + case tftypes.Map: + return tftypes.NewValue(t, map[string]tftypes.Value{"k": populatedValueNamed(name, t.ElementType)}) + case tftypes.Tuple: + vals := make([]tftypes.Value, len(t.ElementTypes)) + for i, et := range t.ElementTypes { + vals[i] = populatedValueNamed(name, et) + } + return tftypes.NewValue(t, vals) + } + if v, ok := leafOverrides[name]; ok && v.Type().Equal(typ) { + return v + } + switch { + case typ.Is(tftypes.String): + return tftypes.NewValue(typ, "x") + case typ.Is(tftypes.Number): + return tftypes.NewValue(typ, 1) + case typ.Is(tftypes.Bool): + return tftypes.NewValue(typ, true) + } + return tftypes.NewValue(typ, nil) +} + +func resourceSchema(t *testing.T, r resource.Resource) schema.Schema { + t.Helper() + var resp resource.SchemaResponse + r.Schema(context.Background(), resource.SchemaRequest{}, &resp) + if resp.Diagnostics.HasError() { + t.Fatalf("schema: %v", resp.Diagnostics) + } + return resp.Schema +} + +type resourceUnderTest struct { + name string + resource func() resource.Resource + newModel func() any + // roundTrip converts the decoded model to its proto and back (nil = skip). + // It must return the model populated by fromProto. + roundTrip func(ctx context.Context, model any) (any, diag.Diagnostics) +} + +func allResourcesUnderTest() []resourceUnderTest { + return []resourceUnderTest{ + { + name: "devzero_node_policy", + resource: NewNodePolicyResource, + newModel: func() any { return &NodePolicyResourceModel{} }, + roundTrip: func(ctx context.Context, model any) (any, diag.Diagnostics) { + var d diag.Diagnostics + m, ok := model.(*NodePolicyResourceModel) + if !ok { + return nil, d + } + p := m.toProto(ctx, &d, "team") + if d.HasError() { + return nil, d + } + p.Id = "id" + var back NodePolicyResourceModel + back.fromProto(p) + p2 := back.toProto(ctx, &d, "team") + if !d.HasError() && !proto.Equal(p, p2) { + d.AddError("Round-Trip", "node policy proto round-trip is lossy — a field is dropped in toProto or fromProto") + } + return &back, d + }, + }, + { + name: "devzero_node_policy_target", + resource: NewNodePolicyTargetResource, + newModel: func() any { return &NodePolicyTargetResourceModel{} }, + roundTrip: func(ctx context.Context, model any) (any, diag.Diagnostics) { + var d diag.Diagnostics + m, ok := model.(*NodePolicyTargetResourceModel) + if !ok { + return nil, d + } + p := m.toProto(ctx, &d, "team") + if d.HasError() { + return nil, d + } + var back NodePolicyTargetResourceModel + back.fromProto(p) + p2 := back.toProto(ctx, &d, "team") + if !d.HasError() && !proto.Equal(p, p2) { + d.AddError("Round-Trip", "node policy target proto round-trip is lossy — a field is dropped in toProto or fromProto") + } + return &back, d + }, + }, + { + name: "devzero_workload_policy", + resource: NewWorkloadPolicyResource, + newModel: func() any { return &WorkloadPolicyResourceModel{} }, + roundTrip: func(ctx context.Context, model any) (any, diag.Diagnostics) { + var d diag.Diagnostics + m, ok := model.(*WorkloadPolicyResourceModel) + if !ok { + return nil, d + } + p := m.toProto(ctx, &d, "team") + if d.HasError() { + return nil, d + } + var back WorkloadPolicyResourceModel + back.fromProto(p) + p2 := back.toProto(ctx, &d, "team") + if !d.HasError() && !proto.Equal(p, p2) { + d.AddError("Round-Trip", "workload policy proto round-trip is lossy — a field is dropped in toProto or fromProto") + } + return &back, d + }, + }, + { + name: "devzero_workload_policy_target", + resource: NewWorkloadPolicyTargetResource, + newModel: func() any { return &WorkloadPolicyTargetResourceModel{} }, + }, + { + name: "devzero_workload_rule", + resource: NewWorkloadRuleResource, + newModel: func() any { return &WorkloadRuleResourceModel{} }, + }, + { + name: "devzero_cluster", + resource: NewClusterResource, + newModel: func() any { return &ClusterResourceModel{} }, + }, + } +} + +// TestSchemaModelConsistency decodes a fully-populated value built from each +// resource's real schema into its Go model (what Terraform does on +// Create/Update), then round-trips it through toProto/fromProto and sets it +// back into state (what happens after every API call). +func TestSchemaModelConsistency(t *testing.T) { + ctx := context.Background() + for _, rt := range allResourcesUnderTest() { + t.Run(rt.name, func(t *testing.T) { + s := resourceSchema(t, rt.resource()) + objType := s.Type().TerraformType(ctx) + + plan := tfsdk.Plan{Schema: s, Raw: populatedValue(objType)} + model := rt.newModel() + if d := plan.Get(ctx, model); d.HasError() { + t.Fatalf("Plan.Get into %T failed (schema/model mismatch): %v", model, d) + } + + // Everything decoded must be settable back into state unchanged. + state := tfsdk.State{Schema: s, Raw: tftypes.NewValue(objType, nil)} + if d := state.Set(ctx, model); d.HasError() { + t.Fatalf("State.Set from decoded %T failed: %v", model, d) + } + + if rt.roundTrip == nil { + return + } + back, d := rt.roundTrip(ctx, model) + if d.HasError() { + t.Fatalf("toProto/fromProto round-trip failed: %v", d) + } + state = tfsdk.State{Schema: s, Raw: tftypes.NewValue(objType, nil)} + if d := state.Set(ctx, back); d.HasError() { + t.Fatalf("State.Set after fromProto failed (fromProto produced a value the schema cannot hold): %v", d) + } + }) + } +} + +// TestSchemaModelConsistency_AllNull is the complementary case: a config where +// every optional attribute is omitted must decode and round-trip cleanly too. +func TestSchemaModelConsistency_AllNull(t *testing.T) { + ctx := context.Background() + for _, rt := range allResourcesUnderTest() { + t.Run(rt.name, func(t *testing.T) { + s := resourceSchema(t, rt.resource()) + objType, ok := s.Type().TerraformType(ctx).(tftypes.Object) + if !ok { + t.Fatal("schema type is not an object") + } + vals := map[string]tftypes.Value{} + for name, at := range objType.AttributeTypes { + vals[name] = tftypes.NewValue(at, nil) + } + plan := tfsdk.Plan{Schema: s, Raw: tftypes.NewValue(objType, vals)} + model := rt.newModel() + if d := plan.Get(ctx, model); d.HasError() { + t.Fatalf("Plan.Get into %T failed: %v", model, d) + } + if rt.roundTrip == nil { + return + } + back, d := rt.roundTrip(ctx, model) + if d.HasError() { + t.Fatalf("toProto/fromProto round-trip failed: %v", d) + } + state := tfsdk.State{Schema: s, Raw: tftypes.NewValue(objType, nil)} + if d := state.Set(ctx, back); d.HasError() { + t.Fatalf("State.Set after fromProto failed: %v", d) + } + }) + } +} diff --git a/internal/provider/utils.go b/internal/provider/utils.go index eaad13b..bfb5e5d 100644 --- a/internal/provider/utils.go +++ b/internal/provider/utils.go @@ -3,23 +3,35 @@ package provider import ( "context" "errors" + "fmt" "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" "github.com/hashicorp/terraform-plugin-framework/types" ) +// valueAs decodes a framework attr.Value into target using the framework's +// reflection rules (tfsdk.ValueAs). Unlike tftypes.Value.As, this supports +// tfsdk-tagged structs (e.g. Taint, RawKarpenterSpec) as well as primitives, so +// it can be used generically for list/map element conversion. +func valueAs(ctx context.Context, value attr.Value, target any) error { + diags := tfsdk.ValueAs(ctx, value, target) + if !diags.HasError() { + return nil + } + var errs []error + for _, d := range diags.Errors() { + errs = append(errs, fmt.Errorf("%s: %s", d.Summary(), d.Detail())) + } + return errors.Join(errs...) +} + func getElementList[T any, V any](ctx context.Context, values []attr.Value, converter func(ctx context.Context, value V) (T, error)) ([]T, error) { var elements []T var errs []error for _, value := range values { var v V - value, err := value.ToTerraformValue(ctx) - if err != nil { - errs = append(errs, err) - continue - } - err = value.As(&v) - if err != nil { + if err := valueAs(ctx, value, &v); err != nil { errs = append(errs, err) continue } @@ -49,13 +61,7 @@ func getElementMap[K comparable, V any, T any](ctx context.Context, values map[K var errs []error for key, value := range values { var v V - value, err := value.ToTerraformValue(ctx) - if err != nil { - errs = append(errs, err) - continue - } - err = value.As(&v) - if err != nil { + if err := valueAs(ctx, value, &v); err != nil { errs = append(errs, err) continue } diff --git a/internal/provider/workload_policy.go b/internal/provider/workload_policy.go index 6000f29..7299b84 100644 --- a/internal/provider/workload_policy.go +++ b/internal/provider/workload_policy.go @@ -5,6 +5,7 @@ import ( "fmt" "connectrpc.com/connect" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -67,6 +68,29 @@ type WorkloadPolicyResourceModel struct { CooldownMinutes types.Int32 `tfsdk:"cooldown_minutes"` EnablePmaxProtection types.Bool `tfsdk:"enable_pmax_protection"` PmaxRatioThreshold types.Float32 `tfsdk:"pmax_ratio_threshold"` + + EnableInPlaceVerticalScaling types.Bool `tfsdk:"enable_in_place_vertical_scaling"` + AllowInPlaceMemoryLimitDecrease types.Bool `tfsdk:"allow_in_place_memory_limit_decrease"` + PdbEnabled types.Bool `tfsdk:"pdb_enabled"` + + CpuFloorPercent types.Int64 `tfsdk:"cpu_floor_percent"` + CpuCeilingPercent types.Int64 `tfsdk:"cpu_ceiling_percent"` + MemoryFloorPercent types.Int64 `tfsdk:"memory_floor_percent"` + MemoryCeilingPercent types.Int64 `tfsdk:"memory_ceiling_percent"` + CpuLimitFloorPercent types.Int64 `tfsdk:"cpu_limit_floor_percent"` + CpuLimitCeilingPercent types.Int64 `tfsdk:"cpu_limit_ceiling_percent"` + MemoryLimitFloorPercent types.Int64 `tfsdk:"memory_limit_floor_percent"` + MemoryLimitCeilingPercent types.Int64 `tfsdk:"memory_limit_ceiling_percent"` + + JvmHeapOptimizationEnabled types.Bool `tfsdk:"jvm_heap_optimization_enabled"` + JvmHeapTargetPercentile types.Float32 `tfsdk:"jvm_heap_target_percentile"` + JvmHeapHeadroomMultiplier types.Float32 `tfsdk:"jvm_heap_headroom_multiplier"` + JvmNonHeapOverheadPercent types.Float32 `tfsdk:"jvm_non_heap_overhead_percent"` + JvmNonHeapOverheadBytes types.Int64 `tfsdk:"jvm_non_heap_overhead_bytes"` + JvmMinHeapBytes types.Int64 `tfsdk:"jvm_min_heap_bytes"` + JvmMaxHeapBytes types.Int64 `tfsdk:"jvm_max_heap_bytes"` + JvmPreferContainerSupport types.Bool `tfsdk:"jvm_prefer_container_support"` + JvmCpuStartupFloorMillicores types.Int64 `tfsdk:"jvm_cpu_startup_floor_millicores"` } type VerticalScalingOptions struct { @@ -82,6 +106,8 @@ type VerticalScalingOptions struct { MinDataPoints types.Int32 `tfsdk:"min_data_points"` AdjustReqEvenIfNotSet types.Bool `tfsdk:"adjust_req_even_if_not_set"` LimitsRemovalEnabled types.Bool `tfsdk:"limits_removal_enabled"` + RequestUseRss types.Bool `tfsdk:"request_use_rss"` + LimitUseRss types.Bool `tfsdk:"limit_use_rss"` } type HorizontalScalingOptions struct { @@ -92,6 +118,11 @@ type HorizontalScalingOptions struct { PrimaryMetric types.String `tfsdk:"primary_metric"` MinDataPoints types.Int32 `tfsdk:"min_data_points"` MaxReplicaChangePercent types.Float32 `tfsdk:"max_replica_change_percent"` + + NetworkTargetThroughputBytesPerSec types.Int64 `tfsdk:"network_target_throughput_bytes_per_sec"` + TargetMemoryUtilization types.Float32 `tfsdk:"target_memory_utilization"` + CompositeFormula types.String `tfsdk:"composite_formula"` + ScaleDownCooldownSeconds types.Int32 `tfsdk:"scale_down_cooldown_seconds"` } func (r *WorkloadPolicyResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { @@ -174,6 +205,16 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema Computed: true, Default: booldefault.StaticBool(false), }, + "request_use_rss": schema.BoolAttribute{ + Description: "Memory only: size the request from RSS instead of working set", + MarkdownDescription: "Memory only: when true, size the memory request recommendation from RSS (resident set size) instead of the default working set. Ignored for CPU/GPU.", + Optional: true, + }, + "limit_use_rss": schema.BoolAttribute{ + Description: "Memory only: derive the limit from an RSS-based recommendation", + MarkdownDescription: "Memory only: when true, the limit is derived from an RSS-based recommendation instead of the working-set one (the limit multiplier still applies). Ignored for CPU/GPU.", + Optional: true, + }, } } @@ -249,7 +290,7 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema listvalidator.SizeAtLeast(1), listvalidator.NoNullValues(), listvalidator.UniqueValues(), - listvalidator.ValueStringsAre(stringvalidator.OneOf("pod_creation", "pod_update")), + listvalidator.ValueStringsAre(stringvalidator.OneOf("pod_creation", "pod_update", "pod_evict")), }, }, "loopback_period_seconds": schema.Int32Attribute{ @@ -314,7 +355,7 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema Computed: true, Default: stringdefault.StaticString("cpu"), Validators: []validator.String{ - stringvalidator.OneOf("cpu", "memory", "gpu", "network"), + stringvalidator.OneOf("cpu", "memory", "gpu", "network", "network_ingress", "network_egress"), }, }, "min_data_points": schema.Int32Attribute{ @@ -327,6 +368,26 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema Description: "Maximum percent replica change in one step", Optional: true, }, + "network_target_throughput_bytes_per_sec": schema.Int64Attribute{ + Description: "Target network throughput per replica in bytes/sec", + MarkdownDescription: "Target network throughput per replica in bytes/sec. `0` (or unset) auto-detects from P95 + 15% headroom based on the selected metric direction.", + Optional: true, + }, + "target_memory_utilization": schema.Float32Attribute{ + Description: "Target memory utilization for HPA scaling (0.0-1.0)", + MarkdownDescription: "Target memory utilization for HPA scaling (0.0-1.0). Defaults to 0.80 server-side when unset.", + Optional: true, + }, + "composite_formula": schema.StringAttribute{ + Description: "Composite formula for multi-metric HPA scaling", + MarkdownDescription: "Composite formula for multi-metric HPA scaling. Variables: `cpu`, `memory`, `networkingress`, `networkegress` (each the metric's current/target ratio). Example: `cpu * 0.6 + memory * 0.4`.", + Optional: true, + }, + "scale_down_cooldown_seconds": schema.Int32Attribute{ + Description: "Scale-down cooldown in seconds", + MarkdownDescription: "Scale-down cooldown in seconds. Overrides the default Kubernetes stabilization window (300s).", + Optional: true, + }, }, }, "live_migration_enabled": schema.BoolAttribute{ @@ -347,7 +408,6 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema ), ), Validators: []validator.List{ - listvalidator.SizeAtLeast(1), listvalidator.NoNullValues(), listvalidator.UniqueValues(), }, @@ -415,6 +475,108 @@ func (r *WorkloadPolicyResource) Schema(ctx context.Context, req resource.Schema Computed: true, Default: float32default.StaticFloat32(3.0), }, + "enable_in_place_vertical_scaling": schema.BoolAttribute{ + Description: "Apply vertical recommendations in place (no pod restart) where possible", + MarkdownDescription: "When true, vertical recommendations are applied in place (without recreating pods) where the cluster supports it. Default: false.", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "allow_in_place_memory_limit_decrease": schema.BoolAttribute{ + Description: "Allow in-place memory limit decreases (requires enable_in_place_vertical_scaling)", + MarkdownDescription: "Allow in-place memory limit decreases. Only honored when `enable_in_place_vertical_scaling` is true — the server silently forces this to false otherwise, so the provider rejects that combination at plan time. Default: false.", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "pdb_enabled": schema.BoolAttribute{ + Description: "Respect PodDisruptionBudgets when applying recommendations", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "cpu_floor_percent": schema.Int64Attribute{ + Description: "Floor for CPU requests as a percent of the initial request (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "cpu_ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for CPU requests as a percent of the initial request (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "memory_floor_percent": schema.Int64Attribute{ + Description: "Floor for memory requests as a percent of the initial request (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "memory_ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for memory requests as a percent of the initial request (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "cpu_limit_floor_percent": schema.Int64Attribute{ + Description: "Floor for CPU limits as a percent of the initial limit (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "cpu_limit_ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for CPU limits as a percent of the initial limit (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "memory_limit_floor_percent": schema.Int64Attribute{ + Description: "Floor for memory limits as a percent of the initial limit (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "memory_limit_ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for memory limits as a percent of the initial limit (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "jvm_heap_optimization_enabled": schema.BoolAttribute{ + Description: "Enable JVM heap sizing recommendations", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "jvm_heap_target_percentile": schema.Float32Attribute{ + Description: "Target percentile for JVM heap sizing (0.0-1.0)", + Optional: true, + }, + "jvm_heap_headroom_multiplier": schema.Float32Attribute{ + Description: "Headroom multiplier applied to the JVM heap recommendation", + Optional: true, + }, + "jvm_non_heap_overhead_percent": schema.Float32Attribute{ + Description: "Non-heap overhead as a fraction of heap", + Optional: true, + }, + "jvm_non_heap_overhead_bytes": schema.Int64Attribute{ + Description: "Fixed non-heap overhead in bytes", + Optional: true, + }, + "jvm_min_heap_bytes": schema.Int64Attribute{ + Description: "Lower bound for the JVM heap recommendation in bytes", + Optional: true, + }, + "jvm_max_heap_bytes": schema.Int64Attribute{ + Description: "Upper bound for the JVM heap recommendation in bytes", + Optional: true, + }, + "jvm_prefer_container_support": schema.BoolAttribute{ + Description: "Prefer container-aware JVM flags (UseContainerSupport) over explicit -Xmx", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "jvm_cpu_startup_floor_millicores": schema.Int64Attribute{ + Description: "CPU floor during JVM startup, in millicores", + MarkdownDescription: "CPU floor during JVM startup, in millicores. Unset inherits the system default (75m); explicit `0` disables the floor.", + Optional: true, + Validators: []validator.Int64{int64validator.AtLeast(0)}, + }, }, } } @@ -449,6 +611,9 @@ func (r *WorkloadPolicyResource) Create(ctx context.Context, req resource.Create } policy := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId) + if resp.Diagnostics.HasError() { + return + } createWorkloadPolicyReq := &apiv1.CreateWorkloadRecommendationPolicyRequest{ TeamId: r.client.TeamId, @@ -491,12 +656,16 @@ func (r *WorkloadPolicyResource) Read(ctx context.Context, req resource.ReadRequ getWorkloadPolicyResp, err := r.client.RecommendationClient.GetWorkloadRecommendationPolicy(ctx, connect.NewRequest(getWorkloadPolicyReq)) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + resp.State.RemoveResource(ctx) + return + } resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get workload policy, got error: %s", err)) return } if getWorkloadPolicyResp.Msg.Policy == nil { - resp.Diagnostics.AddError("Client Error", "Workload policy not found") + resp.State.RemoveResource(ctx) return } @@ -516,9 +685,14 @@ func (r *WorkloadPolicyResource) Update(ctx context.Context, req resource.Update return } + policy := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId) + if resp.Diagnostics.HasError() { + return + } + updateWorkloadPolicyReq := &apiv1.UpdateWorkloadRecommendationPolicyRequest{ TeamId: r.client.TeamId, - Policy: data.toProto(ctx, &resp.Diagnostics, r.client.TeamId), + Policy: policy, } updateWorkloadPolicyResp, err := r.client.RecommendationClient.UpdateWorkloadRecommendationPolicy(ctx, connect.NewRequest(updateWorkloadPolicyReq)) @@ -554,7 +728,7 @@ func (r *WorkloadPolicyResource) Delete(ctx context.Context, req resource.Delete } _, err := r.client.RecommendationClient.DeleteWorkloadRecommendationPolicy(ctx, connect.NewRequest(deleteWorkloadPolicyReq)) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete workload policy, got error: %s", err)) return } @@ -603,6 +777,14 @@ func (m *WorkloadPolicyResourceModel) toProto(ctx context.Context, diags *diag.D return nil } + if m.AllowInPlaceMemoryLimitDecrease.ValueBool() && !m.EnableInPlaceVerticalScaling.ValueBool() { + diags.AddError( + "Invalid Configuration", + "allow_in_place_memory_limit_decrease requires enable_in_place_vertical_scaling = true (the server silently forces it to false otherwise).", + ) + return nil + } + return &apiv1.WorkloadRecommendationPolicy{ PolicyId: m.Id.ValueString(), TeamId: teamId, @@ -630,6 +812,29 @@ func (m *WorkloadPolicyResourceModel) toProto(ctx context.Context, diags *diag.D CooldownMinutes: m.CooldownMinutes.ValueInt32Pointer(), EnablePmaxProtection: m.EnablePmaxProtection.ValueBool(), PmaxRatioThreshold: m.PmaxRatioThreshold.ValueFloat32Pointer(), + + EnableInPlaceVerticalScaling: m.EnableInPlaceVerticalScaling.ValueBool(), + AllowInPlaceMemoryLimitDecrease: m.AllowInPlaceMemoryLimitDecrease.ValueBool(), + PdbEnabled: m.PdbEnabled.ValueBool(), + + CpuFloorPercent: m.CpuFloorPercent.ValueInt64Pointer(), + CpuCeilingPercent: m.CpuCeilingPercent.ValueInt64Pointer(), + MemoryFloorPercent: m.MemoryFloorPercent.ValueInt64Pointer(), + MemoryCeilingPercent: m.MemoryCeilingPercent.ValueInt64Pointer(), + CpuLimitFloorPercent: m.CpuLimitFloorPercent.ValueInt64Pointer(), + CpuLimitCeilingPercent: m.CpuLimitCeilingPercent.ValueInt64Pointer(), + MemoryLimitFloorPercent: m.MemoryLimitFloorPercent.ValueInt64Pointer(), + MemoryLimitCeilingPercent: m.MemoryLimitCeilingPercent.ValueInt64Pointer(), + + JvmHeapOptimizationEnabled: m.JvmHeapOptimizationEnabled.ValueBool(), + JvmHeapTargetPercentile: m.JvmHeapTargetPercentile.ValueFloat32Pointer(), + JvmHeapHeadroomMultiplier: m.JvmHeapHeadroomMultiplier.ValueFloat32Pointer(), + JvmNonHeapOverheadPercent: m.JvmNonHeapOverheadPercent.ValueFloat32Pointer(), + JvmNonHeapOverheadBytes: m.JvmNonHeapOverheadBytes.ValueInt64Pointer(), + JvmMinHeapBytes: m.JvmMinHeapBytes.ValueInt64Pointer(), + JvmMaxHeapBytes: m.JvmMaxHeapBytes.ValueInt64Pointer(), + JvmPreferContainerSupport: m.JvmPreferContainerSupport.ValueBool(), + JvmCpuStartupFloorMillicores: m.JvmCpuStartupFloorMillicores.ValueInt64Pointer(), } } @@ -677,11 +882,11 @@ func (m *WorkloadPolicyResourceModel) fromProto(policy *apiv1.WorkloadRecommenda m.StartupPeriodSeconds = types.Int64Value(*policy.StartupPeriodSeconds) } - m.CPUVerticalScaling.fromProto(policy.CpuVerticalScaling) - m.MemoryVerticalScaling.fromProto(policy.MemoryVerticalScaling) - m.GPUVerticalScaling.fromProto(policy.GpuVerticalScaling) - m.GPUVRAMVerticalScaling.fromProto(policy.GpuVramVerticalScaling) - m.HorizontalScaling.fromProto(policy.HorizontalScaling) + m.CPUVerticalScaling = verticalScalingOptionsFromProto(policy.CpuVerticalScaling) + m.MemoryVerticalScaling = verticalScalingOptionsFromProto(policy.MemoryVerticalScaling) + m.GPUVerticalScaling = verticalScalingOptionsFromProto(policy.GpuVerticalScaling) + m.GPUVRAMVerticalScaling = verticalScalingOptionsFromProto(policy.GpuVramVerticalScaling) + m.HorizontalScaling = horizontalScalingOptionsFromProto(policy.HorizontalScaling) m.LiveMigrationEnabled = types.BoolValue(policy.LiveMigrationEnabled) var schedulerPlugins []attr.Value @@ -719,6 +924,29 @@ func (m *WorkloadPolicyResourceModel) fromProto(policy *apiv1.WorkloadRecommenda if policy.PmaxRatioThreshold != nil { m.PmaxRatioThreshold = types.Float32Value(*policy.PmaxRatioThreshold) } + + m.EnableInPlaceVerticalScaling = types.BoolValue(policy.EnableInPlaceVerticalScaling) + m.AllowInPlaceMemoryLimitDecrease = types.BoolValue(policy.AllowInPlaceMemoryLimitDecrease) + m.PdbEnabled = types.BoolValue(policy.PdbEnabled) + + m.CpuFloorPercent = types.Int64PointerValue(policy.CpuFloorPercent) + m.CpuCeilingPercent = types.Int64PointerValue(policy.CpuCeilingPercent) + m.MemoryFloorPercent = types.Int64PointerValue(policy.MemoryFloorPercent) + m.MemoryCeilingPercent = types.Int64PointerValue(policy.MemoryCeilingPercent) + m.CpuLimitFloorPercent = types.Int64PointerValue(policy.CpuLimitFloorPercent) + m.CpuLimitCeilingPercent = types.Int64PointerValue(policy.CpuLimitCeilingPercent) + m.MemoryLimitFloorPercent = types.Int64PointerValue(policy.MemoryLimitFloorPercent) + m.MemoryLimitCeilingPercent = types.Int64PointerValue(policy.MemoryLimitCeilingPercent) + + m.JvmHeapOptimizationEnabled = types.BoolValue(policy.JvmHeapOptimizationEnabled) + m.JvmHeapTargetPercentile = types.Float32PointerValue(policy.JvmHeapTargetPercentile) + m.JvmHeapHeadroomMultiplier = types.Float32PointerValue(policy.JvmHeapHeadroomMultiplier) + m.JvmNonHeapOverheadPercent = types.Float32PointerValue(policy.JvmNonHeapOverheadPercent) + m.JvmNonHeapOverheadBytes = types.Int64PointerValue(policy.JvmNonHeapOverheadBytes) + m.JvmMinHeapBytes = types.Int64PointerValue(policy.JvmMinHeapBytes) + m.JvmMaxHeapBytes = types.Int64PointerValue(policy.JvmMaxHeapBytes) + m.JvmPreferContainerSupport = types.BoolValue(policy.JvmPreferContainerSupport) + m.JvmCpuStartupFloorMillicores = types.Int64PointerValue(policy.JvmCpuStartupFloorMillicores) } func (o *VerticalScalingOptions) toProto() *apiv1.VerticalScalingOptimizationTarget { @@ -738,17 +966,16 @@ func (o *VerticalScalingOptions) toProto() *apiv1.VerticalScalingOptimizationTar MinDataPoints: o.MinDataPoints.ValueInt32Pointer(), AdjustReqEvenIfNotSet: o.AdjustReqEvenIfNotSet.ValueBool(), LimitsRemovalEnabled: o.LimitsRemovalEnabled.ValueBool(), + RequestUseRss: o.RequestUseRss.ValueBoolPointer(), + LimitUseRss: o.LimitUseRss.ValueBoolPointer(), } } -func (o *VerticalScalingOptions) fromProto(target *apiv1.VerticalScalingOptimizationTarget) { +func verticalScalingOptionsFromProto(target *apiv1.VerticalScalingOptimizationTarget) *VerticalScalingOptions { if target == nil { - o = nil - return - } - if o == nil { - o = &VerticalScalingOptions{} + return nil } + o := &VerticalScalingOptions{} o.Enabled = types.BoolValue(target.Enabled) if target.MinRequest != nil { @@ -780,6 +1007,9 @@ func (o *VerticalScalingOptions) fromProto(target *apiv1.VerticalScalingOptimiza } o.AdjustReqEvenIfNotSet = types.BoolValue(target.AdjustReqEvenIfNotSet) o.LimitsRemovalEnabled = types.BoolValue(target.LimitsRemovalEnabled) + o.RequestUseRss = types.BoolPointerValue(target.RequestUseRss) + o.LimitUseRss = types.BoolPointerValue(target.LimitUseRss) + return o } func (o *HorizontalScalingOptions) toProto() *apiv1.HorizontalScalingOptimizationTarget { @@ -794,17 +1024,19 @@ func (o *HorizontalScalingOptions) toProto() *apiv1.HorizontalScalingOptimizatio PrimaryMetric: o.toHPAMetric(), MinDataPoints: o.MinDataPoints.ValueInt32Pointer(), MaxReplicaChangePercent: o.MaxReplicaChangePercent.ValueFloat32Pointer(), + + NetworkTargetThroughputBytesPerSec: o.NetworkTargetThroughputBytesPerSec.ValueInt64Pointer(), + TargetMemoryUtilization: o.TargetMemoryUtilization.ValueFloat32Pointer(), + CompositeFormula: o.CompositeFormula.ValueStringPointer(), + ScaleDownCooldownSeconds: o.ScaleDownCooldownSeconds.ValueInt32Pointer(), } } -func (o *HorizontalScalingOptions) fromProto(target *apiv1.HorizontalScalingOptimizationTarget) { +func horizontalScalingOptionsFromProto(target *apiv1.HorizontalScalingOptimizationTarget) *HorizontalScalingOptions { if target == nil { - o = nil - return - } - if o == nil { - o = &HorizontalScalingOptions{} + return nil } + o := &HorizontalScalingOptions{} o.Enabled = types.BoolValue(target.Enabled) if target.MinReplicas != nil { o.MinReplicas = types.Int32Value(*target.MinReplicas) @@ -815,13 +1047,20 @@ func (o *HorizontalScalingOptions) fromProto(target *apiv1.HorizontalScalingOpti if target.TargetUtilization != nil { o.TargetUtilization = types.Float32Value(*target.TargetUtilization) } - o.PrimaryMetric = types.StringValue(o.fromHPAMetric(target.GetPrimaryMetric())) + if target.PrimaryMetric != nil { + o.PrimaryMetric = types.StringValue(o.fromHPAMetric(*target.PrimaryMetric)) + } if target.MinDataPoints != nil { o.MinDataPoints = types.Int32Value(*target.MinDataPoints) } if target.MaxReplicaChangePercent != nil { o.MaxReplicaChangePercent = types.Float32Value(*target.MaxReplicaChangePercent) } + o.NetworkTargetThroughputBytesPerSec = types.Int64PointerValue(target.NetworkTargetThroughputBytesPerSec) + o.TargetMemoryUtilization = types.Float32PointerValue(target.TargetMemoryUtilization) + o.CompositeFormula = types.StringPointerValue(target.CompositeFormula) + o.ScaleDownCooldownSeconds = types.Int32PointerValue(target.ScaleDownCooldownSeconds) + return o } func (o *HorizontalScalingOptions) toHPAMetric() *apiv1.HPAMetricType { diff --git a/internal/provider/workload_policy_target.go b/internal/provider/workload_policy_target.go index acf6640..fc83071 100644 --- a/internal/provider/workload_policy_target.go +++ b/internal/provider/workload_policy_target.go @@ -40,20 +40,23 @@ type WorkloadPolicyTargetResource struct { // ExampleResourceModel describes the resource data model. type WorkloadPolicyTargetResourceModel struct { - Id types.String `tfsdk:"id"` - PolicyId types.String `tfsdk:"policy_id"` - Name types.String `tfsdk:"name"` - Description types.String `tfsdk:"description"` - Priority types.Int32 `tfsdk:"priority"` - Enabled types.Bool `tfsdk:"enabled"` - NamespaceSelector *LabelSelector `tfsdk:"namespace_selector"` - WorkloadSelector *LabelSelector `tfsdk:"workload_selector"` - KindFilter types.List `tfsdk:"kind_filter"` - NamePattern *RegexPattern `tfsdk:"name_pattern"` - NamespacePattern *RegexPattern `tfsdk:"namespace_pattern"` - WorkloadNames types.List `tfsdk:"workload_names"` - NodeGroupNames types.List `tfsdk:"node_group_names"` - ClusterIds types.List `tfsdk:"cluster_ids"` + Id types.String `tfsdk:"id"` + PolicyId types.String `tfsdk:"policy_id"` + Name types.String `tfsdk:"name"` + Description types.String `tfsdk:"description"` + Priority types.Int32 `tfsdk:"priority"` + Enabled types.Bool `tfsdk:"enabled"` + NamespaceSelector *LabelSelector `tfsdk:"namespace_selector"` + WorkloadSelector *LabelSelector `tfsdk:"workload_selector"` + KindFilter types.List `tfsdk:"kind_filter"` + NamePattern *RegexPattern `tfsdk:"name_pattern"` + NamespacePattern *RegexPattern `tfsdk:"namespace_pattern"` + WorkloadNames types.List `tfsdk:"workload_names"` + WorkloadNamesNotIn types.List `tfsdk:"workload_names_not_in"` + KindFilterNotIn types.List `tfsdk:"kind_filter_not_in"` + AnnotationSelector *LabelSelector `tfsdk:"annotation_selector"` + NodeGroupNames types.List `tfsdk:"node_group_names"` + ClusterIds types.List `tfsdk:"cluster_ids"` } type LabelSelector struct { @@ -216,13 +219,36 @@ func (r *WorkloadPolicyTargetResource) Schema(ctx context.Context, req resource. Computed: true, Default: listdefault.StaticValue(types.ListValueMust(types.StringType, []attr.Value{})), }, + "workload_names_not_in": schema.ListAttribute{ + Description: "Explicit list of workload names to exclude", + MarkdownDescription: "Explicit list of workload names to exclude from matching.", + Optional: true, + ElementType: types.StringType, + Computed: true, + Default: listdefault.StaticValue(types.ListValueMust(types.StringType, []attr.Value{})), + }, + "kind_filter_not_in": schema.ListAttribute{ + Description: "Kubernetes kinds to exclude from matching", + MarkdownDescription: "Kubernetes kinds to exclude from matching. Same allowed values as `kind_filter`.", + Optional: true, + ElementType: types.StringType, + Computed: true, + Default: listdefault.StaticValue(types.ListValueMust(types.StringType, []attr.Value{})), + }, + "annotation_selector": schema.SingleNestedAttribute{ + Description: "Select workloads by annotations", + MarkdownDescription: "Select workloads by annotations. Uses the same semantics as label selectors, evaluated against workload annotations.", + Optional: true, + Attributes: labelSelectorAttributes, + }, "node_group_names": schema.ListAttribute{ - Description: "Restrict matching to specific node groups", - MarkdownDescription: "Restrict matching to specific node groups by name", + Description: "Restrict matching to specific node groups (deprecated upstream)", + MarkdownDescription: "Restrict matching to specific node groups by name. Deprecated upstream — unused by any active target and removed from the UI.", Optional: true, ElementType: types.StringType, Computed: true, Default: listdefault.StaticValue(types.ListValueMust(types.StringType, []attr.Value{})), + DeprecationMessage: "node_group_names is deprecated by the DevZero API and no longer evaluated.", }, "cluster_ids": schema.ListAttribute{ Description: "Clusters where this target should apply", @@ -298,21 +324,42 @@ func (r *WorkloadPolicyTargetResource) Create(ctx context.Context, req resource. return } + workloadNamesNotIn, err := getStringList(ctx, data.WorkloadNamesNotIn.Elements()) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert workload names (not in): %s", err)) + return + } + + kindFiltersNotIn, err := getKindFilters(ctx, data.KindFilterNotIn.Elements()) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert kind filter (not in): %s", err)) + return + } + + annotationSelector, err := data.AnnotationSelector.toProto(ctx) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert annotation selector: %s", err)) + return + } + createWorkloadPolicyTargetReq := &apiv1.CreateWorkloadPolicyTargetRequest{ - TeamId: r.client.TeamId, - PolicyId: data.PolicyId.ValueString(), - Name: data.Name.ValueString(), - Description: data.Description.ValueString(), - Priority: data.Priority.ValueInt32(), - Enabled: data.Enabled.ValueBool(), - NamespaceSelector: namespaceSelector, - WorkloadSelector: workloadSelector, - KindFilter: kindFilters, - NamePattern: data.NamePattern.toProto(), - NamespacePattern: data.NamespacePattern.toProto(), - WorkloadNames: workloadNames, - NodeGroupNames: nodeGroupNames, - ClusterIds: clusterIds, + TeamId: r.client.TeamId, + PolicyId: data.PolicyId.ValueString(), + Name: data.Name.ValueString(), + Description: data.Description.ValueString(), + Priority: data.Priority.ValueInt32(), + Enabled: data.Enabled.ValueBool(), + NamespaceSelector: namespaceSelector, + WorkloadSelector: workloadSelector, + KindFilter: kindFilters, + NamePattern: data.NamePattern.toProto(), + NamespacePattern: data.NamespacePattern.toProto(), + WorkloadNames: workloadNames, + WorkloadNamesNotIn: workloadNamesNotIn, + KindFilterNotIn: kindFiltersNotIn, + AnnotationSelector: annotationSelector, + NodeGroupNames: nodeGroupNames, //nolint:staticcheck // deprecated upstream; still sent for compatibility + ClusterIds: clusterIds, } createWorkloadPolicyTargetResp, err := r.client.RecommendationClient.CreateWorkloadPolicyTarget(ctx, connect.NewRequest(createWorkloadPolicyTargetReq)) @@ -352,12 +399,16 @@ func (r *WorkloadPolicyTargetResource) Read(ctx context.Context, req resource.Re getWorkloadPolicyTargetResp, err := r.client.RecommendationClient.GetWorkloadPolicyTarget(ctx, connect.NewRequest(getWorkloadPolicyTargetReq)) if err != nil { - resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get cluster, got error: %s", err)) + if connect.CodeOf(err) == connect.CodeNotFound { + resp.State.RemoveResource(ctx) + return + } + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get workload policy target, got error: %s", err)) return } if getWorkloadPolicyTargetResp.Msg.Target == nil { - resp.Diagnostics.AddError("Client Error", "Workload policy target not found") + resp.State.RemoveResource(ctx) return } @@ -412,22 +463,43 @@ func (r *WorkloadPolicyTargetResource) Update(ctx context.Context, req resource. return } + workloadNamesNotIn, err := getStringList(ctx, data.WorkloadNamesNotIn.Elements()) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert workload names (not in): %s", err)) + return + } + + kindFiltersNotIn, err := getKindFilters(ctx, data.KindFilterNotIn.Elements()) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert kind filter (not in): %s", err)) + return + } + + annotationSelector, err := data.AnnotationSelector.toProto(ctx) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to convert annotation selector: %s", err)) + return + } + updateWorkloadPolicyTargetReq := &apiv1.UpdateWorkloadPolicyTargetRequest{ - TeamId: r.client.TeamId, - TargetId: data.Id.ValueString(), - PolicyId: data.PolicyId.ValueStringPointer(), - Name: data.Name.ValueString(), - Description: data.Description.ValueString(), - Priority: data.Priority.ValueInt32(), - Enabled: data.Enabled.ValueBool(), - NamespaceSelector: namespaceSelector, - WorkloadSelector: workloadSelector, - KindFilter: kindFilters, - NamePattern: data.NamePattern.toProto(), - NamespacePattern: data.NamespacePattern.toProto(), - WorkloadNames: workloadNames, - NodeGroupNames: nodeGroupNames, - ClusterIds: clusterIds, + TeamId: r.client.TeamId, + TargetId: data.Id.ValueString(), + PolicyId: data.PolicyId.ValueStringPointer(), + Name: data.Name.ValueString(), + Description: data.Description.ValueString(), + Priority: data.Priority.ValueInt32(), + Enabled: data.Enabled.ValueBool(), + NamespaceSelector: namespaceSelector, + WorkloadSelector: workloadSelector, + KindFilter: kindFilters, + NamePattern: data.NamePattern.toProto(), + NamespacePattern: data.NamespacePattern.toProto(), + WorkloadNames: workloadNames, + WorkloadNamesNotIn: workloadNamesNotIn, + KindFilterNotIn: kindFiltersNotIn, + AnnotationSelector: annotationSelector, + NodeGroupNames: nodeGroupNames, //nolint:staticcheck // deprecated upstream; still sent for compatibility + ClusterIds: clusterIds, } updateWorkloadPolicyTargetResp, err := r.client.RecommendationClient.UpdateWorkloadPolicyTarget(ctx, connect.NewRequest(updateWorkloadPolicyTargetReq)) @@ -463,8 +535,8 @@ func (r *WorkloadPolicyTargetResource) Delete(ctx context.Context, req resource. } _, err := r.client.RecommendationClient.DeleteWorkloadPolicyTarget(ctx, connect.NewRequest(deleteWorkloadPolicyTargetReq)) - if err != nil { - resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete cluster, got error: %s", err)) + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete workload policy target, got error: %s", err)) return } } @@ -636,24 +708,24 @@ func (m *WorkloadPolicyTargetResourceModel) fromProto(target *apiv1.WorkloadPoli m.Description = types.StringValue(target.Description) m.Priority = types.Int32Value(target.Priority) m.Enabled = types.BoolValue(target.Enabled) - m.NamespaceSelector.fromProto(target.NamespaceSelector) - m.WorkloadSelector.fromProto(target.WorkloadSelector) + m.NamespaceSelector = labelSelectorModelFromProto(target.NamespaceSelector) + m.WorkloadSelector = labelSelectorModelFromProto(target.WorkloadSelector) m.KindFilter = types.ListValueMust(types.StringType, fromKindFilter(target.KindFilter)) - m.NamePattern.fromProto(target.NamePattern) - m.NamespacePattern.fromProto(target.NamespacePattern) + m.NamePattern = regexPatternModelFromProto(target.NamePattern) + m.NamespacePattern = regexPatternModelFromProto(target.NamespacePattern) m.WorkloadNames = types.ListValueMust(types.StringType, fromStringList(target.WorkloadNames)) - m.NodeGroupNames = types.ListValueMust(types.StringType, fromStringList(target.NodeGroupNames)) + m.WorkloadNamesNotIn = types.ListValueMust(types.StringType, fromStringList(target.WorkloadNamesNotIn)) + m.KindFilterNotIn = types.ListValueMust(types.StringType, fromKindFilter(target.KindFilterNotIn)) + m.AnnotationSelector = labelSelectorModelFromProto(target.AnnotationSelector) + m.NodeGroupNames = types.ListValueMust(types.StringType, fromStringList(target.NodeGroupNames)) //nolint:staticcheck // deprecated upstream; still read back m.ClusterIds = types.ListValueMust(types.StringType, fromStringList(target.ClusterIds)) } -func (m *LabelSelector) fromProto(selector *apiv1.LabelSelector) { +func labelSelectorModelFromProto(selector *apiv1.LabelSelector) *LabelSelector { if selector == nil { - m = nil - return - } - if m == nil { - m = &LabelSelector{} + return nil } + m := &LabelSelector{} // Handle match_labels: if empty, set to null instead of empty map if len(selector.MatchLabels) == 0 { @@ -665,25 +737,13 @@ func (m *LabelSelector) fromProto(selector *apiv1.LabelSelector) { // Manually convert match expressions from proto to Terraform types var matchExpressions []attr.Value for _, expr := range selector.MatchExpressions { - // Convert operator enum to string - var operatorStr string - switch expr.Operator { - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_IN: - operatorStr = "In" - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_NOT_IN: - operatorStr = "NotIn" - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_EXISTS: - operatorStr = "Exists" - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST: - operatorStr = "DoesNotExist" - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT: - operatorStr = "Gt" - case apiv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_LT: - operatorStr = "Lt" - } + operatorStr := labelSelectorOperatorToString(expr.Operator) // Convert values to Terraform list - values := types.ListValueMust(types.StringType, fromStringList(expr.Values)) + values := types.ListNull(types.StringType) + if len(expr.Values) > 0 { + values = types.ListValueMust(types.StringType, fromStringList(expr.Values)) + } // Build the match expression object matchExpr := types.ObjectValueMust( @@ -703,16 +763,19 @@ func (m *LabelSelector) fromProto(selector *apiv1.LabelSelector) { } else { m.MatchExpressions = types.ListValueMust(types.ObjectType{AttrTypes: MatchExpression{}.AttrTypes()}, matchExpressions) } + return m } -func (m *RegexPattern) fromProto(pattern *apiv1.RegexPattern) { +func regexPatternModelFromProto(pattern *apiv1.RegexPattern) *RegexPattern { if pattern == nil { - m = nil - return - } - if m == nil { - m = &RegexPattern{} + return nil } + m := &RegexPattern{} m.Pattern = types.StringValue(pattern.Pattern) - m.Flags = types.StringValue(pattern.Flags) + if pattern.Flags == "" { + m.Flags = types.StringNull() + } else { + m.Flags = types.StringValue(pattern.Flags) + } + return m } diff --git a/internal/provider/workload_policy_target_test.go b/internal/provider/workload_policy_target_test.go index 29006b7..fe88579 100644 --- a/internal/provider/workload_policy_target_test.go +++ b/internal/provider/workload_policy_target_test.go @@ -181,7 +181,8 @@ func TestWorkloadPolicyTargetResourceModel(t *testing.T) { map[string]attr.Value{ "key": types.StringValue("version"), "operator": types.StringValue("Exists"), - "values": types.ListValueMust(types.StringType, []attr.Value{}), + // Exists takes no values; the provider round-trips absent values as null. + "values": types.ListNull(types.StringType), }, ), }, @@ -342,8 +343,7 @@ func TestWorkloadPolicyTargetResourceModel(t *testing.T) { Flags: "i", } - pattern := &RegexPattern{} - pattern.fromProto(protoPattern) + pattern := regexPatternModelFromProto(protoPattern) if pattern.Pattern.ValueString() != "^prod-" { t.Errorf("Expected pattern '^prod-', got %s", pattern.Pattern.ValueString()) } @@ -361,8 +361,7 @@ func TestWorkloadPolicyTargetResourceModel(t *testing.T) { } // Convert from proto - selector := &LabelSelector{} - selector.fromProto(proto) + selector := labelSelectorModelFromProto(proto) // Verify that empty collections are converted to null if !selector.MatchLabels.IsNull() { @@ -422,7 +421,8 @@ func TestWorkloadPolicyTargetResourceModel(t *testing.T) { map[string]attr.Value{ "key": types.StringValue("version"), "operator": types.StringValue("Exists"), - "values": types.ListValueMust(types.StringType, []attr.Value{}), + // Exists takes no values; the provider round-trips absent values as null. + "values": types.ListNull(types.StringType), }, ), }, @@ -437,8 +437,7 @@ func TestWorkloadPolicyTargetResourceModel(t *testing.T) { } // Convert back from proto - converted := &LabelSelector{} - converted.fromProto(proto) + converted := labelSelectorModelFromProto(proto) // Verify match labels if !original.MatchLabels.Equal(converted.MatchLabels) { diff --git a/internal/provider/workload_rule.go b/internal/provider/workload_rule.go index 80263b6..f51282b 100644 --- a/internal/provider/workload_rule.go +++ b/internal/provider/workload_rule.go @@ -5,6 +5,8 @@ import ( "fmt" "connectrpc.com/connect" + "github.com/hashicorp/terraform-plugin-framework-validators/int32validator" + "github.com/hashicorp/terraform-plugin-framework-validators/int64validator" "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework-validators/stringvalidator" "github.com/hashicorp/terraform-plugin-framework/attr" @@ -56,6 +58,8 @@ type WorkloadRuleResourceModel struct { LiveMigrationEnabled types.Bool `tfsdk:"live_migration_enabled"` UseInPlaceVerticalScaling types.Bool `tfsdk:"use_in_place_vertical_scaling"` Containers []ContainerRuleModel `tfsdk:"containers"` + Disabled types.Bool `tfsdk:"disabled"` + LookbackPeriodSeconds types.Int32 `tfsdk:"lookback_period_seconds"` } type ResourceRuleConfigModel struct { @@ -68,15 +72,20 @@ type ResourceRuleConfigModel struct { MaxScaleUpPercent types.Float32 `tfsdk:"max_scale_up_percent"` MaxScaleDownPercent types.Float32 `tfsdk:"max_scale_down_percent"` LimitsRemovalEnabled types.Bool `tfsdk:"limits_removal_enabled"` + InitialRequest types.Int64 `tfsdk:"initial_request"` + FloorPercent types.Int64 `tfsdk:"floor_percent"` + CeilingPercent types.Int64 `tfsdk:"ceiling_percent"` + InitialLimit types.Int64 `tfsdk:"initial_limit"` + LimitFloorPercent types.Int64 `tfsdk:"limit_floor_percent"` + LimitCeilingPercent types.Int64 `tfsdk:"limit_ceiling_percent"` + RequestUseRss types.Bool `tfsdk:"request_use_rss"` + LimitUseRss types.Bool `tfsdk:"limit_use_rss"` } type HPARuleConfigModel struct { Enabled types.Bool `tfsdk:"enabled"` MinReplicas types.Int32 `tfsdk:"min_replicas"` MaxReplicas types.Int32 `tfsdk:"max_replicas"` - TargetUtilization types.Float32 `tfsdk:"target_utilization"` - TargetMemoryUtilization types.Float32 `tfsdk:"target_memory_utilization"` - PrimaryMetric types.String `tfsdk:"primary_metric"` MaxReplicaChangePercent types.Float32 `tfsdk:"max_replica_change_percent"` ScaleDownCooldownSeconds types.Int32 `tfsdk:"scale_down_cooldown_seconds"` Metrics []HPAMetricTriggerModel `tfsdk:"metrics"` @@ -93,6 +102,7 @@ type HPAMetricTriggerModel struct { Metadata types.Map `tfsdk:"metadata"` ServerAddress types.String `tfsdk:"server_address"` Query types.String `tfsdk:"query"` + ConnectorId types.String `tfsdk:"connector_id"` } type HPAFallbackModel struct { @@ -143,6 +153,8 @@ type ContainerResourceConfigModel struct { LimitsAdjustmentEnabled types.Bool `tfsdk:"limits_adjustment_enabled"` TargetPercentile types.Float32 `tfsdk:"target_percentile"` LimitsRemovalEnabled types.Bool `tfsdk:"limits_removal_enabled"` + RequestUseRss types.Bool `tfsdk:"request_use_rss"` + LimitUseRss types.Bool `tfsdk:"limit_use_rss"` } func hpaScalingRulesAttributes() map[string]schema.Attribute { @@ -233,6 +245,42 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Computed: true, Default: booldefault.StaticBool(false), }, + "initial_request": schema.Int64Attribute{ + Description: "Baseline request the floor/ceiling percents are computed against", + Optional: true, + }, + "floor_percent": schema.Int64Attribute{ + Description: "Floor for the request as a percent of initial_request (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for the request as a percent of initial_request (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "initial_limit": schema.Int64Attribute{ + Description: "Baseline limit the limit floor/ceiling percents are computed against", + Optional: true, + }, + "limit_floor_percent": schema.Int64Attribute{ + Description: "Floor for the limit as a percent of initial_limit (1-100)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 100)}, + }, + "limit_ceiling_percent": schema.Int64Attribute{ + Description: "Ceiling for the limit as a percent of initial_limit (1-1000)", + Optional: true, + Validators: []validator.Int64{int64validator.Between(1, 1000)}, + }, + "request_use_rss": schema.BoolAttribute{ + Description: "Memory only: size the request from RSS instead of working set", + Optional: true, + }, + "limit_use_rss": schema.BoolAttribute{ + Description: "Memory only: derive the limit from an RSS-based recommendation", + Optional: true, + }, } } @@ -272,6 +320,14 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Computed: true, Default: booldefault.StaticBool(false), }, + "request_use_rss": schema.BoolAttribute{ + Description: "Memory only: size the request from RSS instead of working set", + Optional: true, + }, + "limit_use_rss": schema.BoolAttribute{ + Description: "Memory only: derive the limit from an RSS-based recommendation", + Optional: true, + }, } } @@ -344,21 +400,6 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Description: "Maximum number of replicas", Optional: true, }, - "target_utilization": schema.Float32Attribute{ - Description: "Target CPU utilization ratio (0-1)", - Optional: true, - }, - "target_memory_utilization": schema.Float32Attribute{ - Description: "Target memory utilization ratio (0-1), tuned independently of CPU", - Optional: true, - }, - "primary_metric": schema.StringAttribute{ - Description: "Primary metric for HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'", - Optional: true, - Validators: []validator.String{ - stringvalidator.OneOf("cpu", "memory", "gpu", "network_ingress", "network_egress"), - }, - }, "max_replica_change_percent": schema.Float32Attribute{ Description: "Maximum percentage change in replica count per cycle", Optional: true, @@ -372,7 +413,7 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Optional: true, }, "metrics": schema.ListNestedAttribute{ - Description: "Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primary_metric.", + Description: "HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed target_utilization/primary_metric fields.", Optional: true, NestedObject: schema.NestedAttributeObject{ Attributes: map[string]schema.Attribute{ @@ -405,6 +446,10 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Description: "PromQL query string. Packed into metadata by the service layer.", Optional: true, }, + "connector_id": schema.StringAttribute{ + Description: "HPA connector ID to source this metric's connection settings from", + Optional: true, + }, }, }, }, @@ -513,7 +558,7 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Validators: []validator.List{ listvalidator.NoNullValues(), listvalidator.UniqueValues(), - listvalidator.ValueStringsAre(stringvalidator.OneOf("pod_creation", "pod_update")), + listvalidator.ValueStringsAre(stringvalidator.OneOf("pod_creation", "pod_update", "pod_evict")), }, }, "scheduler_plugins": schema.ListAttribute{ @@ -541,6 +586,19 @@ func (r *WorkloadRuleResource) Schema(ctx context.Context, req resource.SchemaRe Computed: true, Default: booldefault.StaticBool(false), }, + "disabled": schema.BoolAttribute{ + Description: "Create the rule in a disabled state", + MarkdownDescription: "Whether the rule is disabled. A disabled rule exists but is not evaluated. Changing this after creation uses the ToggleWorkloadRuleDisabled API (the upsert API rejects `disabled` on update).", + Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), + }, + "lookback_period_seconds": schema.Int32Attribute{ + Description: "Per-rule override of the metrics lookback window (seconds)", + MarkdownDescription: "Per-rule override of the metrics lookback window in seconds. Unset inherits the team default (7 days). Minimum 3600 (1h), maximum 2592000 (30d); higher tiers may be capped server-side.", + Optional: true, + Validators: []validator.Int32{int32validator.Between(3600, 2592000)}, + }, "containers": schema.ListNestedAttribute{ Description: "Per-container resource rule configurations. When empty, workload-level rules apply to all containers.", Optional: true, @@ -597,7 +655,7 @@ func (r *WorkloadRuleResource) Create(ctx context.Context, req resource.CreateRe return } - upsertReq := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId) + upsertReq := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId, true) if resp.Diagnostics.HasError() { return } @@ -634,11 +692,15 @@ func (r *WorkloadRuleResource) Read(ctx context.Context, req resource.ReadReques RuleId: data.Id.ValueString(), })) if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + resp.State.RemoveResource(ctx) + return + } resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get workload rule, got error: %s", err)) return } if getRuleResp.Msg.Rule == nil { - resp.Diagnostics.AddError("Client Error", "Workload rule not found") + resp.State.RemoveResource(ctx) return } @@ -657,7 +719,13 @@ func (r *WorkloadRuleResource) Update(ctx context.Context, req resource.UpdateRe return } - upsertReq := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId) + var state WorkloadRuleResourceModel + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + + upsertReq := data.toProto(ctx, &resp.Diagnostics, r.client.TeamId, false) if resp.Diagnostics.HasError() { return } @@ -672,6 +740,24 @@ func (r *WorkloadRuleResource) Update(ctx context.Context, req resource.UpdateRe return } + // disabled cannot be sent through the upsert on update; use the toggle RPC. + if !data.Disabled.IsNull() && !data.Disabled.IsUnknown() && data.Disabled.ValueBool() != state.Disabled.ValueBool() { + toggleResp, err := r.client.RecommendationClient.ToggleWorkloadRuleDisabled(ctx, connect.NewRequest(&apiv1.ToggleWorkloadRuleDisabledRequest{ + TeamId: r.client.TeamId, + RuleId: upsertResp.Msg.Rule.RuleId, + Disabled: data.Disabled.ValueBool(), + })) + if err != nil { + resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to toggle workload rule disabled state, got error: %s", err)) + return + } + if toggleResp.Msg.Rule != nil { + upsertResp.Msg.Rule.Disabled = toggleResp.Msg.Rule.Disabled + } else { + upsertResp.Msg.Rule.Disabled = data.Disabled.ValueBool() + } + } + plan := data data.fromProto(upsertResp.Msg.Rule) data.preserveNullsFrom(&plan) @@ -691,7 +777,7 @@ func (r *WorkloadRuleResource) Delete(ctx context.Context, req resource.DeleteRe TeamId: r.client.TeamId, RuleId: data.Id.ValueString(), })) - if err != nil { + if err != nil && connect.CodeOf(err) != connect.CodeNotFound { resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to delete workload rule, got error: %s", err)) return } @@ -703,7 +789,10 @@ func (r *WorkloadRuleResource) ImportState(ctx context.Context, req resource.Imp // ---------- toProto / fromProto ---------- -func (m *WorkloadRuleResourceModel) toProto(ctx context.Context, diags *diag.Diagnostics, teamId string) *apiv1.UpsertManualWorkloadRuleRequest { +// toProto builds the upsert request. includeDisabled must be true only on +// Create: the server rejects fields.disabled when updating an existing rule +// (ToggleWorkloadRuleDisabled is the update path, handled in Update). +func (m *WorkloadRuleResourceModel) toProto(ctx context.Context, diags *diag.Diagnostics, teamId string, includeDisabled bool) *apiv1.UpsertManualWorkloadRuleRequest { source := apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_TERRAFORM_MANUAL if m.AutoGenerate.ValueBool() { source = apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_TERRAFORM_AUTO @@ -744,6 +833,8 @@ func (m *WorkloadRuleResourceModel) toProto(ctx context.Context, diags *diag.Dia return apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_POD_CREATION, nil case "pod_update": return apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_POD_UPDATE, nil + case "pod_evict": + return apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_POD_EVICT, nil default: return apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_UNSPECIFIED, fmt.Errorf("invalid detection trigger: %s", value) } @@ -789,6 +880,14 @@ func (m *WorkloadRuleResourceModel) toProto(ctx context.Context, diags *diag.Dia v := m.DefragmentationSchedule.ValueString() fields.DefragmentationSchedule = &v } + if !m.LookbackPeriodSeconds.IsNull() && !m.LookbackPeriodSeconds.IsUnknown() { + v := m.LookbackPeriodSeconds.ValueInt32() + fields.LookbackPeriodSeconds = &v + } + if includeDisabled && !m.Disabled.IsNull() && !m.Disabled.IsUnknown() { + v := m.Disabled.ValueBool() + fields.Disabled = &v + } req.Fields = fields return req @@ -850,6 +949,9 @@ func (m *WorkloadRuleResourceModel) fromProto(r *apiv1.WorkloadRule) { m.AutoGenerate = types.BoolValue(false) } + m.Disabled = types.BoolValue(r.Disabled) + m.LookbackPeriodSeconds = types.Int32PointerValue(r.LookbackPeriodSeconds) + m.CpuRule = resourceRuleConfigFromProto(r.CpuRule) m.MemoryRule = resourceRuleConfigFromProto(r.MemoryRule) m.GpuRule = resourceRuleConfigFromProto(r.GpuRule) @@ -892,6 +994,8 @@ func (m *WorkloadRuleResourceModel) fromProto(r *apiv1.WorkloadRule) { detectionTriggers = append(detectionTriggers, types.StringValue("pod_creation")) case apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_POD_UPDATE: detectionTriggers = append(detectionTriggers, types.StringValue("pod_update")) + case apiv1.WorkloadDetectionTrigger_DETECTION_TRIGGER_POD_EVICT: + detectionTriggers = append(detectionTriggers, types.StringValue("pod_evict")) } } m.DetectionTriggers = types.ListValueMust(types.StringType, detectionTriggers) @@ -948,6 +1052,14 @@ func (m *ResourceRuleConfigModel) toProto() *apiv1.ResourceRuleConfig { v := m.MaxScaleDownPercent.ValueFloat32() p.MaxScaleDownPercent = &v } + p.InitialRequest = m.InitialRequest.ValueInt64Pointer() + p.FloorPercent = m.FloorPercent.ValueInt64Pointer() + p.CeilingPercent = m.CeilingPercent.ValueInt64Pointer() + p.InitialLimit = m.InitialLimit.ValueInt64Pointer() + p.LimitFloorPercent = m.LimitFloorPercent.ValueInt64Pointer() + p.LimitCeilingPercent = m.LimitCeilingPercent.ValueInt64Pointer() + p.RequestUseRss = m.RequestUseRss.ValueBoolPointer() + p.LimitUseRss = m.LimitUseRss.ValueBoolPointer() return p } @@ -965,6 +1077,14 @@ func resourceRuleConfigFromProto(p *apiv1.ResourceRuleConfig) *ResourceRuleConfi TargetPercentile: types.Float32Null(), MaxScaleUpPercent: types.Float32Null(), MaxScaleDownPercent: types.Float32Null(), + InitialRequest: types.Int64PointerValue(p.InitialRequest), + FloorPercent: types.Int64PointerValue(p.FloorPercent), + CeilingPercent: types.Int64PointerValue(p.CeilingPercent), + InitialLimit: types.Int64PointerValue(p.InitialLimit), + LimitFloorPercent: types.Int64PointerValue(p.LimitFloorPercent), + LimitCeilingPercent: types.Int64PointerValue(p.LimitCeilingPercent), + RequestUseRss: types.BoolPointerValue(p.RequestUseRss), + LimitUseRss: types.BoolPointerValue(p.LimitUseRss), } if p.MinRequest != nil { m.MinRequest = types.Int64Value(*p.MinRequest) @@ -1004,17 +1124,6 @@ func (m *HPARuleConfigModel) toProto() *apiv1.HPARuleConfig { v := m.MaxReplicas.ValueInt32() p.MaxReplicas = &v } - if !m.TargetUtilization.IsNull() && !m.TargetUtilization.IsUnknown() { - v := m.TargetUtilization.ValueFloat32() - p.TargetUtilization = &v - } - if !m.TargetMemoryUtilization.IsNull() && !m.TargetMemoryUtilization.IsUnknown() { - v := m.TargetMemoryUtilization.ValueFloat32() - p.TargetMemoryUtilization = &v - } - if !m.PrimaryMetric.IsNull() && !m.PrimaryMetric.IsUnknown() { - p.PrimaryMetric = wrHPAMetricToProto(m.PrimaryMetric.ValueString()) - } if !m.MaxReplicaChangePercent.IsNull() && !m.MaxReplicaChangePercent.IsUnknown() { v := m.MaxReplicaChangePercent.ValueFloat32() p.MaxReplicaChangePercent = &v @@ -1047,9 +1156,6 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigModel { Enabled: types.BoolValue(p.Enabled), MinReplicas: types.Int32Null(), MaxReplicas: types.Int32Null(), - TargetUtilization: types.Float32Null(), - TargetMemoryUtilization: types.Float32Null(), - PrimaryMetric: types.StringNull(), MaxReplicaChangePercent: types.Float32Null(), ScaleDownCooldownSeconds: types.Int32Null(), CompositeFormula: types.StringNull(), @@ -1060,15 +1166,6 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigModel { if p.MaxReplicas != nil { m.MaxReplicas = types.Int32Value(*p.MaxReplicas) } - if p.TargetUtilization != nil { - m.TargetUtilization = types.Float32Value(*p.TargetUtilization) - } - if p.TargetMemoryUtilization != nil { - m.TargetMemoryUtilization = types.Float32Value(*p.TargetMemoryUtilization) - } - if p.PrimaryMetric != nil { - m.PrimaryMetric = types.StringValue(wrHPAMetricFromProto(*p.PrimaryMetric)) - } if p.MaxReplicaChangePercent != nil { m.MaxReplicaChangePercent = types.Float32Value(*p.MaxReplicaChangePercent) } @@ -1090,42 +1187,6 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigModel { return m } -func wrHPAMetricToProto(metric string) *apiv1.HPAMetricType { - var m apiv1.HPAMetricType - switch metric { - case "cpu": - m = apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU - case "memory": - m = apiv1.HPAMetricType_HPA_METRIC_TYPE_MEMORY - case "gpu": - m = apiv1.HPAMetricType_HPA_METRIC_TYPE_GPU - case "network_ingress": - m = apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_INGRESS - case "network_egress": - m = apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_EGRESS - default: - return nil - } - return &m -} - -func wrHPAMetricFromProto(metric apiv1.HPAMetricType) string { - switch metric { - case apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU: - return "cpu" - case apiv1.HPAMetricType_HPA_METRIC_TYPE_MEMORY: - return "memory" - case apiv1.HPAMetricType_HPA_METRIC_TYPE_GPU: - return "gpu" - case apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_INGRESS: - return "network_ingress" - case apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_EGRESS: - return "network_egress" - default: - return "" - } -} - // ---------- EmergencyResponse ---------- func (m *EmergencyResponseModel) toProto() *apiv1.EmergencyResponseConfig { @@ -1160,12 +1221,12 @@ func emergencyResponseFromProto(p *apiv1.EmergencyResponseConfig) *EmergencyResp } return &EmergencyResponseModel{ OomEnabled: types.BoolValue(p.OomEnabled), - OomMemoryMultiplier: types.Float32Value(p.OomMemoryMultiplier), + OomMemoryMultiplier: float32OrNull(p.OomMemoryMultiplier), OomMaxReactions: types.Int32Value(p.OomMaxReactions), OomCooldownSeconds: types.Int32Value(p.OomCooldownSeconds), CpuThrottlingEnabled: types.BoolValue(p.CpuThrottlingEnabled), - CpuThrottlingThreshold: types.Float32Value(p.CpuThrottlingThreshold), - CpuThrottlingMultiplier: types.Float32Value(p.CpuThrottlingMultiplier), + CpuThrottlingThreshold: float32OrNull(p.CpuThrottlingThreshold), + CpuThrottlingMultiplier: float32OrNull(p.CpuThrottlingMultiplier), } } @@ -1228,6 +1289,8 @@ func (m *ContainerResourceConfigModel) toProto() *apiv1.ContainerResourceConfig v := m.TargetPercentile.ValueFloat32() p.TargetPercentile = &v } + p.RequestUseRss = m.RequestUseRss.ValueBoolPointer() + p.LimitUseRss = m.LimitUseRss.ValueBoolPointer() return p } @@ -1243,6 +1306,8 @@ func containerResourceConfigFromProto(p *apiv1.ContainerResourceConfig) *Contain MaxRequest: types.Int64Null(), LimitMultiplier: types.Float32Null(), TargetPercentile: types.Float32Null(), + RequestUseRss: types.BoolPointerValue(p.RequestUseRss), + LimitUseRss: types.BoolPointerValue(p.LimitUseRss), } if p.MinRequest != nil { m.MinRequest = types.Int64Value(*p.MinRequest) @@ -1294,6 +1359,10 @@ func hpaMetricTriggersToProto(ms []HPAMetricTriggerModel) []*apiv1.HPAMetricTrig v := m.Query.ValueString() t.Query = &v } + if !m.ConnectorId.IsNull() && !m.ConnectorId.IsUnknown() { + v := m.ConnectorId.ValueString() + t.ConnectorId = &v + } result[i] = t } return result @@ -1313,6 +1382,7 @@ func hpaMetricTriggersFromProto(ps []*apiv1.HPAMetricTrigger) []HPAMetricTrigger Metadata: types.MapNull(types.StringType), ServerAddress: types.StringNull(), Query: types.StringNull(), + ConnectorId: types.StringNull(), } if p.TargetUtilization != nil { m.TargetUtilization = types.StringValue(*p.TargetUtilization) @@ -1323,15 +1393,28 @@ func hpaMetricTriggersFromProto(ps []*apiv1.HPAMetricTrigger) []HPAMetricTrigger if p.Weight != nil { m.Weight = types.StringValue(*p.Weight) } - if len(p.Metadata) > 0 { - m.Metadata = types.MapValueMust(types.StringType, fromStringMap(p.Metadata)) + // The backend folds server_address/query into metadata["serverAddress"/"query"] + // on write and re-derives the dedicated fields on read. Strip the folded keys + // so metadata reflects only what the user configured. + metadata := make(map[string]string, len(p.Metadata)) + for k, v := range p.Metadata { + if k == "serverAddress" || k == "query" { + continue + } + metadata[k] = v } - if p.ServerAddress != nil { + if len(metadata) > 0 { + m.Metadata = types.MapValueMust(types.StringType, fromStringMap(metadata)) + } + if p.ServerAddress != nil && *p.ServerAddress != "" { m.ServerAddress = types.StringValue(*p.ServerAddress) } - if p.Query != nil { + if p.Query != nil && *p.Query != "" { m.Query = types.StringValue(*p.Query) } + if p.ConnectorId != nil && *p.ConnectorId != "" { + m.ConnectorId = types.StringValue(*p.ConnectorId) + } result = append(result, m) } return result @@ -1359,8 +1442,8 @@ func hpaFallbackFromProto(p *apiv1.HPAFallback) *HPAFallbackModel { } return &HPAFallbackModel{ Replicas: types.Int32Value(p.Replicas), - Behavior: types.StringValue(p.Behavior), - FailureThreshold: types.Int32Value(p.FailureThreshold), + Behavior: stringValue(p.Behavior), + FailureThreshold: int32OrNull(p.FailureThreshold), } } @@ -1407,8 +1490,8 @@ func hpaScalingRulesFromProto(p *apiv1.HPAScalingRules) *HPAScalingRulesModel { return nil } m := &HPAScalingRulesModel{ - StabilizationWindowSeconds: types.Int32Value(p.StabilizationWindowSeconds), - SelectPolicy: types.StringValue(p.SelectPolicy), + StabilizationWindowSeconds: int32OrNull(p.StabilizationWindowSeconds), + SelectPolicy: stringValue(p.SelectPolicy), } for _, pol := range p.Policies { if pol == nil { @@ -1422,3 +1505,20 @@ func hpaScalingRulesFromProto(p *apiv1.HPAScalingRules) *HPAScalingRulesModel { } return m } + +// float32OrNull returns null for the proto zero value so omitted optional +// attributes round-trip as null instead of producing an +// "inconsistent result after apply" error. +func float32OrNull(v float32) types.Float32 { + if v == 0 { + return types.Float32Null() + } + return types.Float32Value(v) +} + +func int32OrNull(v int32) types.Int32 { + if v == 0 { + return types.Int32Null() + } + return types.Int32Value(v) +} diff --git a/internal/provider/workload_rule_test.go b/internal/provider/workload_rule_test.go index 9b4c9ca..80254cc 100644 --- a/internal/provider/workload_rule_test.go +++ b/internal/provider/workload_rule_test.go @@ -255,8 +255,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { Enabled: types.BoolValue(true), MinReplicas: types.Int32Value(2), MaxReplicas: types.Int32Value(10), - TargetUtilization: types.Float32Value(0.7), - PrimaryMetric: types.StringValue("cpu"), MaxReplicaChangePercent: types.Float32Value(50.0), } @@ -273,12 +271,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { if p.MaxReplicas == nil || *p.MaxReplicas != 10 { t.Errorf("Expected MaxReplicas=10, got %v", p.MaxReplicas) } - if p.TargetUtilization == nil || *p.TargetUtilization != 0.7 { - t.Errorf("Expected TargetUtilization=0.7, got %v", p.TargetUtilization) - } - if p.PrimaryMetric == nil || *p.PrimaryMetric != apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU { - t.Errorf("Expected PrimaryMetric=CPU, got %v", p.PrimaryMetric) - } if p.MaxReplicaChangePercent == nil || *p.MaxReplicaChangePercent != 50.0 { t.Errorf("Expected MaxReplicaChangePercent=50.0, got %v", p.MaxReplicaChangePercent) } @@ -294,16 +286,12 @@ func TestWorkloadRuleResourceModel(t *testing.T) { t.Run("HPARuleConfigFromProto_AllFields", func(t *testing.T) { minR := int32(2) maxR := int32(10) - util := float32(0.7) - metric := apiv1.HPAMetricType_HPA_METRIC_TYPE_MEMORY maxChange := float32(50.0) p := &apiv1.HPARuleConfig{ Enabled: true, MinReplicas: &minR, MaxReplicas: &maxR, - TargetUtilization: &util, - PrimaryMetric: &metric, MaxReplicaChangePercent: &maxChange, } @@ -320,12 +308,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { if m.MaxReplicas.ValueInt32() != 10 { t.Errorf("Expected MaxReplicas=10, got %d", m.MaxReplicas.ValueInt32()) } - if m.TargetUtilization.ValueFloat32() != 0.7 { - t.Errorf("Expected TargetUtilization=0.7, got %f", m.TargetUtilization.ValueFloat32()) - } - if m.PrimaryMetric.ValueString() != "memory" { - t.Errorf("Expected PrimaryMetric='memory', got %s", m.PrimaryMetric.ValueString()) - } if m.MaxReplicaChangePercent.ValueFloat32() != 50.0 { t.Errorf("Expected MaxReplicaChangePercent=50.0, got %f", m.MaxReplicaChangePercent.ValueFloat32()) } @@ -343,9 +325,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { Enabled: types.BoolValue(true), MinReplicas: types.Int32Value(1), MaxReplicas: types.Int32Value(5), - TargetUtilization: types.Float32Value(0.7), - TargetMemoryUtilization: types.Float32Value(0.8), - PrimaryMetric: types.StringValue("cpu"), MaxReplicaChangePercent: types.Float32Null(), ScaleDownCooldownSeconds: types.Int32Value(300), CompositeFormula: types.StringValue(formula), @@ -389,9 +368,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { if p == nil { t.Fatal("Expected non-nil proto") } - if p.TargetMemoryUtilization == nil || *p.TargetMemoryUtilization != 0.8 { - t.Errorf("Expected TargetMemoryUtilization=0.8, got %v", p.TargetMemoryUtilization) - } if p.ScaleDownCooldownSeconds == nil || *p.ScaleDownCooldownSeconds != 300 { t.Errorf("Expected ScaleDownCooldownSeconds=300, got %v", p.ScaleDownCooldownSeconds) } @@ -449,7 +425,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { }) t.Run("HPARuleConfigFromProto_NewFields", func(t *testing.T) { - memUtil := float32(0.8) cooldown := int32(300) formula := "0.6*cpu + 0.4*memory" targetVal := "100" @@ -457,7 +432,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { p := &apiv1.HPARuleConfig{ Enabled: true, - TargetMemoryUtilization: &memUtil, ScaleDownCooldownSeconds: &cooldown, CompositeFormula: &formula, Metrics: []*apiv1.HPAMetricTrigger{ @@ -486,9 +460,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { if m == nil { t.Fatal("Expected non-nil model") } - if m.TargetMemoryUtilization.ValueFloat32() != 0.8 { - t.Errorf("Expected TargetMemoryUtilization=0.8, got %f", m.TargetMemoryUtilization.ValueFloat32()) - } if m.ScaleDownCooldownSeconds.ValueInt32() != 300 { t.Errorf("Expected ScaleDownCooldownSeconds=300, got %d", m.ScaleDownCooldownSeconds.ValueInt32()) } @@ -579,56 +550,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { } }) - // ---------- HPA metric conversions ---------- - - t.Run("HPAMetricToProto", func(t *testing.T) { - cases := []struct { - input string - expected apiv1.HPAMetricType - }{ - {"cpu", apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU}, - {"memory", apiv1.HPAMetricType_HPA_METRIC_TYPE_MEMORY}, - {"gpu", apiv1.HPAMetricType_HPA_METRIC_TYPE_GPU}, - {"network_ingress", apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_INGRESS}, - {"network_egress", apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_EGRESS}, - } - for _, tc := range cases { - result := wrHPAMetricToProto(tc.input) - if result == nil { - t.Errorf("Expected non-nil for %q", tc.input) - continue - } - if *result != tc.expected { - t.Errorf("Input %q: expected %v, got %v", tc.input, tc.expected, *result) - } - } - if wrHPAMetricToProto("unknown") != nil { - t.Error("Expected nil for unknown metric") - } - }) - - t.Run("HPAMetricFromProto", func(t *testing.T) { - cases := []struct { - input apiv1.HPAMetricType - expected string - }{ - {apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU, "cpu"}, - {apiv1.HPAMetricType_HPA_METRIC_TYPE_MEMORY, "memory"}, - {apiv1.HPAMetricType_HPA_METRIC_TYPE_GPU, "gpu"}, - {apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_INGRESS, "network_ingress"}, - {apiv1.HPAMetricType_HPA_METRIC_TYPE_NETWORK_EGRESS, "network_egress"}, - } - for _, tc := range cases { - result := wrHPAMetricFromProto(tc.input) - if result != tc.expected { - t.Errorf("Input %v: expected %q, got %q", tc.input, tc.expected, result) - } - } - if wrHPAMetricFromProto(apiv1.HPAMetricType_HPA_METRIC_TYPE_UNSPECIFIED) != "" { - t.Error("Expected empty string for unspecified metric") - } - }) - // ---------- EmergencyResponseModel ---------- t.Run("EmergencyResponseModel_ToProto", func(t *testing.T) { @@ -938,7 +859,7 @@ func TestWorkloadRuleResourceModel(t *testing.T) { UseInPlaceVerticalScaling: types.BoolValue(false), } - req := m.toProto(ctx, &diags, "team-123") + req := m.toProto(ctx, &diags, "team-123", true) if diags.HasError() { t.Fatalf("Unexpected error: %v", diags) } @@ -1014,7 +935,7 @@ func TestWorkloadRuleResourceModel(t *testing.T) { Containers: nil, } - req := m.toProto(ctx, &diags, "team-456") + req := m.toProto(ctx, &diags, "team-456", true) if diags.HasError() { t.Fatalf("Unexpected error: %v", diags) } @@ -1401,11 +1322,9 @@ func TestWorkloadRuleResourceModel(t *testing.T) { Name: types.StringValue("my-app"), AutoGenerate: types.BoolValue(false), HpaRule: &HPARuleConfigModel{ - Enabled: types.BoolValue(true), - MinReplicas: types.Int32Value(2), - MaxReplicas: types.Int32Value(10), - TargetUtilization: types.Float32Value(0.7), - PrimaryMetric: types.StringValue("cpu"), + Enabled: types.BoolValue(true), + MinReplicas: types.Int32Value(2), + MaxReplicas: types.Int32Value(10), }, CpuRule: nil, MemoryRule: nil, @@ -1422,7 +1341,7 @@ func TestWorkloadRuleResourceModel(t *testing.T) { UseInPlaceVerticalScaling: types.BoolValue(false), } - req := m.toProto(ctx, &diags, "team-123") + req := m.toProto(ctx, &diags, "team-123", true) if diags.HasError() { t.Fatalf("Unexpected error: %v", diags) } @@ -1461,8 +1380,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { t.Run("WorkloadRuleResourceModel_FromProto_WithHpaRule", func(t *testing.T) { minR := int32(2) maxR := int32(10) - util := float32(0.7) - metric := apiv1.HPAMetricType_HPA_METRIC_TYPE_CPU r := &apiv1.WorkloadRule{ RuleId: "rule-hpa", @@ -1472,11 +1389,9 @@ func TestWorkloadRuleResourceModel(t *testing.T) { Name: "my-app", CurrentSource: "manual", HpaRule: &apiv1.HPARuleConfig{ - Enabled: true, - MinReplicas: &minR, - MaxReplicas: &maxR, - TargetUtilization: &util, - PrimaryMetric: &metric, + Enabled: true, + MinReplicas: &minR, + MaxReplicas: &maxR, }, } @@ -1495,12 +1410,6 @@ func TestWorkloadRuleResourceModel(t *testing.T) { if m.HpaRule.MaxReplicas.ValueInt32() != 10 { t.Errorf("Expected MaxReplicas=10, got %d", m.HpaRule.MaxReplicas.ValueInt32()) } - if m.HpaRule.TargetUtilization.ValueFloat32() != 0.7 { - t.Errorf("Expected TargetUtilization=0.7, got %f", m.HpaRule.TargetUtilization.ValueFloat32()) - } - if m.HpaRule.PrimaryMetric.ValueString() != "cpu" { - t.Errorf("Expected PrimaryMetric='cpu', got %s", m.HpaRule.PrimaryMetric.ValueString()) - } }) // ---------- Source field (terraform_manual / terraform_auto) ---------- @@ -1526,7 +1435,7 @@ func TestWorkloadRuleResourceModel(t *testing.T) { UseInPlaceVerticalScaling: types.BoolValue(false), } - req := m.toProto(ctx, &diags, "team-1") + req := m.toProto(ctx, &diags, "team-1", true) if diags.HasError() { t.Fatalf("Unexpected error: %v", diags) } @@ -1556,7 +1465,7 @@ func TestWorkloadRuleResourceModel(t *testing.T) { UseInPlaceVerticalScaling: types.BoolValue(false), } - req := m.toProto(ctx, &diags, "team-1") + req := m.toProto(ctx, &diags, "team-1", true) if diags.HasError() { t.Fatalf("Unexpected error: %v", diags) }