diff --git a/.gitignore b/.gitignore index 7ef5054..f97afcc 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,7 @@ Pulumi.*.yaml docs/plans examples/python/ examples/typescript/node_modules/ -example-local-test/ \ No newline at end of file +example-local-test/ +# Never commit ad-hoc API scratch files (may contain tokens) +curl.txt +*.curl diff --git a/Makefile b/Makefile index 05d3b21..cc887f5 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ SDK_GO := sdk/go # VERSION is injected into the provider binary via ldflags. Falls back to # the latest git tag (stripped of a leading `v`), or "dev" when no tags exist. GIT_TAG := $(shell git describe --tags --abbrev=0 --match "v[0-9]*" 2>/dev/null) -VERSION ?= $(if $(GIT_TAG),$(patsubst v%,%,$(GIT_TAG)),dev) +VERSION ?= $(if $(GIT_TAG),$(patsubst v%,%,$(GIT_TAG)),0.0.0-dev) LDFLAGS := -ldflags "-X main.version=$(VERSION)" # Proto sync settings — override with: make proto SERVICES_DIR=/path/to/services @@ -24,8 +24,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 OLD_IMPORT = github.com/devzero-inc/services/dakr/gen/api/v1 diff --git a/internal/gen/api/v1/apiv1connect/k8s.connect.go b/internal/gen/api/v1/apiv1connect/k8s.connect.go index 1e5ce29..f3e67fc 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 a8a4868..7bf5a1c 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 79a55df..38d1198 100644 --- a/internal/gen/api/v1/apiv1connect/recommendation.connect.go +++ b/internal/gen/api/v1/apiv1connect/recommendation.connect.go @@ -203,21 +203,66 @@ 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" // K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure is the fully-qualified name // of the K8sRecommendationService's GenerateNodePoliciesFromNodeGroups RPC. K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure = "/api.v1.K8sRecommendationService/GenerateNodePoliciesFromNodeGroups" + // K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure is the fully-qualified name of the + // K8sRecommendationService's GetNodeGroupsCheckpointStatus RPC. + K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure = "/api.v1.K8sRecommendationService/GetNodeGroupsCheckpointStatus" + // K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure is the fully-qualified name of the + // K8sRecommendationService's SetNodePolicyCheckpointLabel RPC. + K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure = "/api.v1.K8sRecommendationService/SetNodePolicyCheckpointLabel" + // K8SRecommendationServiceEnableCheckpointForPolicyProcedure is the fully-qualified name of the + // K8sRecommendationService's EnableCheckpointForPolicy RPC. + K8SRecommendationServiceEnableCheckpointForPolicyProcedure = "/api.v1.K8sRecommendationService/EnableCheckpointForPolicy" + // 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" @@ -245,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" @@ -263,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" @@ -326,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" @@ -356,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. @@ -467,18 +653,84 @@ 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) // GenerateNodePoliciesFromNodeGroups generates NodePolicy objects by inspecting // k8s_nodes metadata for clusters without Karpenter/dzkarp. GenerateNodePoliciesFromNodeGroups(context.Context, *connect.Request[v1.GenerateNodePoliciesFromNodeGroupsRequest]) (*connect.Response[v1.GenerateNodePoliciesFromNodeGroupsResponse], error) + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // 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) @@ -489,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 @@ -497,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) @@ -525,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) @@ -536,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 @@ -832,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, @@ -842,11 +1178,46 @@ func NewK8SRecommendationServiceClient(httpClient connect.HTTPClient, baseURL st baseURL+K8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsProcedure, opts..., ), + getNodeGroupsCheckpointStatus: connect.NewClient[v1.GetNodeGroupsCheckpointStatusRequest, v1.GetNodeGroupsCheckpointStatusResponse]( + httpClient, + baseURL+K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure, + opts..., + ), + setNodePolicyCheckpointLabel: connect.NewClient[v1.SetNodePolicyCheckpointLabelRequest, v1.SetNodePolicyCheckpointLabelResponse]( + httpClient, + baseURL+K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure, + opts..., + ), + enableCheckpointForPolicy: connect.NewClient[v1.EnableCheckpointForPolicyRequest, v1.EnableCheckpointForPolicyResponse]( + httpClient, + baseURL+K8SRecommendationServiceEnableCheckpointForPolicyProcedure, + opts..., + ), + getCheckpointApplyStatus: connect.NewClient[v1.GetCheckpointApplyStatusRequest, v1.GetCheckpointApplyStatusResponse]( + httpClient, + 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, @@ -857,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, @@ -902,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, @@ -932,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, @@ -1037,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, @@ -1087,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, @@ -1097,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..., + ), } } @@ -1163,11 +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] @@ -1177,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] @@ -1204,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] @@ -1214,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. @@ -1562,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) { @@ -1574,11 +2278,49 @@ func (c *k8SRecommendationServiceClient) GenerateNodePoliciesFromNodeGroups(ctx return c.generateNodePoliciesFromNodeGroups.CallUnary(ctx, req) } +// GetNodeGroupsCheckpointStatus calls +// api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus. +func (c *k8SRecommendationServiceClient) GetNodeGroupsCheckpointStatus(ctx context.Context, req *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) { + return c.getNodeGroupsCheckpointStatus.CallUnary(ctx, req) +} + +// SetNodePolicyCheckpointLabel calls api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel. +func (c *k8SRecommendationServiceClient) SetNodePolicyCheckpointLabel(ctx context.Context, req *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) { + return c.setNodePolicyCheckpointLabel.CallUnary(ctx, req) +} + +// EnableCheckpointForPolicy calls api.v1.K8sRecommendationService.EnableCheckpointForPolicy. +func (c *k8SRecommendationServiceClient) EnableCheckpointForPolicy(ctx context.Context, req *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) { + return c.enableCheckpointForPolicy.CallUnary(ctx, req) +} + +// GetCheckpointApplyStatus calls api.v1.K8sRecommendationService.GetCheckpointApplyStatus. +func (c *k8SRecommendationServiceClient) GetCheckpointApplyStatus(ctx context.Context, req *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) { + 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) @@ -1589,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) @@ -1635,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) @@ -1667,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) { @@ -1785,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) @@ -1837,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) @@ -1847,12 +2709,178 @@ 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 +// 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 @@ -1953,18 +2981,84 @@ 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) // GenerateNodePoliciesFromNodeGroups generates NodePolicy objects by inspecting // k8s_nodes metadata for clusters without Karpenter/dzkarp. GenerateNodePoliciesFromNodeGroups(context.Context, *connect.Request[v1.GenerateNodePoliciesFromNodeGroupsRequest]) (*connect.Response[v1.GenerateNodePoliciesFromNodeGroupsResponse], error) + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // 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) @@ -1975,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 @@ -1983,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) @@ -2011,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) @@ -2022,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 @@ -2314,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, @@ -2324,11 +3502,46 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GenerateNodePoliciesFromNodeGroups, opts..., ) + k8SRecommendationServiceGetNodeGroupsCheckpointStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure, + svc.GetNodeGroupsCheckpointStatus, + opts..., + ) + k8SRecommendationServiceSetNodePolicyCheckpointLabelHandler := connect.NewUnaryHandler( + K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure, + svc.SetNodePolicyCheckpointLabel, + opts..., + ) + k8SRecommendationServiceEnableCheckpointForPolicyHandler := connect.NewUnaryHandler( + K8SRecommendationServiceEnableCheckpointForPolicyProcedure, + svc.EnableCheckpointForPolicy, + opts..., + ) + k8SRecommendationServiceGetCheckpointApplyStatusHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetCheckpointApplyStatusProcedure, + 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, @@ -2339,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, @@ -2384,6 +3627,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetInstanceCategories, opts..., ) + k8SRecommendationServiceGetInstanceShapesHandler := connect.NewUnaryHandler( + K8SRecommendationServiceGetInstanceShapesProcedure, + svc.GetInstanceShapes, + opts..., + ) k8SRecommendationServiceGetInstanceCPUsHandler := connect.NewUnaryHandler( K8SRecommendationServiceGetInstanceCPUsProcedure, svc.GetInstanceCPUs, @@ -2414,6 +3662,11 @@ func NewK8SRecommendationServiceHandler(svc K8SRecommendationServiceHandler, opt svc.GetPDBRecommendationForWorkload, opts..., ) + k8SRecommendationServiceListWorkloadStructuralHealthHandler := connect.NewUnaryHandler( + K8SRecommendationServiceListWorkloadStructuralHealthProcedure, + svc.ListWorkloadStructuralHealth, + opts..., + ) k8SRecommendationServiceCreateStorageRecommendationPolicyHandler := connect.NewUnaryHandler( K8SRecommendationServiceCreateStorageRecommendationPolicyProcedure, svc.CreateStorageRecommendationPolicy, @@ -2519,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, @@ -2569,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, @@ -2579,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: @@ -2698,16 +4171,46 @@ 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: k8SRecommendationServiceGenerateNodePoliciesFromNodeGroupsHandler.ServeHTTP(w, r) + case K8SRecommendationServiceGetNodeGroupsCheckpointStatusProcedure: + k8SRecommendationServiceGetNodeGroupsCheckpointStatusHandler.ServeHTTP(w, r) + case K8SRecommendationServiceSetNodePolicyCheckpointLabelProcedure: + k8SRecommendationServiceSetNodePolicyCheckpointLabelHandler.ServeHTTP(w, r) + case K8SRecommendationServiceEnableCheckpointForPolicyProcedure: + 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: @@ -2726,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: @@ -2738,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: @@ -2780,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: @@ -2800,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) } @@ -3039,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")) } @@ -3047,10 +4650,38 @@ func (UnimplementedK8SRecommendationServiceHandler) GenerateNodePoliciesFromNode return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups is not implemented")) } +func (UnimplementedK8SRecommendationServiceHandler) GetNodeGroupsCheckpointStatus(context.Context, *connect.Request[v1.GetNodeGroupsCheckpointStatusRequest]) (*connect.Response[v1.GetNodeGroupsCheckpointStatusResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.GetNodeGroupsCheckpointStatus is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) SetNodePolicyCheckpointLabel(context.Context, *connect.Request[v1.SetNodePolicyCheckpointLabelRequest]) (*connect.Response[v1.SetNodePolicyCheckpointLabelResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.SetNodePolicyCheckpointLabel is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) EnableCheckpointForPolicy(context.Context, *connect.Request[v1.EnableCheckpointForPolicyRequest]) (*connect.Response[v1.EnableCheckpointForPolicyResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.K8sRecommendationService.EnableCheckpointForPolicy is not implemented")) +} + +func (UnimplementedK8SRecommendationServiceHandler) GetCheckpointApplyStatus(context.Context, *connect.Request[v1.GetCheckpointApplyStatusRequest]) (*connect.Response[v1.GetCheckpointApplyStatusResponse], error) { + 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")) } @@ -3059,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")) } @@ -3095,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")) } @@ -3119,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")) } @@ -3203,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")) } @@ -3243,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")) } @@ -3251,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 1eb7c9f..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,379 @@ 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. +type NodeGroupCheckpointState int32 + +const ( + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED NodeGroupCheckpointState = 0 + // Node group is not DevZero/dzkarp-managed (no matching node policy node + // pool). Customer is responsible for adding the checkpoint-node label. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED NodeGroupCheckpointState = 1 + // dz-managed (matches a policy's node pool) but no active node policy + // target for this cluster. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY NodeGroupCheckpointState = 2 + // dz-managed + active policy, but the policy lacks the + // dakr.devzero.io/checkpoint-node label. Eligible for the one-click CTA. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL NodeGroupCheckpointState = 3 + // dz-managed + active policy + label present. Intent declared; actual CRIU + // capability not (yet) verified. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_CONFIGURED NodeGroupCheckpointState = 4 + // CONFIGURED and CRIU verified present on the node group's nodes. + NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_ENABLED NodeGroupCheckpointState = 5 +) + +// Enum value maps for NodeGroupCheckpointState. +var ( + NodeGroupCheckpointState_name = map[int32]string{ + 0: "NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED", + 1: "NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED", + 2: "NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY", + 3: "NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL", + 4: "NODE_GROUP_CHECKPOINT_STATE_CONFIGURED", + 5: "NODE_GROUP_CHECKPOINT_STATE_ENABLED", + } + NodeGroupCheckpointState_value = map[string]int32{ + "NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED": 0, + "NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED": 1, + "NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY": 2, + "NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL": 3, + "NODE_GROUP_CHECKPOINT_STATE_CONFIGURED": 4, + "NODE_GROUP_CHECKPOINT_STATE_ENABLED": 5, + } +) + +func (x NodeGroupCheckpointState) Enum() *NodeGroupCheckpointState { + p := new(NodeGroupCheckpointState) + *p = x + return p +} + +func (x NodeGroupCheckpointState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NodeGroupCheckpointState) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() +} + +func (NodeGroupCheckpointState) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[10] +} + +func (x NodeGroupCheckpointState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NodeGroupCheckpointState.Descriptor instead. +func (NodeGroupCheckpointState) EnumDescriptor() ([]byte, []int) { + 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 @@ -345,11 +1018,11 @@ func (x TargetFilterType) String() string { } func (TargetFilterType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[5].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[16].Descriptor() } func (TargetFilterType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[5] + return &file_api_v1_recommendation_proto_enumTypes[16] } func (x TargetFilterType) Number() protoreflect.EnumNumber { @@ -358,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{5} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{16} } type InstanceStorePolicy int32 @@ -388,11 +1061,11 @@ func (x InstanceStorePolicy) String() string { } func (InstanceStorePolicy) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[6].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[17].Descriptor() } func (InstanceStorePolicy) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[6] + return &file_api_v1_recommendation_proto_enumTypes[17] } func (x InstanceStorePolicy) Number() protoreflect.EnumNumber { @@ -401,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{6} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{17} } type ActionTrigger int32 @@ -440,11 +1113,11 @@ func (x ActionTrigger) String() string { } func (ActionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[7].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[18].Descriptor() } func (ActionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[7] + return &file_api_v1_recommendation_proto_enumTypes[18] } func (x ActionTrigger) Number() protoreflect.EnumNumber { @@ -453,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{7} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{18} } type WorkloadDetectionTrigger int32 @@ -492,11 +1165,11 @@ func (x WorkloadDetectionTrigger) String() string { } func (WorkloadDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[8].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[19].Descriptor() } func (WorkloadDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[8] + return &file_api_v1_recommendation_proto_enumTypes[19] } func (x WorkloadDetectionTrigger) Number() protoreflect.EnumNumber { @@ -505,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{8} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{19} } type NodeGroupDetectionTrigger int32 @@ -538,11 +1211,11 @@ func (x NodeGroupDetectionTrigger) String() string { } func (NodeGroupDetectionTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[9].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[20].Descriptor() } func (NodeGroupDetectionTrigger) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[9] + return &file_api_v1_recommendation_proto_enumTypes[20] } func (x NodeGroupDetectionTrigger) Number() protoreflect.EnumNumber { @@ -551,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{9} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{20} } type NodeGroupActionsAllowed int32 @@ -596,11 +1269,11 @@ func (x NodeGroupActionsAllowed) String() string { } func (NodeGroupActionsAllowed) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[10].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[21].Descriptor() } func (NodeGroupActionsAllowed) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[10] + return &file_api_v1_recommendation_proto_enumTypes[21] } func (x NodeGroupActionsAllowed) Number() protoreflect.EnumNumber { @@ -609,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{10} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{21} } type RecommendationMode int32 @@ -648,11 +1321,11 @@ func (x RecommendationMode) String() string { } func (RecommendationMode) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[11].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[22].Descriptor() } func (RecommendationMode) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[11] + return &file_api_v1_recommendation_proto_enumTypes[22] } func (x RecommendationMode) Number() protoreflect.EnumNumber { @@ -661,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{11} + 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, } ) @@ -712,11 +1397,11 @@ func (x RecommendationType) String() string { } func (RecommendationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[12].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[23].Descriptor() } func (RecommendationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[12] + return &file_api_v1_recommendation_proto_enumTypes[23] } func (x RecommendationType) Number() protoreflect.EnumNumber { @@ -725,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{12} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{23} } type HPAMetricType int32 @@ -770,11 +1455,11 @@ func (x HPAMetricType) String() string { } func (HPAMetricType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[13].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[24].Descriptor() } func (HPAMetricType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[13] + return &file_api_v1_recommendation_proto_enumTypes[24] } func (x HPAMetricType) Number() protoreflect.EnumNumber { @@ -783,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{13} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{24} } type PvcOperationType int32 @@ -819,11 +1504,11 @@ func (x PvcOperationType) String() string { } func (PvcOperationType) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[14].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[25].Descriptor() } func (PvcOperationType) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[14] + return &file_api_v1_recommendation_proto_enumTypes[25] } func (x PvcOperationType) Number() protoreflect.EnumNumber { @@ -832,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{14} + 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. @@ -891,11 +1755,11 @@ func (x WorkloadRuleSource) String() string { } func (WorkloadRuleSource) Descriptor() protoreflect.EnumDescriptor { - return file_api_v1_recommendation_proto_enumTypes[15].Descriptor() + return file_api_v1_recommendation_proto_enumTypes[29].Descriptor() } func (WorkloadRuleSource) Type() protoreflect.EnumType { - return &file_api_v1_recommendation_proto_enumTypes[15] + return &file_api_v1_recommendation_proto_enumTypes[29] } func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { @@ -904,80 +1768,352 @@ func (x WorkloadRuleSource) Number() protoreflect.EnumNumber { // Deprecated: Use WorkloadRuleSource.Descriptor instead. func (WorkloadRuleSource) EnumDescriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{15} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{29} } -type GetRecommendationsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// 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 - 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"` - ExcludeStatuses []string `protobuf:"bytes,3,rep,name=exclude_statuses,json=excludeStatuses,proto3" json:"exclude_statuses,omitempty"` - Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` - IncludeDeletedPolicies bool `protobuf:"varint,5,opt,name=include_deleted_policies,json=includeDeletedPolicies,proto3" json:"include_deleted_policies,omitempty"` - StartTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` - EndTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` - 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 - Pagination *Pagination `protobuf:"bytes,32,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` // Optional pagination parameters -} +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 +) -func (x *GetRecommendationsRequest) Reset() { - *x = GetRecommendationsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// 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 *GetRecommendationsRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x NodeCheckpointLabelState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (*GetRecommendationsRequest) ProtoMessage() {} +func (NodeCheckpointLabelState) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_recommendation_proto_enumTypes[30].Descriptor() +} -func (x *GetRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_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) +func (NodeCheckpointLabelState) Type() protoreflect.EnumType { + return &file_api_v1_recommendation_proto_enumTypes[30] } -// Deprecated: Use GetRecommendationsRequest.ProtoReflect.Descriptor instead. -func (*GetRecommendationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{0} +func (x NodeCheckpointLabelState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -func (x *GetRecommendationsRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use NodeCheckpointLabelState.Descriptor instead. +func (NodeCheckpointLabelState) EnumDescriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{30} } -func (x *GetRecommendationsRequest) GetTeamId() string { - if x != nil { - return x.TeamId +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", } - return "" + 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 *GetRecommendationsRequest) GetExcludeStatuses() []string { - if x != nil { - return x.ExcludeStatuses - } - return nil +func (x ForensicPostSnapshotAction) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *GetRecommendationsRequest) GetNamespaces() []string { - if x != nil { +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 { + 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"` + ExcludeStatuses []string `protobuf:"bytes,3,rep,name=exclude_statuses,json=excludeStatuses,proto3" json:"exclude_statuses,omitempty"` + Namespaces []string `protobuf:"bytes,4,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + IncludeDeletedPolicies bool `protobuf:"varint,5,opt,name=include_deleted_policies,json=includeDeletedPolicies,proto3" json:"include_deleted_policies,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=start_time,json=startTime,proto3,oneof" json:"start_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,17,opt,name=end_time,json=endTime,proto3,oneof" json:"end_time,omitempty"` + 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 + Pagination *Pagination `protobuf:"bytes,32,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` // Optional pagination parameters +} + +func (x *GetRecommendationsRequest) Reset() { + *x = GetRecommendationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRecommendationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRecommendationsRequest) ProtoMessage() {} + +func (x *GetRecommendationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_recommendation_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 GetRecommendationsRequest.ProtoReflect.Descriptor instead. +func (*GetRecommendationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{0} +} + +func (x *GetRecommendationsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *GetRecommendationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *GetRecommendationsRequest) GetExcludeStatuses() []string { + if x != nil { + return x.ExcludeStatuses + } + return nil +} + +func (x *GetRecommendationsRequest) GetNamespaces() []string { + if x != nil { return x.Namespaces } return nil @@ -1903,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() { @@ -2001,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 @@ -2080,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() { @@ -2157,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 @@ -5009,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() { @@ -5160,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 @@ -5208,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"` } @@ -5337,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 @@ -5351,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 @@ -5645,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"` } @@ -5775,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 @@ -5789,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 @@ -6194,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() { @@ -6286,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 @@ -6300,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 @@ -6362,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() { @@ -6469,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 @@ -6483,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 @@ -6492,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) } @@ -6510,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 { @@ -6523,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 { @@ -6547,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 @@ -6563,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) } @@ -6576,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 { @@ -6589,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 { @@ -6648,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) } @@ -6661,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 { @@ -6674,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 { @@ -6772,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) } @@ -6785,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 { @@ -6798,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 { @@ -6868,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) } @@ -6881,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 { @@ -6894,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 { @@ -6916,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) } @@ -6929,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 { @@ -6942,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 { @@ -6970,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) } @@ -6983,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 { @@ -6996,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 { @@ -7020,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) } @@ -7033,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 { @@ -7046,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 { @@ -7088,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) } @@ -7101,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 { @@ -7114,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 { @@ -7142,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) } @@ -7155,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 { @@ -7168,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 { @@ -7238,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) } @@ -7251,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 { @@ -7264,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 { @@ -7286,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) } @@ -7299,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 { @@ -7312,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 { @@ -7342,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) } @@ -7355,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 { @@ -7368,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 { @@ -7403,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) } @@ -7416,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 { @@ -7429,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 { @@ -7448,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) } @@ -7461,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 { @@ -7474,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 { @@ -7490,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) } @@ -7503,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 { @@ -7516,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 { @@ -7551,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) } @@ -7564,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 { @@ -7577,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 { @@ -7601,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) } @@ -7614,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 { @@ -7627,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 { @@ -7669,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) } @@ -7682,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 { @@ -7695,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 { @@ -7716,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"` @@ -7725,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) } @@ -7738,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 { @@ -7751,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 { @@ -7789,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 @@ -7833,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"` @@ -7851,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() { } @@ -7877,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 } @@ -7884,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) } @@ -7897,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 { @@ -7910,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 { @@ -8018,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 @@ -8092,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() { } @@ -8134,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 @@ -8145,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) } @@ -8158,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 { @@ -8171,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 { @@ -8192,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) } @@ -8205,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 { @@ -8218,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 { @@ -8265,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) } @@ -8291,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 { @@ -8304,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 { @@ -8489,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 @@ -8524,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 @@ -8531,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 @@ -8551,12 +10048,57 @@ type ResourceRuleConfig struct { PmaxRatio *float32 `protobuf:"fixed32,12,opt,name=pmax_ratio,json=pmaxRatio,proto3,oneof" json:"pmax_ratio,omitempty"` // Whether to actively remove limits from workloads. LimitsRemovalEnabled bool `protobuf:"varint,13,opt,name=limits_removal_enabled,json=limitsRemovalEnabled,proto3" json:"limits_removal_enabled,omitempty"` + // Human-readable annotations from the engine: clamp messages, pmax / + // throttle / OOM floor activation, and "request exceeds existing limit" + // warnings. Surfaced through PreviewWorkloadRule so the UI can show why + // 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) } @@ -8569,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 { @@ -8582,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 { @@ -8676,6 +10218,76 @@ func (x *ResourceRuleConfig) GetLimitsRemovalEnabled() bool { return false } +func (x *ResourceRuleConfig) GetNotes() []string { + if x != nil { + return x.Notes + } + 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 @@ -8688,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) } @@ -8706,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 { @@ -8719,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 { @@ -8771,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 @@ -8785,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) } @@ -8798,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 { @@ -8811,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 { @@ -8852,12 +10472,24 @@ type ContainerResourceConfig struct { // Carried so the UI can surface profiling's per-container percentile // pick alongside the workload-level chip. TargetPercentile *float32 `protobuf:"fixed32,8,opt,name=target_percentile,json=targetPercentile,proto3,oneof" json:"target_percentile,omitempty"` + // 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) } @@ -8870,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 { @@ -8883,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 { @@ -8942,6 +10574,34 @@ func (x *ContainerResourceConfig) GetTargetPercentile() float32 { return 0 } +func (x *ContainerResourceConfig) GetNotes() []string { + if x != nil { + return x.Notes + } + 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 @@ -8957,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) } @@ -8970,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 { @@ -8983,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 { @@ -9014,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 @@ -9022,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) } @@ -9051,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 { @@ -9064,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 { @@ -9088,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 @@ -9144,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 @@ -9168,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) } @@ -9181,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 { @@ -9194,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 { @@ -9246,6 +10985,382 @@ func (x *EmergencyResponseConfig) GetCpuThrottlingMultiplier() float32 { return 0 } +// 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 + + 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 *KEDAScaledObjectTemplate) Reset() { + *x = KEDAScaledObjectTemplate{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[110] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAScaledObjectTemplate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAScaledObjectTemplate) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KEDAScaledObjectTemplate.ProtoReflect.Descriptor instead. +func (*KEDAScaledObjectTemplate) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} +} + +func (x *KEDAScaledObjectTemplate) GetTriggers() []*KEDATrigger { + if x != nil { + return x.Triggers + } + return nil +} + +func (x *KEDAScaledObjectTemplate) GetMinReplicaCount() int32 { + if x != nil && x.MinReplicaCount != nil { + return *x.MinReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetMaxReplicaCount() int32 { + if x != nil && x.MaxReplicaCount != nil { + return *x.MaxReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetIdleReplicaCount() int32 { + if x != nil && x.IdleReplicaCount != nil { + return *x.IdleReplicaCount + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetPollingInterval() int32 { + if x != nil && x.PollingInterval != nil { + return *x.PollingInterval + } + return 0 +} + +func (x *KEDAScaledObjectTemplate) GetCooldownPeriod() int32 { + if x != nil && x.CooldownPeriod != nil { + return *x.CooldownPeriod + } + return 0 +} + +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 + + 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 *KEDATrigger) Reset() { + *x = KEDATrigger{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[111] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDATrigger) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDATrigger) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KEDATrigger.ProtoReflect.Descriptor instead. +func (*KEDATrigger) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} +} + +func (x *KEDATrigger) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *KEDATrigger) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KEDATrigger) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *KEDATrigger) GetMetricType() string { + if x != nil { + return x.MetricType + } + return "" +} + +func (x *KEDATrigger) GetAuthenticationRef() *KEDAAuthenticationRef { + if x != nil { + return x.AuthenticationRef + } + return nil +} + +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 + + 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 *KEDAAuthenticationRef) Reset() { + *x = KEDAAuthenticationRef{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[112] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAAuthenticationRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAAuthenticationRef) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KEDAAuthenticationRef.ProtoReflect.Descriptor instead. +func (*KEDAAuthenticationRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} +} + +func (x *KEDAAuthenticationRef) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KEDAAuthenticationRef) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +type KEDAFallback struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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 *KEDAFallback) Reset() { + *x = KEDAFallback{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[113] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAFallback) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAFallback) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KEDAFallback.ProtoReflect.Descriptor instead. +func (*KEDAFallback) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} +} + +func (x *KEDAFallback) GetFailureThreshold() int32 { + if x != nil { + return x.FailureThreshold + } + return 0 +} + +func (x *KEDAFallback) GetReplicas() int32 { + if x != nil { + return x.Replicas + } + return 0 +} + +func (x *KEDAFallback) GetBehavior() string { + if x != nil { + return x.Behavior + } + return "" +} + +type KEDAAdvanced struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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 *KEDAAdvanced) Reset() { + *x = KEDAAdvanced{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[114] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KEDAAdvanced) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KEDAAdvanced) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KEDAAdvanced.ProtoReflect.Descriptor instead. +func (*KEDAAdvanced) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{114} +} + +func (x *KEDAAdvanced) GetRestoreToOriginalReplicaCount() bool { + if x != nil { + return x.RestoreToOriginalReplicaCount + } + return false +} + +func (x *KEDAAdvanced) GetAdvancedBehaviorJson() string { + if x != nil { + return x.AdvancedBehaviorJson + } + return "" +} + // PercentileValues contains pre-computed percentile values for a single resource axis type PercentileValues struct { state protoimpl.MessageState @@ -9262,7 +11377,7 @@ type PercentileValues struct { func (x *PercentileValues) Reset() { *x = PercentileValues{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[108] + mi := &file_api_v1_recommendation_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9275,7 +11390,7 @@ func (x *PercentileValues) String() string { func (*PercentileValues) ProtoMessage() {} func (x *PercentileValues) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[108] + mi := &file_api_v1_recommendation_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9288,7 +11403,7 @@ func (x *PercentileValues) ProtoReflect() protoreflect.Message { // Deprecated: Use PercentileValues.ProtoReflect.Descriptor instead. func (*PercentileValues) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{108} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{115} } func (x *PercentileValues) GetP50() int64 { @@ -9341,7 +11456,7 @@ type ResourcePercentiles struct { func (x *ResourcePercentiles) Reset() { *x = ResourcePercentiles{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[109] + mi := &file_api_v1_recommendation_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9354,7 +11469,7 @@ func (x *ResourcePercentiles) String() string { func (*ResourcePercentiles) ProtoMessage() {} func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[109] + mi := &file_api_v1_recommendation_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9367,7 +11482,7 @@ func (x *ResourcePercentiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourcePercentiles.ProtoReflect.Descriptor instead. func (*ResourcePercentiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{109} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{116} } func (x *ResourcePercentiles) GetCpu() *PercentileValues { @@ -9415,7 +11530,7 @@ type BurstinessRatios struct { func (x *BurstinessRatios) Reset() { *x = BurstinessRatios{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[110] + mi := &file_api_v1_recommendation_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9428,7 +11543,7 @@ func (x *BurstinessRatios) String() string { func (*BurstinessRatios) ProtoMessage() {} func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[110] + mi := &file_api_v1_recommendation_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9441,7 +11556,7 @@ func (x *BurstinessRatios) ProtoReflect() protoreflect.Message { // Deprecated: Use BurstinessRatios.ProtoReflect.Descriptor instead. func (*BurstinessRatios) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{110} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{117} } func (x *BurstinessRatios) GetCpu() float64 { @@ -9499,7 +11614,7 @@ type WorkloadClassification struct { func (x *WorkloadClassification) Reset() { *x = WorkloadClassification{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[111] + mi := &file_api_v1_recommendation_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9512,7 +11627,7 @@ func (x *WorkloadClassification) String() string { func (*WorkloadClassification) ProtoMessage() {} func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[111] + mi := &file_api_v1_recommendation_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9525,7 +11640,7 @@ func (x *WorkloadClassification) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkloadClassification.ProtoReflect.Descriptor instead. func (*WorkloadClassification) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{111} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{118} } func (x *WorkloadClassification) GetDominantResource() string { @@ -9554,7 +11669,7 @@ type BatchWorkloadRules struct { func (x *BatchWorkloadRules) Reset() { *x = BatchWorkloadRules{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[112] + mi := &file_api_v1_recommendation_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9567,7 +11682,7 @@ func (x *BatchWorkloadRules) String() string { func (*BatchWorkloadRules) ProtoMessage() {} func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[112] + mi := &file_api_v1_recommendation_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9580,7 +11695,7 @@ func (x *BatchWorkloadRules) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchWorkloadRules.ProtoReflect.Descriptor instead. func (*BatchWorkloadRules) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{112} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{119} } func (x *BatchWorkloadRules) GetRules() []*WorkloadRule { @@ -9597,6 +11712,61 @@ func (x *BatchWorkloadRules) GetRuleIdsToDelete() []string { 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 @@ -9608,7 +11778,7 @@ type WorkloadWithActiveRecommendations struct { func (x *WorkloadWithActiveRecommendations) Reset() { *x = WorkloadWithActiveRecommendations{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[113] + mi := &file_api_v1_recommendation_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9621,7 +11791,7 @@ func (x *WorkloadWithActiveRecommendations) String() string { func (*WorkloadWithActiveRecommendations) ProtoMessage() {} func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[113] + mi := &file_api_v1_recommendation_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9634,7 +11804,7 @@ func (x *WorkloadWithActiveRecommendations) ProtoReflect() protoreflect.Message // Deprecated: Use WorkloadWithActiveRecommendations.ProtoReflect.Descriptor instead. func (*WorkloadWithActiveRecommendations) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{113} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{121} } func (x *WorkloadWithActiveRecommendations) GetWorkloads() []*WorkloadIdentifier { @@ -9676,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) } @@ -9689,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 { @@ -9702,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 { @@ -9814,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) } @@ -9827,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 { @@ -9840,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 { @@ -9861,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) } @@ -9874,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 { @@ -9887,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 { @@ -9910,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) } @@ -9923,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 { @@ -9936,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 { @@ -9971,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) } @@ -9984,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 { @@ -9997,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 { @@ -10020,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) } @@ -10033,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 { @@ -10046,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 { @@ -10081,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) } @@ -10094,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 { @@ -10107,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 { @@ -10129,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) } @@ -10142,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 { @@ -10155,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 { @@ -10183,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) } @@ -10196,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 { @@ -10209,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 { @@ -10231,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) } @@ -10244,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 { @@ -10257,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 { @@ -10286,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) } @@ -10299,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 { @@ -10312,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 { @@ -10322,6 +12492,285 @@ func (x *GetPDBRecommendationForWorkloadResponse) GetRecommendation() *GenericRe return nil } +// 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 + + // "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 *StructuralHealthFinding) Reset() { + *x = StructuralHealthFinding{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StructuralHealthFinding) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StructuralHealthFinding) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StructuralHealthFinding.ProtoReflect.Descriptor instead. +func (*StructuralHealthFinding) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{133} +} + +func (x *StructuralHealthFinding) GetCheckType() string { + if x != nil { + return x.CheckType + } + return "" +} + +func (x *StructuralHealthFinding) GetSeverity() string { + if x != nil { + return x.Severity + } + return "" +} + +func (x *StructuralHealthFinding) GetReasonCode() string { + if x != nil { + return x.ReasonCode + } + return "" +} + +func (x *StructuralHealthFinding) GetFirstSeenAt() *timestamppb.Timestamp { + if x != nil { + return x.FirstSeenAt + } + return nil +} + +func (x *StructuralHealthFinding) GetDetailJson() string { + if x != nil { + return x.DetailJson + } + return "" +} + +// 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 + + 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 *WorkloadStructuralHealth) Reset() { + *x = WorkloadStructuralHealth{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[134] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadStructuralHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadStructuralHealth) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkloadStructuralHealth.ProtoReflect.Descriptor instead. +func (*WorkloadStructuralHealth) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{134} +} + +func (x *WorkloadStructuralHealth) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *WorkloadStructuralHealth) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *WorkloadStructuralHealth) GetKind() string { + if x != nil { + 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 @@ -10336,7 +12785,7 @@ type ReconcileWorkload struct { func (x *ReconcileWorkload) Reset() { *x = ReconcileWorkload{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[125] + mi := &file_api_v1_recommendation_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10349,7 +12798,7 @@ func (x *ReconcileWorkload) String() string { func (*ReconcileWorkload) ProtoMessage() {} func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[125] + mi := &file_api_v1_recommendation_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10362,7 +12811,7 @@ func (x *ReconcileWorkload) ProtoReflect() protoreflect.Message { // Deprecated: Use ReconcileWorkload.ProtoReflect.Descriptor instead. func (*ReconcileWorkload) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{125} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{137} } func (x *ReconcileWorkload) GetKind() K8SObjectKind { @@ -10407,7 +12856,7 @@ type ReconcileResponse struct { func (x *ReconcileResponse) Reset() { *x = ReconcileResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[126] + mi := &file_api_v1_recommendation_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10420,7 +12869,7 @@ func (x *ReconcileResponse) String() string { func (*ReconcileResponse) ProtoMessage() {} func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[126] + mi := &file_api_v1_recommendation_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10433,7 +12882,7 @@ func (x *ReconcileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReconcileResponse.ProtoReflect.Descriptor instead. func (*ReconcileResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{126} + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{138} } func (x *ReconcileResponse) GetRequestId() string { @@ -10487,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) } @@ -10500,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 { @@ -10513,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 { @@ -10618,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) } @@ -10631,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 { @@ -10644,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 { @@ -10669,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) } @@ -10682,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 { @@ -10695,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 { @@ -10743,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) } @@ -10756,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 { @@ -10769,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 { @@ -10790,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) } @@ -10803,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 { @@ -10816,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 { @@ -10898,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) } @@ -10911,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 { @@ -10924,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 { @@ -11035,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) } @@ -11048,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 { @@ -11061,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 { @@ -11136,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) } @@ -11149,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 { @@ -11162,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 { @@ -11271,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) } @@ -11284,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 { @@ -11297,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 { @@ -11357,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) } @@ -11370,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 { @@ -11383,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 { @@ -11481,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) } @@ -11499,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 { @@ -11512,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 { @@ -11557,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 @@ -11572,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) } @@ -11585,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 { @@ -11598,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 { @@ -11654,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) } @@ -11667,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 { @@ -11680,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 { @@ -11739,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 { @@ -11775,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) } @@ -11788,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 { @@ -11801,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 { @@ -11870,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) } @@ -11883,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 { @@ -11896,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 { @@ -12012,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) } @@ -12025,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 { @@ -12038,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 { @@ -12193,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) } @@ -12211,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 { @@ -12224,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 { @@ -12311,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 @@ -12352,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) } @@ -12365,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 { @@ -12378,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 { @@ -12515,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"` @@ -12532,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) } @@ -12550,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 { @@ -12563,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 { @@ -12764,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 } @@ -12813,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 @@ -12825,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) } @@ -12838,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 { @@ -12851,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 { @@ -12879,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) } @@ -12892,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 { @@ -12905,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 { @@ -12929,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) } @@ -12942,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 { @@ -12955,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 { @@ -13003,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) } @@ -13016,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 { @@ -13029,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 { @@ -13071,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) } @@ -13089,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 { @@ -13102,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 { @@ -13140,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 @@ -13161,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) } @@ -13179,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 { @@ -13192,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 { @@ -13244,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 @@ -13256,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) } @@ -13269,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 { @@ -13282,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 { @@ -13316,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) } @@ -13329,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 { @@ -13342,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 { @@ -13415,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) } @@ -13428,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 { @@ -13441,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 { @@ -13540,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) } @@ -13582,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 { @@ -13595,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 { @@ -13710,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 @@ -13759,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 @@ -13780,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 @@ -13794,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 @@ -13801,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 { @@ -13838,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 { @@ -13899,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 { @@ -13950,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 { @@ -14026,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 { @@ -14080,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 { @@ -14127,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 { @@ -14174,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 { - 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"` +func (x *ReasoningHistoricalPattern) GetIsOscillating() bool { + if x != nil { + return x.IsOscillating + } + return false } -func (x *WorkloadPolicies) Reset() { - *x = WorkloadPolicies{} +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 + + 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 *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 { @@ -14222,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 { @@ -14351,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 { @@ -14480,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 { @@ -14537,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 { @@ -14601,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 { @@ -14667,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 { @@ -14715,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 { @@ -14795,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 { @@ -14833,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 { @@ -14873,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 { +func (x *WorkloadPolicies) GetPolicies() []*WorkloadRecommendationPolicy { + if x != nil { + return x.Policies + } + 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. - 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"` + 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 *RetrieveSavingsForWorkloadRequest) Reset() { - *x = RetrieveSavingsForWorkloadRequest{} +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 { @@ -14928,93 +18142,66 @@ 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 { - if x != nil { - return x.ClusterId - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { - if x != nil { - return x.Kind - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { - if x != nil { - return x.Uid - } - return "" -} - -func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { +func (x *ListAttachedWorkloadPoliciesRequest) GetClusterIds() []string { if x != nil { - return x.StartTime + return x.ClusterIds } return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { +func (x *ListAttachedWorkloadPoliciesRequest) GetPolicyIds() []string { if x != nil { - return x.EndTime + return x.PolicyIds } return nil } -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { - if x != nil { - return x.IncludeDeleted - } - return false -} - -func (x *RetrieveSavingsForWorkloadRequest) GetIncludeGetWorkloadResp() bool { +func (x *ListAttachedWorkloadPoliciesRequest) GetWorkloadUids() []string { if x != nil { - return x.IncludeGetWorkloadResp + return x.WorkloadUids } - return false + return nil } -type RetrieveSavingsForWorkloadResponse struct { +// ListAttachedWorkloadPoliciesResponse contains all attached policies and workloads with their relationships. +type ListAttachedWorkloadPoliciesResponse 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"` + 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 *RetrieveSavingsForWorkloadResponse) Reset() { - *x = RetrieveSavingsForWorkloadResponse{} +func (x *ListAttachedWorkloadPoliciesResponse) Reset() { + *x = ListAttachedWorkloadPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[176] + mi := &file_api_v1_recommendation_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RetrieveSavingsForWorkloadResponse) String() string { +func (x *ListAttachedWorkloadPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} +func (*ListAttachedWorkloadPoliciesResponse) ProtoMessage() {} -func (x *RetrieveSavingsForWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[176] +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 { @@ -15025,51 +18212,55 @@ 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 ListAttachedWorkloadPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedWorkloadPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{190} } -func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { +func (x *ListAttachedWorkloadPoliciesResponse) GetPolicyMap() map[string]*WorkloadRecommendationPolicy { if x != nil { - return x.Savings + return x.PolicyMap } return nil } -func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { +func (x *ListAttachedWorkloadPoliciesResponse) GetWorkloadMap() map[string]*WorkloadItem { if x != nil { - return x.GetWorkloadResp + return x.WorkloadMap } return nil } -type CreateNodePoliciesRequest 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 - 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"` + 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 *CreateNodePoliciesRequest) Reset() { - *x = CreateNodePoliciesRequest{} +func (x *ListAttachedNodeGroupPoliciesRequest) Reset() { + *x = ListAttachedNodeGroupPoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[177] + mi := &file_api_v1_recommendation_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePoliciesRequest) String() string { +func (x *ListAttachedNodeGroupPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePoliciesRequest) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesRequest) ProtoMessage() {} -func (x *CreateNodePoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[177] +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 { @@ -15080,98 +18271,66 @@ 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 ListAttachedNodeGroupPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{191} } -func (x *CreateNodePoliciesRequest) GetTeamId() string { +func (x *ListAttachedNodeGroupPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { +func (x *ListAttachedNodeGroupPoliciesRequest) GetClusterIds() []string { if x != nil { - return x.Policies + return x.ClusterIds } return nil } -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 *CreateNodePoliciesResponse) Reset() { - *x = CreateNodePoliciesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[178] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateNodePoliciesResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateNodePoliciesResponse) ProtoMessage() {} - -func (x *CreateNodePoliciesResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListAttachedNodeGroupPoliciesRequest) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateNodePoliciesResponse.ProtoReflect.Descriptor instead. -func (*CreateNodePoliciesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{178} + return nil } -func (x *CreateNodePoliciesResponse) GetPolicies() []*NodePolicy { +func (x *ListAttachedNodeGroupPoliciesRequest) GetNodeGroupNames() []string { if x != nil { - return x.Policies + return x.NodeGroupNames } return nil } -type SuggestedNodePolicyRequest struct { +// 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"` - ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,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 *SuggestedNodePolicyRequest) Reset() { - *x = SuggestedNodePolicyRequest{} +func (x *ListAttachedNodeGroupPoliciesResponse) Reset() { + *x = ListAttachedNodeGroupPoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[179] + mi := &file_api_v1_recommendation_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyRequest) String() string { +func (x *ListAttachedNodeGroupPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyRequest) ProtoMessage() {} +func (*ListAttachedNodeGroupPoliciesResponse) ProtoMessage() {} -func (x *SuggestedNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[179] +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 { @@ -15182,50 +18341,53 @@ 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 ListAttachedNodeGroupPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListAttachedNodeGroupPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{192} } -func (x *SuggestedNodePolicyRequest) GetTeamId() string { +func (x *ListAttachedNodeGroupPoliciesResponse) GetPolicyMap() map[string]*NodeGroupRecommendationPolicy { if x != nil { - return x.TeamId + return x.PolicyMap } - return "" + return nil } -func (x *SuggestedNodePolicyRequest) GetClusterId() string { +func (x *ListAttachedNodeGroupPoliciesResponse) GetNodeGroupMap() map[string]*NodeGroupItem { if x != nil { - return x.ClusterId + return x.NodeGroupMap } - return "" + return nil } -type SuggestedNodePolicyResponse struct { +// NodeGroupItem represents a node group and its policy attachments. +type NodeGroupItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,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 *SuggestedNodePolicyResponse) Reset() { - *x = SuggestedNodePolicyResponse{} +func (x *NodeGroupItem) Reset() { + *x = NodeGroupItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[180] + mi := &file_api_v1_recommendation_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedNodePolicyResponse) String() string { +func (x *NodeGroupItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedNodePolicyResponse) ProtoMessage() {} +func (*NodeGroupItem) ProtoMessage() {} -func (x *SuggestedNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[180] +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 { @@ -15236,47 +18398,60 @@ 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} +// Deprecated: Use NodeGroupItem.ProtoReflect.Descriptor instead. +func (*NodeGroupItem) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} } -func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { +func (x *NodeGroupItem) GetName() string { if x != nil { - return x.Policy + 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 GenerateNodePoliciesFromKarpenterRequest 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"` - // 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 } -func (x *GenerateNodePoliciesFromKarpenterRequest) Reset() { - *x = GenerateNodePoliciesFromKarpenterRequest{} +func (x *RecommendationAppliedRequest) Reset() { + *x = RecommendationAppliedRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[181] + mi := &file_api_v1_recommendation_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { +func (x *RecommendationAppliedRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} +func (*RecommendationAppliedRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[181] +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 { @@ -15287,59 +18462,62 @@ 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 RecommendationAppliedRequest.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{194} } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { +func (x *RecommendationAppliedRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { +func (x *RecommendationAppliedRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { +func (x *RecommendationAppliedRequest) GetRecommendationId() string { if x != nil { - return x.PersistPolicies + return x.RecommendationId } - return false + return "" } -type GenerateNodePoliciesFromKarpenterResponse struct { +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 - - 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 *RecommendationAppliedResponse) Reset() { + *x = RecommendationAppliedResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[182] + mi := &file_api_v1_recommendation_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { +func (x *RecommendationAppliedResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} +func (*RecommendationAppliedResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromKarpenterResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[182] +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 { @@ -15350,54 +18528,44 @@ 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 RecommendationAppliedResponse.ProtoReflect.Descriptor instead. +func (*RecommendationAppliedResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{195} } -type GenerateNodePoliciesFromNodeGroupsRequest 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 *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsRequest{} +func (x *ApplyRecommendationRequest) Reset() { + *x = ApplyRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[183] + mi := &file_api_v1_recommendation_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { +func (x *ApplyRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} +func (*ApplyRecommendationRequest) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[183] +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 { @@ -15408,59 +18576,76 @@ 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} +// Deprecated: Use ApplyRecommendationRequest.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{196} } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { +func (x *ApplyRecommendationRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { +func (x *ApplyRecommendationRequest) GetClusterId() string { if x != nil { return x.ClusterId } return "" } -func (x *GenerateNodePoliciesFromNodeGroupsRequest) 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 GenerateNodePoliciesFromNodeGroupsResponse 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 []*NodePolicyTarget `protobuf:"bytes,2,rep,name=targets,proto3" json:"targets,omitempty"` - Warnings []*WorkloadCompatibilityWarning `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"` } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { - *x = GenerateNodePoliciesFromNodeGroupsResponse{} +func (x *ApplyRecommendationResponse) Reset() { + *x = ApplyRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[184] + mi := &file_api_v1_recommendation_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { +func (x *ApplyRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} +func (*ApplyRecommendationResponse) ProtoMessage() {} -func (x *GenerateNodePoliciesFromNodeGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[184] +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 { @@ -15471,58 +18656,34 @@ 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 ApplyRecommendationResponse.ProtoReflect.Descriptor instead. +func (*ApplyRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{197} } -type GetNodeAnnotationReadinessRequest 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"` } -func (x *GetNodeAnnotationReadinessRequest) Reset() { - *x = GetNodeAnnotationReadinessRequest{} +func (x *RecommendationEventsRequest) Reset() { + *x = RecommendationEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[185] + mi := &file_api_v1_recommendation_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessRequest) String() string { +func (x *RecommendationEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessRequest) ProtoMessage() {} +func (*RecommendationEventsRequest) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[185] +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 { @@ -15533,58 +18694,91 @@ 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{185} +// Deprecated: Use RecommendationEventsRequest.ProtoReflect.Descriptor instead. +func (*RecommendationEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{198} } -func (x *GetNodeAnnotationReadinessRequest) GetTeamId() string { - if x != nil { - return x.TeamId +type RecommendationEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Events []string `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` +} + +func (x *RecommendationEventsResponse) Reset() { + *x = RecommendationEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[199] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *GetNodeAnnotationReadinessRequest) GetClusterId() string { +func (x *RecommendationEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecommendationEventsResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecommendationEventsResponse.ProtoReflect.Descriptor instead. +func (*RecommendationEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{199} +} + +func (x *RecommendationEventsResponse) GetEvents() []string { if x != nil { - return x.ClusterId + return x.Events } - return "" + return nil } -type GetNodeAnnotationReadinessResponse 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 - 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 (Azure / 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"` + 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 *GetNodeAnnotationReadinessResponse) Reset() { - *x = GetNodeAnnotationReadinessResponse{} +func (x *RetrieveSavingsForWorkloadRequest) Reset() { + *x = RetrieveSavingsForWorkloadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[186] + mi := &file_api_v1_recommendation_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeAnnotationReadinessResponse) String() string { +func (x *RetrieveSavingsForWorkloadRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeAnnotationReadinessResponse) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadRequest) ProtoMessage() {} -func (x *GetNodeAnnotationReadinessResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[186] +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 { @@ -15595,80 +18789,93 @@ 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{186} +// Deprecated: Use RetrieveSavingsForWorkloadRequest.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{200} } -func (x *GetNodeAnnotationReadinessResponse) GetTotalNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetTeamId() string { if x != nil { - return x.TotalNodes + return x.TeamId } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetAnnotatedNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetClusterId() string { if x != nil { - return x.AnnotatedNodes + return x.ClusterId } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodes() int32 { +func (x *RetrieveSavingsForWorkloadRequest) GetKind() string { if x != nil { - return x.UnannotatedNodes + return x.Kind } - return 0 + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetReady() bool { +func (x *RetrieveSavingsForWorkloadRequest) GetUid() string { if x != nil { - return x.Ready + return x.Uid } - return false + return "" } -func (x *GetNodeAnnotationReadinessResponse) GetUnannotatedNodeNames() []string { +func (x *RetrieveSavingsForWorkloadRequest) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.UnannotatedNodeNames + return x.StartTime } return nil } -func (x *GetNodeAnnotationReadinessResponse) GetSupported() bool { +func (x *RetrieveSavingsForWorkloadRequest) GetEndTime() *timestamppb.Timestamp { if x != nil { - return x.Supported + return x.EndTime + } + return nil +} + +func (x *RetrieveSavingsForWorkloadRequest) GetIncludeDeleted() bool { + if x != nil { + return x.IncludeDeleted } return false } -// Migration wizard state -type GetMigrationStateRequest struct { +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 *GetMigrationStateRequest) Reset() { - *x = GetMigrationStateRequest{} +func (x *RetrieveSavingsForWorkloadResponse) Reset() { + *x = RetrieveSavingsForWorkloadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[187] + mi := &file_api_v1_recommendation_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateRequest) String() string { +func (x *RetrieveSavingsForWorkloadResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateRequest) ProtoMessage() {} +func (*RetrieveSavingsForWorkloadResponse) ProtoMessage() {} -func (x *GetMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[187] +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 { @@ -15679,56 +18886,51 @@ 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{187} +// Deprecated: Use RetrieveSavingsForWorkloadResponse.ProtoReflect.Descriptor instead. +func (*RetrieveSavingsForWorkloadResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{201} } -func (x *GetMigrationStateRequest) GetTeamId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetSavings() *SavingsTimeSeries { if x != nil { - return x.TeamId + return x.Savings } - return "" + return nil } -func (x *GetMigrationStateRequest) GetClusterId() string { +func (x *RetrieveSavingsForWorkloadResponse) GetGetWorkloadResp() *GetWorkloadResponse { if x != nil { - return x.ClusterId + return x.GetWorkloadResp } - return "" + return nil } -type GetMigrationStateResponse struct { +type CreateNodePoliciesRequest 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"` + 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 *GetMigrationStateResponse) Reset() { - *x = GetMigrationStateResponse{} +func (x *CreateNodePoliciesRequest) Reset() { + *x = CreateNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[188] + mi := &file_api_v1_recommendation_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMigrationStateResponse) String() string { +func (x *CreateNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMigrationStateResponse) ProtoMessage() {} +func (*CreateNodePoliciesRequest) ProtoMessage() {} -func (x *GetMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[188] +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 { @@ -15739,89 +18941,98 @@ 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{188} +// Deprecated: Use CreateNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{202} } -func (x *GetMigrationStateResponse) GetId() string { +func (x *CreateNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.Id + return x.TeamId } return "" } -func (x *GetMigrationStateResponse) GetClusterId() string { +func (x *CreateNodePoliciesRequest) GetPolicies() []*NodePolicy { if x != nil { - return x.ClusterId + return x.Policies } - return "" + return nil } -func (x *GetMigrationStateResponse) GetStatus() string { - if x != nil { - return x.Status - } - return "" +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 *GetMigrationStateResponse) GetCurrentStep() int32 { - if x != nil { - return x.CurrentStep +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 0 } -func (x *GetMigrationStateResponse) GetStateJson() string { - if x != nil { - return x.StateJson - } - return "" +func (x *CreateNodePoliciesResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *GetMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +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 nil + return mi.MessageOf(x) } -func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { +// 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.UpdatedAt + return x.Policies } return nil } -type UpdateMigrationStateRequest struct { +type SuggestedNodePolicyRequest 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"` } -func (x *UpdateMigrationStateRequest) Reset() { - *x = UpdateMigrationStateRequest{} +func (x *SuggestedNodePolicyRequest) Reset() { + *x = SuggestedNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[189] + mi := &file_api_v1_recommendation_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateRequest) String() string { +func (x *SuggestedNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateRequest) ProtoMessage() {} +func (*SuggestedNodePolicyRequest) ProtoMessage() {} -func (x *UpdateMigrationStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[189] +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 { @@ -15832,71 +19043,50 @@ 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{189} +// Deprecated: Use SuggestedNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{204} } -func (x *UpdateMigrationStateRequest) GetTeamId() string { +func (x *SuggestedNodePolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateMigrationStateRequest) GetClusterId() string { +func (x *SuggestedNodePolicyRequest) 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 { - if x != nil { - return x.StateJson - } - return "" -} - -type UpdateMigrationStateResponse 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"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *UpdateMigrationStateResponse) Reset() { - *x = UpdateMigrationStateResponse{} +func (x *SuggestedNodePolicyResponse) Reset() { + *x = SuggestedNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[190] + mi := &file_api_v1_recommendation_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateMigrationStateResponse) String() string { +func (x *SuggestedNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateMigrationStateResponse) ProtoMessage() {} +func (*SuggestedNodePolicyResponse) ProtoMessage() {} -func (x *UpdateMigrationStateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[190] +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 { @@ -15907,49 +19097,47 @@ 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{190} +// Deprecated: Use SuggestedNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*SuggestedNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{205} } -func (x *UpdateMigrationStateResponse) GetId() string { +func (x *SuggestedNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.Id + return x.Policy } - return "" + return nil } -// NodePool validation -type ReportNodePoolValidationRequest struct { +type GenerateNodePoliciesFromKarpenterRequest 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 *GenerateNodePoliciesFromKarpenterRequest) Reset() { + *x = GenerateNodePoliciesFromKarpenterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[191] + mi := &file_api_v1_recommendation_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationRequest) String() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterRequest) ProtoMessage() {} -func (x *ReportNodePoolValidationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[191] +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 { @@ -15960,76 +19148,59 @@ 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{191} -} - -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 GenerateNodePoliciesFromKarpenterRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{206} } -func (x *ReportNodePoolValidationRequest) GetInstanceType() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetTeamId() string { if x != nil { - return x.InstanceType + return x.TeamId } return "" } -func (x *ReportNodePoolValidationRequest) GetZone() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetClusterId() string { if x != nil { - return x.Zone + return x.ClusterId } return "" } -func (x *ReportNodePoolValidationRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromKarpenterRequest) GetPersistPolicies() bool { if x != nil { - return x.TeamId + return x.PersistPolicies } - return "" + return false } -type ReportNodePoolValidationResponse struct { +type GenerateNodePoliciesFromKarpenterResponse 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 *ReportNodePoolValidationResponse) Reset() { - *x = ReportNodePoolValidationResponse{} +func (x *GenerateNodePoliciesFromKarpenterResponse) Reset() { + *x = GenerateNodePoliciesFromKarpenterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[192] + mi := &file_api_v1_recommendation_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ReportNodePoolValidationResponse) String() string { +func (x *GenerateNodePoliciesFromKarpenterResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ReportNodePoolValidationResponse) ProtoMessage() {} +func (*GenerateNodePoliciesFromKarpenterResponse) ProtoMessage() {} -func (x *ReportNodePoolValidationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[192] +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 { @@ -16040,37 +19211,54 @@ 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{192} +// Deprecated: Use GenerateNodePoliciesFromKarpenterResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromKarpenterResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{207} } -type GetNodePoolValidationsRequest struct { +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 +} + +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"` - TeamId string `protobuf:"bytes,2,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 *GetNodePoolValidationsRequest) Reset() { - *x = GetNodePoolValidationsRequest{} +func (x *GenerateNodePoliciesFromNodeGroupsRequest) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[193] + mi := &file_api_v1_recommendation_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodePoolValidationsRequest) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodePoolValidationsRequest) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsRequest) ProtoMessage() {} -func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[193] +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 { @@ -16081,54 +19269,67 @@ func (x *GetNodePoolValidationsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. -func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{193} +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsRequest.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{208} } -func (x *GetNodePoolValidationsRequest) GetClusterId() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetTeamId() string { if x != nil { - return x.ClusterId + return x.TeamId } return "" } -func (x *GetNodePoolValidationsRequest) GetTeamId() string { +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetClusterId() string { if x != nil { - return x.TeamId + return x.ClusterId } return "" } -type NodePoolValidationReport 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"` +func (x *GenerateNodePoliciesFromNodeGroupsRequest) GetPersistPolicies() bool { + if x != nil { + return x.PersistPolicies + } + return false } -func (x *NodePoolValidationReport) Reset() { - *x = NodePoolValidationReport{} +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 *GenerateNodePoliciesFromNodeGroupsResponse) Reset() { + *x = GenerateNodePoliciesFromNodeGroupsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[194] + mi := &file_api_v1_recommendation_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePoolValidationReport) String() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePoolValidationReport) ProtoMessage() {} +func (*GenerateNodePoliciesFromNodeGroupsResponse) ProtoMessage() {} -func (x *NodePoolValidationReport) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[194] +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 { @@ -16139,71 +19340,187 @@ 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{194} +// Deprecated: Use GenerateNodePoliciesFromNodeGroupsResponse.ProtoReflect.Descriptor instead. +func (*GenerateNodePoliciesFromNodeGroupsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{209} } -func (x *NodePoolValidationReport) GetNodepoolName() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.NodepoolName + return x.Policies } - return "" + return nil } -func (x *NodePoolValidationReport) GetNodeName() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.NodeName + return x.Targets } - return "" + return nil } -func (x *NodePoolValidationReport) GetInstanceType() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetWarnings() []*WorkloadCompatibilityWarning { if x != nil { - return x.InstanceType + return x.Warnings } - return "" + return nil } -func (x *NodePoolValidationReport) GetZone() string { +func (x *GenerateNodePoliciesFromNodeGroupsResponse) GetEligibility() []*NodeGroupMigrationEligibility { if x != nil { - return x.Zone + return x.Eligibility + } + 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 { + 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. + // "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 *NodeGroupMigrationEligibility) Reset() { + *x = NodeGroupMigrationEligibility{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[210] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeGroupMigrationEligibility) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeGroupMigrationEligibility) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NodeGroupMigrationEligibility.ProtoReflect.Descriptor instead. +func (*NodeGroupMigrationEligibility) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{210} +} + +func (x *NodeGroupMigrationEligibility) GetGroupName() string { + if x != nil { + return x.GroupName } return "" } -func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { +func (x *NodeGroupMigrationEligibility) GetMigratable() bool { if x != nil { - return x.ReportedAt + return x.Migratable + } + return false +} + +func (x *NodeGroupMigrationEligibility) GetReasons() []string { + if x != nil { + 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[195] + 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[195] +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 { @@ -16214,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{195} +// 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[196] + 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[196] +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 { @@ -16265,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{196} +// 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[197] + 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[197] +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 { @@ -16340,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{197} +// 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[198] + 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[198] +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 { @@ -16387,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{198} +// 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[199] + 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[199] +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 { @@ -16435,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{199} +// 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[200] + 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[200] +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 { @@ -16489,44 +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{200} +// 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 "" +} + +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 } -type DeleteNodePolicyRequest struct { +func (x *GetMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +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"` - 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 *UpdateMigrationStateRequest) Reset() { + *x = UpdateMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[201] + mi := &file_api_v1_recommendation_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyRequest) String() string { +func (x *UpdateMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyRequest) ProtoMessage() {} +func (*UpdateMigrationStateRequest) ProtoMessage() {} -func (x *DeleteNodePolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[201] +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 { @@ -16537,52 +19977,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{201} +// Deprecated: Use UpdateMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{217} } -func (x *DeleteNodePolicyRequest) GetTeamId() string { +func (x *UpdateMigrationStateRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *DeleteNodePolicyRequest) GetPolicyId() string { +func (x *UpdateMigrationStateRequest) GetClusterId() string { if x != nil { - return x.PolicyId + return x.ClusterId } return "" } -type DeleteNodePolicyResponse 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 - 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 *UpdateMigrationStateResponse) Reset() { + *x = UpdateMigrationStateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[202] + mi := &file_api_v1_recommendation_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteNodePolicyResponse) String() string { +func (x *UpdateMigrationStateResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteNodePolicyResponse) ProtoMessage() {} +func (*UpdateMigrationStateResponse) ProtoMessage() {} -func (x *DeleteNodePolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[202] +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 { @@ -16593,109 +20052,45 @@ 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{202} -} - -func (x *DeleteNodePolicyResponse) GetSuccess() bool { - if x != nil { - return x.Success - } - return false +// Deprecated: Use UpdateMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{218} } -func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { +func (x *UpdateMigrationStateResponse) GetId() string { if x != nil { - return x.DeletedTargetCount + return x.Id } - return 0 + return "" } -type NodePolicy struct { +// Karpenter migration wizard +type GetKarpenterMigrationStateRequest 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"` + 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) Reset() { - *x = NodePolicy{} +func (x *GetKarpenterMigrationStateRequest) Reset() { + *x = GetKarpenterMigrationStateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[203] + mi := &file_api_v1_recommendation_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicy) String() string { +func (x *GetKarpenterMigrationStateRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicy) ProtoMessage() {} +func (*GetKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *NodePolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[203] +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 { @@ -16706,396 +20101,478 @@ 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{203} +// Deprecated: Use GetKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{219} } -func (x *NodePolicy) GetId() string { +func (x *GetKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { - return x.Id + return x.TeamId } return "" } -func (x *NodePolicy) GetName() string { +func (x *GetKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *NodePolicy) GetDescription() string { - if x != nil { - return x.Description - } - return "" +type GetKarpenterMigrationStateResponse 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"` } -func (x *NodePolicy) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *GetKarpenterMigrationStateResponse) Reset() { + *x = GetKarpenterMigrationStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[220] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetInstanceCategories() *LabelSelector { - if x != nil { - return x.InstanceCategories - } - return nil +func (x *GetKarpenterMigrationStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { - if x != nil { - return x.InstanceFamilies +func (*GetKarpenterMigrationStateResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetInstanceCpus() *LabelSelector { +// Deprecated: Use GetKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{220} +} + +func (x *GetKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.InstanceCpus + return x.Id } - return nil + return "" } -func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetClusterId() string { if x != nil { - return x.InstanceHypervisors + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetStatus() string { if x != nil { - return x.InstanceGenerations + return x.Status } - return nil + return "" } -func (x *NodePolicy) GetInstanceSizes() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetCurrentStep() int32 { if x != nil { - return x.InstanceSizes + return x.CurrentStep } - return nil + return 0 } -func (x *NodePolicy) GetInstanceTypes() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetStateJson() string { if x != nil { - return x.InstanceTypes + return x.StateJson } - return nil + return "" } -func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { +func (x *GetKarpenterMigrationStateResponse) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceLocalNvme + return x.CreatedAt } return nil } -func (x *NodePolicy) GetInstanceCategoriesTip() string { - if x != nil && x.InstanceCategoriesTip != nil { - return *x.InstanceCategoriesTip +func (x *GetKarpenterMigrationStateResponse) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt } - return "" + return nil } -func (x *NodePolicy) GetInstanceFamiliesTip() string { - if x != nil && x.InstanceFamiliesTip != nil { - return *x.InstanceFamiliesTip - } - return "" -} +type UpdateKarpenterMigrationStateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *NodePolicy) GetInstanceCpusTip() string { - if x != nil && x.InstanceCpusTip != nil { - return *x.InstanceCpusTip - } - return "" + 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 *NodePolicy) GetInstanceHypervisorsTip() string { - if x != nil && x.InstanceHypervisorsTip != nil { - return *x.InstanceHypervisorsTip +func (x *UpdateKarpenterMigrationStateRequest) Reset() { + *x = UpdateKarpenterMigrationStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[221] + 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 *UpdateKarpenterMigrationStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetInstanceSizesTip() string { - if x != nil && x.InstanceSizesTip != nil { - return *x.InstanceSizesTip - } - return "" -} +func (*UpdateKarpenterMigrationStateRequest) ProtoMessage() {} -func (x *NodePolicy) GetInstanceLocalNvmeTip() string { - if x != nil && x.InstanceLocalNvmeTip != nil { - return *x.InstanceLocalNvmeTip +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetZones() *LabelSelector { - if x != nil { - return x.Zones - } - return nil +// Deprecated: Use UpdateKarpenterMigrationStateRequest.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} } -func (x *NodePolicy) GetArchitectures() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetTeamId() string { if x != nil { - return x.Architectures + return x.TeamId } - return nil + return "" } -func (x *NodePolicy) GetCapacityTypes() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetClusterId() string { if x != nil { - return x.CapacityTypes + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetOperatingSystems() *LabelSelector { +func (x *UpdateKarpenterMigrationStateRequest) GetStatus() string { if x != nil { - return x.OperatingSystems + return x.Status } - return nil + return "" } -func (x *NodePolicy) GetWeight() int32 { +func (x *UpdateKarpenterMigrationStateRequest) GetCurrentStep() int32 { if x != nil { - return x.Weight + return x.CurrentStep } return 0 } -func (x *NodePolicy) GetZonesTip() string { - if x != nil && x.ZonesTip != nil { - return *x.ZonesTip +func (x *UpdateKarpenterMigrationStateRequest) GetStateJson() string { + if x != nil { + return x.StateJson } return "" } -func (x *NodePolicy) GetArchitecturesTip() string { - if x != nil && x.ArchitecturesTip != nil { - return *x.ArchitecturesTip - } - return "" +type UpdateKarpenterMigrationStateResponse 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) GetCapacityTypeTip() string { - if x != nil && x.CapacityTypeTip != nil { - return *x.CapacityTypeTip +func (x *UpdateKarpenterMigrationStateResponse) Reset() { + *x = UpdateKarpenterMigrationStateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[222] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NodePolicy) GetOperatingSystemsTip() string { - if x != nil && x.OperatingSystemsTip != nil { - return *x.OperatingSystemsTip - } - return "" +func (x *UpdateKarpenterMigrationStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetLabels() map[string]string { - if x != nil { - return x.Labels +func (*UpdateKarpenterMigrationStateResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetTaints() []*Taint { - if x != nil { - return x.Taints - } - return nil +// Deprecated: Use UpdateKarpenterMigrationStateResponse.ProtoReflect.Descriptor instead. +func (*UpdateKarpenterMigrationStateResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} } -func (x *NodePolicy) GetDisruption() *DisruptionPolicy { +func (x *UpdateKarpenterMigrationStateResponse) GetId() string { if x != nil { - return x.Disruption + return x.Id } - return nil + return "" } -func (x *NodePolicy) GetLimits() *ResourceLimits { - if x != nil { - return x.Limits - } - return nil +type KarpenterOwnershipConflict struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + 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) GetStartupTaints() []*Taint { - if x != nil { - return x.StartupTaints +func (x *KarpenterOwnershipConflict) Reset() { + *x = KarpenterOwnershipConflict{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[223] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *NodePolicy) GetTaintsTip() string { - if x != nil && x.TaintsTip != nil { - return *x.TaintsTip - } - return "" +func (x *KarpenterOwnershipConflict) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodePolicy) GetDisruptionsTip() string { - if x != nil && x.DisruptionsTip != nil { - return *x.DisruptionsTip +func (*KarpenterOwnershipConflict) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *NodePolicy) GetLimitsTip() string { - if x != nil && x.LimitsTip != nil { - return *x.LimitsTip - } - return "" +// Deprecated: Use KarpenterOwnershipConflict.ProtoReflect.Descriptor instead. +func (*KarpenterOwnershipConflict) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{223} } -func (x *NodePolicy) GetStartupTaintsTip() string { - if x != nil && x.StartupTaintsTip != nil { - return *x.StartupTaintsTip +func (x *KarpenterOwnershipConflict) GetId() string { + if x != nil { + return x.Id } return "" } -func (x *NodePolicy) GetMasterOverrideRoleName() string { +func (x *KarpenterOwnershipConflict) GetResourceKind() string { if x != nil { - return x.MasterOverrideRoleName + return x.ResourceKind } return "" } -func (x *NodePolicy) GetNodePoolName() string { +func (x *KarpenterOwnershipConflict) GetResourceName() string { if x != nil { - return x.NodePoolName + return x.ResourceName } return "" } -func (x *NodePolicy) GetNodeClassName() string { +func (x *KarpenterOwnershipConflict) GetOwnerTool() string { if x != nil { - return x.NodeClassName + return x.OwnerTool } return "" } -func (x *NodePolicy) GetAws() *AWSNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetDetectedAt() *timestamppb.Timestamp { if x != nil { - return x.Aws + return x.DetectedAt } return nil } -func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetAcknowledgedAt() *timestamppb.Timestamp { if x != nil { - return x.Gcp + return x.AcknowledgedAt } return nil } -func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { +func (x *KarpenterOwnershipConflict) GetAcknowledgedBy() string { if x != nil { - return x.Azure + return x.AcknowledgedBy } - return nil + return "" } -func (x *NodePolicy) GetOci() *OCINodeClassSpec { - if x != nil { - return x.Oci +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 *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) GetCloudProviderId() int64 { - if x != nil && x.CloudProviderId != nil { - return *x.CloudProviderId +func (x *DetectKarpenterOwnershipConflictsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +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 0 + return mi.MessageOf(x) } -func (x *NodePolicy) GetCloudProvider() *CloudProvider { +// Deprecated: Use DetectKarpenterOwnershipConflictsRequest.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{224} +} + +func (x *DetectKarpenterOwnershipConflictsRequest) GetTeamId() string { if x != nil { - return x.CloudProvider + return x.TeamId } - return nil + return "" } -func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { +func (x *DetectKarpenterOwnershipConflictsRequest) GetClusterId() string { if x != nil { - return x.ZonalShift + return x.ClusterId } - return nil + return "" } -func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { - if x != nil { - return x.Raw +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 *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 nil } -func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *DetectKarpenterOwnershipConflictsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +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 nil + return mi.MessageOf(x) } -func (x *NodePolicy) GetUpdatedAt() *timestamppb.Timestamp { +// Deprecated: Use DetectKarpenterOwnershipConflictsResponse.ProtoReflect.Descriptor instead. +func (*DetectKarpenterOwnershipConflictsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} +} + +func (x *DetectKarpenterOwnershipConflictsResponse) GetConflicts() []*KarpenterOwnershipConflict { if x != nil { - return x.UpdatedAt + return x.Conflicts } return nil } -func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { +func (x *DetectKarpenterOwnershipConflictsResponse) GetAlreadyDevZeroManaged() bool { if x != nil { - return x.DeletedAt + return x.AlreadyDevZeroManaged } - return nil + return false } -type PreviewNodeRecommendationConfigRequest struct { +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"` - 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"` + 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 *PreviewNodeRecommendationConfigRequest) Reset() { - *x = PreviewNodeRecommendationConfigRequest{} +func (x *AcknowledgeKarpenterOwnershipConflictRequest) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[204] + mi := &file_api_v1_recommendation_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigRequest) String() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} +func (*AcknowledgeKarpenterOwnershipConflictRequest) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[204] +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 { @@ -17106,64 +20583,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{204} +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictRequest.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} } -func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetConflictId() string { if x != nil { - return x.ClusterId + return x.ConflictId } return "" } -func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { - if x != nil { - return x.Policies - } - return nil -} - -func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { +func (x *AcknowledgeKarpenterOwnershipConflictRequest) GetAcknowledgedBy() string { if x != nil { - return x.PolicyIds + return x.AcknowledgedBy } - return nil + return "" } -type PreviewNodeRecommendationConfigResponse struct { +type AcknowledgeKarpenterOwnershipConflictResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (x *PreviewNodeRecommendationConfigResponse) Reset() { - *x = PreviewNodeRecommendationConfigResponse{} +func (x *AcknowledgeKarpenterOwnershipConflictResponse) Reset() { + *x = AcknowledgeKarpenterOwnershipConflictResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[205] + mi := &file_api_v1_recommendation_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewNodeRecommendationConfigResponse) String() string { +func (x *AcknowledgeKarpenterOwnershipConflictResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} +func (*AcknowledgeKarpenterOwnershipConflictResponse) ProtoMessage() {} -func (x *PreviewNodeRecommendationConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[205] +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 { @@ -17174,51 +20644,45 @@ 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{205} +// Deprecated: Use AcknowledgeKarpenterOwnershipConflictResponse.ProtoReflect.Descriptor instead. +func (*AcknowledgeKarpenterOwnershipConflictResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} } -func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { +func (x *AcknowledgeKarpenterOwnershipConflictResponse) GetId() string { if x != nil { - return x.Nrc + return x.Id } - return nil + return "" } -type NodeRecommendationConfig struct { +type KarpenterSourceResource 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"` + 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 *NodeRecommendationConfig) Reset() { - *x = NodeRecommendationConfig{} +func (x *KarpenterSourceResource) Reset() { + *x = KarpenterSourceResource{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[206] + mi := &file_api_v1_recommendation_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeRecommendationConfig) String() string { +func (x *KarpenterSourceResource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendationConfig) ProtoMessage() {} +func (*KarpenterSourceResource) ProtoMessage() {} -func (x *NodeRecommendationConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[206] +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 { @@ -17229,100 +20693,112 @@ 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{206} +// Deprecated: Use KarpenterSourceResource.ProtoReflect.Descriptor instead. +func (*KarpenterSourceResource) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} } -func (x *NodeRecommendationConfig) GetId() string { +func (x *KarpenterSourceResource) GetKind() string { if x != nil { - return x.Id + return x.Kind } return "" } -func (x *NodeRecommendationConfig) GetClusterId() string { +func (x *KarpenterSourceResource) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { +func (x *KarpenterSourceResource) GetYaml() string { if x != nil { - return x.PolicyContainersJson + return x.Yaml } return "" } -func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { - if x != nil { - return x.PolicyContainersYaml - } - return "" +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 *NodeRecommendationConfig) GetStatus() RecommendationStatus { - if x != nil { - return x.Status +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 RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -func (x *NodeRecommendationConfig) GetError() string { - if x != nil { - return x.Error - } - return "" +func (x *GetKarpenterSourceResourcesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +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 *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { +// 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.UpdatedAt + return x.TeamId } - return nil + return "" } -func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { +func (x *GetKarpenterSourceResourcesRequest) GetClusterId() string { if x != nil { - return x.DeletedAt + return x.ClusterId } - return nil + return "" } -type SuggestedKarpenterConfigRequest struct { +type GetKarpenterSourceResourcesResponse 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"` + Resources []*KarpenterSourceResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *SuggestedKarpenterConfigRequest) Reset() { - *x = SuggestedKarpenterConfigRequest{} +func (x *GetKarpenterSourceResourcesResponse) Reset() { + *x = GetKarpenterSourceResourcesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[207] + mi := &file_api_v1_recommendation_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigRequest) String() string { +func (x *GetKarpenterSourceResourcesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} +func (*GetKarpenterSourceResourcesResponse) ProtoMessage() {} -func (x *SuggestedKarpenterConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[207] +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 { @@ -17333,51 +20809,44 @@ 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{207} -} - -func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { - if x != nil { - return x.ClusterId - } - return "" +// Deprecated: Use GetKarpenterSourceResourcesResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterSourceResourcesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} } -func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { +func (x *GetKarpenterSourceResourcesResponse) GetResources() []*KarpenterSourceResource { if x != nil { - return x.TeamId + return x.Resources } - return "" + return nil } -type SuggestedKarpenterConfigResponse struct { +type NodePoolAdoptionStatus 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"` + 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 *SuggestedKarpenterConfigResponse) Reset() { - *x = SuggestedKarpenterConfigResponse{} +func (x *NodePoolAdoptionStatus) Reset() { + *x = NodePoolAdoptionStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[208] + mi := &file_api_v1_recommendation_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SuggestedKarpenterConfigResponse) String() string { +func (x *NodePoolAdoptionStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} +func (*NodePoolAdoptionStatus) ProtoMessage() {} -func (x *SuggestedKarpenterConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[208] +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 { @@ -17388,52 +20857,52 @@ 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{208} +// Deprecated: Use NodePoolAdoptionStatus.ProtoReflect.Descriptor instead. +func (*NodePoolAdoptionStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} } -func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { +func (x *NodePoolAdoptionStatus) GetNodePoolName() string { if x != nil { - return x.NgToOriginal + return x.NodePoolName } - return nil + return "" } -func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { +func (x *NodePoolAdoptionStatus) GetReady() bool { if x != nil { - return x.NgToSuggested + return x.Ready } - return nil + return false } -type GetAvailableKindsByTargetingFiltersRequest 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"` - 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"` + 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 *GetAvailableKindsByTargetingFiltersRequest) Reset() { - *x = GetAvailableKindsByTargetingFiltersRequest{} +func (x *GetKarpenterAdoptionStatusRequest) Reset() { + *x = GetKarpenterAdoptionStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[209] + mi := &file_api_v1_recommendation_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { +func (x *GetKarpenterAdoptionStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusRequest) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[209] +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 { @@ -17444,62 +20913,57 @@ 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{209} +// Deprecated: Use GetKarpenterAdoptionStatusRequest.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { +func (x *GetKarpenterAdoptionStatusRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { +func (x *GetKarpenterAdoptionStatusRequest) GetClusterId() string { if x != nil { - return x.ClusterIds + return x.ClusterId } - return nil + return "" } -func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *GetKarpenterAdoptionStatusRequest) GetNodePoolNames() []string { if x != nil { - return x.TargetFilters + return x.NodePoolNames } return nil } -// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria -type SearchResourcesByTargetingFiltersRequest struct { +type GetKarpenterAdoptionStatusResponse 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"` + Statuses []*NodePoolAdoptionStatus `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty"` } -func (x *SearchResourcesByTargetingFiltersRequest) Reset() { - *x = SearchResourcesByTargetingFiltersRequest{} +func (x *GetKarpenterAdoptionStatusResponse) Reset() { + *x = GetKarpenterAdoptionStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[210] + mi := &file_api_v1_recommendation_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersRequest) String() string { +func (x *GetKarpenterAdoptionStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} +func (*GetKarpenterAdoptionStatusResponse) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[210] +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 { @@ -17510,79 +20974,49 @@ 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{210} -} - -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 GetKarpenterAdoptionStatusResponse.ProtoReflect.Descriptor instead. +func (*GetKarpenterAdoptionStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{233} } -func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { +func (x *GetKarpenterAdoptionStatusResponse) GetStatuses() []*NodePoolAdoptionStatus { if x != nil { - return x.TargetFilters + return x.Statuses } return nil } -type TargetFilters struct { +// NodePool validation +type ReportNodePoolValidationRequest 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 + 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 *TargetFilters) Reset() { - *x = TargetFilters{} +func (x *ReportNodePoolValidationRequest) Reset() { + *x = ReportNodePoolValidationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[211] + mi := &file_api_v1_recommendation_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TargetFilters) String() string { +func (x *ReportNodePoolValidationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TargetFilters) ProtoMessage() {} +func (*ReportNodePoolValidationRequest) ProtoMessage() {} -func (x *TargetFilters) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[211] +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 { @@ -17593,85 +21027,117 @@ 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{211} +// Deprecated: Use ReportNodePoolValidationRequest.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{234} } -func (x *TargetFilters) GetNamespaceNames() []string { +func (x *ReportNodePoolValidationRequest) GetClusterId() string { if x != nil { - return x.NamespaceNames + return x.ClusterId } - return nil + return "" } -func (x *TargetFilters) GetWorkloadNames() []string { +func (x *ReportNodePoolValidationRequest) GetNodepoolName() string { if x != nil { - return x.WorkloadNames + return x.NodepoolName } - return nil + return "" } -func (x *TargetFilters) GetNodeGroupNames() []string { +func (x *ReportNodePoolValidationRequest) GetNodeName() string { if x != nil { - return x.NodeGroupNames + return x.NodeName } - return nil + return "" } -func (x *TargetFilters) GetLabels() []string { +func (x *ReportNodePoolValidationRequest) GetInstanceType() string { if x != nil { - return x.Labels + return x.InstanceType } - return nil + return "" } -func (x *TargetFilters) GetKindFilter() []K8SObjectKind { +func (x *ReportNodePoolValidationRequest) GetZone() string { if x != nil { - return x.KindFilter + return x.Zone } - return nil + return "" } -func (x *TargetFilters) GetNamePattern() *RegexPattern { +func (x *ReportNodePoolValidationRequest) GetTeamId() string { if x != nil { - return x.NamePattern + return x.TeamId } - return nil + return "" } -func (x *TargetFilters) GetNamespacePattern() *RegexPattern { - if x != nil { - return x.NamespacePattern +type ReportNodePoolValidationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ReportNodePoolValidationResponse) Reset() { + *x = ReportNodePoolValidationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[235] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type GetAvailableKindsByTargetingFiltersResponse struct { +func (x *ReportNodePoolValidationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportNodePoolValidationResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReportNodePoolValidationResponse.ProtoReflect.Descriptor instead. +func (*ReportNodePoolValidationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{235} +} + +type GetNodePoolValidationsRequest 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"` + 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 *GetAvailableKindsByTargetingFiltersResponse) Reset() { - *x = GetAvailableKindsByTargetingFiltersResponse{} +func (x *GetNodePoolValidationsRequest) Reset() { + *x = GetNodePoolValidationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[212] + mi := &file_api_v1_recommendation_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { +func (x *GetNodePoolValidationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} +func (*GetNodePoolValidationsRequest) ProtoMessage() {} -func (x *GetAvailableKindsByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[212] +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 { @@ -17682,46 +21148,54 @@ 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{212} +// Deprecated: Use GetNodePoolValidationsRequest.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} } -func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { +func (x *GetNodePoolValidationsRequest) GetClusterId() string { if x != nil { - return x.Kinds + return x.ClusterId } - return nil + return "" } -type SearchResourcesByTargetingFiltersResponse struct { +func (x *GetNodePoolValidationsRequest) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +type NodePoolValidationReport 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"` + 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 *SearchResourcesByTargetingFiltersResponse) Reset() { - *x = SearchResourcesByTargetingFiltersResponse{} +func (x *NodePoolValidationReport) Reset() { + *x = NodePoolValidationReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[213] + mi := &file_api_v1_recommendation_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SearchResourcesByTargetingFiltersResponse) String() string { +func (x *NodePoolValidationReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} +func (*NodePoolValidationReport) ProtoMessage() {} -func (x *SearchResourcesByTargetingFiltersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[213] +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 { @@ -17732,64 +21206,71 @@ 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{213} +// Deprecated: Use NodePoolValidationReport.ProtoReflect.Descriptor instead. +func (*NodePoolValidationReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} } -func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { +func (x *NodePoolValidationReport) GetNodepoolName() string { if x != nil { - return x.Namespaces + return x.NodepoolName } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { +func (x *NodePoolValidationReport) GetNodeName() string { if x != nil { - return x.Workloads + return x.NodeName } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { +func (x *NodePoolValidationReport) GetInstanceType() string { if x != nil { - return x.NodeGroups + return x.InstanceType } - return nil + return "" } -func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { +func (x *NodePoolValidationReport) GetZone() string { if x != nil { - return x.Labels + return x.Zone + } + return "" +} + +func (x *NodePoolValidationReport) GetReportedAt() *timestamppb.Timestamp { + if x != nil { + return x.ReportedAt } return nil } -type NamespaceSearchResult struct { +type GetNodePoolValidationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Validations []*NodePoolValidationReport `protobuf:"bytes,1,rep,name=validations,proto3" json:"validations,omitempty"` } -func (x *NamespaceSearchResult) Reset() { - *x = NamespaceSearchResult{} +func (x *GetNodePoolValidationsResponse) Reset() { + *x = GetNodePoolValidationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[214] + mi := &file_api_v1_recommendation_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NamespaceSearchResult) String() string { +func (x *GetNodePoolValidationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NamespaceSearchResult) ProtoMessage() {} +func (*GetNodePoolValidationsResponse) ProtoMessage() {} -func (x *NamespaceSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[214] +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 { @@ -17800,44 +21281,47 @@ 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{214} +// Deprecated: Use GetNodePoolValidationsResponse.ProtoReflect.Descriptor instead. +func (*GetNodePoolValidationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{238} } -func (x *NamespaceSearchResult) GetName() string { +func (x *GetNodePoolValidationsResponse) GetValidations() []*NodePoolValidationReport { if x != nil { - return x.Name + return x.Validations } - return "" + return nil } -type WorkloadSearchResult struct { +type WorkloadCompatibilityWarning 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"` + 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 *WorkloadSearchResult) Reset() { - *x = WorkloadSearchResult{} +func (x *WorkloadCompatibilityWarning) Reset() { + *x = WorkloadCompatibilityWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[215] + mi := &file_api_v1_recommendation_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadSearchResult) String() string { +func (x *WorkloadCompatibilityWarning) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadSearchResult) ProtoMessage() {} +func (*WorkloadCompatibilityWarning) ProtoMessage() {} -func (x *WorkloadSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[215] +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 { @@ -17848,50 +21332,71 @@ 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{215} +// Deprecated: Use WorkloadCompatibilityWarning.ProtoReflect.Descriptor instead. +func (*WorkloadCompatibilityWarning) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{239} } -func (x *WorkloadSearchResult) GetKind() string { +func (x *WorkloadCompatibilityWarning) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" +} + +func (x *WorkloadCompatibilityWarning) GetWorkloadNamespace() string { + if x != nil { + return x.WorkloadNamespace + } + return "" +} + +func (x *WorkloadCompatibilityWarning) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *WorkloadSearchResult) GetName() string { +func (x *WorkloadCompatibilityWarning) GetNodeGroup() string { if x != nil { - return x.Name + return x.NodeGroup } return "" } -type NodeGroupSearchResult struct { +func (x *WorkloadCompatibilityWarning) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type ListNodePoliciesRequest 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"` } -func (x *NodeGroupSearchResult) Reset() { - *x = NodeGroupSearchResult{} +func (x *ListNodePoliciesRequest) Reset() { + *x = ListNodePoliciesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[216] + mi := &file_api_v1_recommendation_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeGroupSearchResult) String() string { +func (x *ListNodePoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeGroupSearchResult) ProtoMessage() {} +func (*ListNodePoliciesRequest) ProtoMessage() {} -func (x *NodeGroupSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[216] +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 { @@ -17902,44 +21407,43 @@ 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{216} +// Deprecated: Use ListNodePoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{240} } -func (x *NodeGroupSearchResult) GetName() string { +func (x *ListNodePoliciesRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -type LabelSearchResult struct { +type ListNodePoliciesResponse 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"` + Policies []*NodePolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *LabelSearchResult) Reset() { - *x = LabelSearchResult{} +func (x *ListNodePoliciesResponse) Reset() { + *x = ListNodePoliciesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[217] + mi := &file_api_v1_recommendation_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *LabelSearchResult) String() string { +func (x *ListNodePoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*LabelSearchResult) ProtoMessage() {} +func (*ListNodePoliciesResponse) ProtoMessage() {} -func (x *LabelSearchResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[217] +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 { @@ -17950,50 +21454,44 @@ 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{217} +// Deprecated: Use ListNodePoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListNodePoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{241} } -func (x *LabelSearchResult) GetKey() string { +func (x *ListNodePoliciesResponse) GetPolicies() []*NodePolicy { if x != nil { - return x.Key + return x.Policies } - return "" -} - -func (x *LabelSearchResult) GetValue() string { - if x != nil { - return x.Value - } - return "" + return nil } -type CreateNodePolicyTargetsRequest struct { +type UpdateNodePolicyRequest 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"` + Policy *NodePolicy `protobuf:"bytes,11,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *CreateNodePolicyTargetsRequest) Reset() { - *x = CreateNodePolicyTargetsRequest{} +func (x *UpdateNodePolicyRequest) Reset() { + *x = UpdateNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[218] + mi := &file_api_v1_recommendation_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsRequest) String() string { +func (x *UpdateNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} +func (*UpdateNodePolicyRequest) ProtoMessage() {} -func (x *CreateNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[218] +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 { @@ -18004,43 +21502,50 @@ 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{218} +// Deprecated: Use UpdateNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} } -func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { +func (x *UpdateNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Targets + return x.TeamId + } + return "" +} + +func (x *UpdateNodePolicyRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy } return nil } -type CreateNodePolicyTargetsResponse struct { +type UpdateNodePolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + Policy *NodePolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *CreateNodePolicyTargetsResponse) Reset() { - *x = CreateNodePolicyTargetsResponse{} +func (x *UpdateNodePolicyResponse) Reset() { + *x = UpdateNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[219] + mi := &file_api_v1_recommendation_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateNodePolicyTargetsResponse) String() string { +func (x *UpdateNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} +func (*UpdateNodePolicyResponse) ProtoMessage() {} -func (x *CreateNodePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[219] +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 { @@ -18051,43 +21556,53 @@ 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{219} +// Deprecated: Use UpdateNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{243} } -func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *UpdateNodePolicyResponse) GetPolicy() *NodePolicy { if x != nil { - return x.Targets + return x.Policy } return nil } -type ListNodePolicyTargetsRequest struct { +type NodeGroupCheckpointStatus 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"` + 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 *ListNodePolicyTargetsRequest) Reset() { - *x = ListNodePolicyTargetsRequest{} +func (x *NodeGroupCheckpointStatus) Reset() { + *x = NodeGroupCheckpointStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[220] + mi := &file_api_v1_recommendation_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListNodePolicyTargetsRequest) String() string { +func (x *NodeGroupCheckpointStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListNodePolicyTargetsRequest) ProtoMessage() {} +func (*NodeGroupCheckpointStatus) ProtoMessage() {} -func (x *ListNodePolicyTargetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[220] +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 { @@ -18098,90 +21613,79 @@ 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{220} +// Deprecated: Use NodeGroupCheckpointStatus.ProtoReflect.Descriptor instead. +func (*NodeGroupCheckpointStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{244} } -func (x *ListNodePolicyTargetsRequest) GetTeamId() string { +func (x *NodeGroupCheckpointStatus) GetState() NodeGroupCheckpointState { if x != nil { - return x.TeamId + return x.State } - return "" -} - -type ListNodePolicyTargetsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` + return NodeGroupCheckpointState_NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED } -func (x *ListNodePolicyTargetsResponse) Reset() { - *x = ListNodePolicyTargetsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[221] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodeGroupCheckpointStatus) GetPolicyId() string { + if x != nil { + return x.PolicyId } + return "" } -func (x *ListNodePolicyTargetsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodeGroupCheckpointStatus) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" } -func (*ListNodePolicyTargetsResponse) ProtoMessage() {} - -func (x *ListNodePolicyTargetsResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodeGroupCheckpointStatus) GetSharedNodePoolNames() []string { + if x != nil { + return x.SharedNodePoolNames } - return mi.MessageOf(x) + return nil } -// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{221} +func (x *NodeGroupCheckpointStatus) GetSharedClusterIds() []string { + if x != nil { + return x.SharedClusterIds + } + return nil } -func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { +func (x *NodeGroupCheckpointStatus) GetReason() CheckpointReason { if x != nil { - return x.Targets + return x.Reason } - return nil + return CheckpointReason_CHECKPOINT_REASON_UNSPECIFIED } -type UpdateNodePolicyTargetRequest struct { +type GetNodeGroupsCheckpointStatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,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 *UpdateNodePolicyTargetRequest) Reset() { - *x = UpdateNodePolicyTargetRequest{} +func (x *GetNodeGroupsCheckpointStatusRequest) Reset() { + *x = GetNodeGroupsCheckpointStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[222] + mi := &file_api_v1_recommendation_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyTargetRequest) String() string { +func (x *GetNodeGroupsCheckpointStatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusRequest) ProtoMessage() {} -func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[222] +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 { @@ -18192,43 +21696,51 @@ func (x *UpdateNodePolicyTargetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. -func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{222} +// Deprecated: Use GetNodeGroupsCheckpointStatusRequest.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} } -func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { +func (x *GetNodeGroupsCheckpointStatusRequest) GetTeamId() string { if x != nil { - return x.Target + return x.TeamId } - return nil + return "" } -type UpdateNodePolicyTargetResponse struct { +func (x *GetNodeGroupsCheckpointStatusRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +type GetNodeGroupsCheckpointStatusResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,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 *UpdateNodePolicyTargetResponse) Reset() { - *x = UpdateNodePolicyTargetResponse{} +func (x *GetNodeGroupsCheckpointStatusResponse) Reset() { + *x = GetNodeGroupsCheckpointStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[223] + mi := &file_api_v1_recommendation_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateNodePolicyTargetResponse) String() string { +func (x *GetNodeGroupsCheckpointStatusResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} +func (*GetNodeGroupsCheckpointStatusResponse) ProtoMessage() {} -func (x *UpdateNodePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[223] +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 { @@ -18239,58 +21751,46 @@ 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{223} +// Deprecated: Use GetNodeGroupsCheckpointStatusResponse.ProtoReflect.Descriptor instead. +func (*GetNodeGroupsCheckpointStatusResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{246} } -func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { +func (x *GetNodeGroupsCheckpointStatusResponse) GetByNodeGroup() map[string]*NodeGroupCheckpointStatus { if x != nil { - return x.Target + return x.ByNodeGroup } return nil } -type NodePolicyTarget struct { +type SetNodePolicyCheckpointLabelRequest 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"` - // 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"` + 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 *NodePolicyTarget) Reset() { - *x = NodePolicyTarget{} +func (x *SetNodePolicyCheckpointLabelRequest) Reset() { + *x = SetNodePolicyCheckpointLabelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[224] + mi := &file_api_v1_recommendation_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyTarget) String() string { +func (x *SetNodePolicyCheckpointLabelRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyTarget) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelRequest) ProtoMessage() {} -func (x *NodePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[224] +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 { @@ -18301,122 +21801,57 @@ 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{224} -} - -func (x *NodePolicyTarget) GetTargetId() string { - if x != nil { - return x.TargetId - } - return "" -} - -func (x *NodePolicyTarget) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *NodePolicyTarget) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use SetNodePolicyCheckpointLabelRequest.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} } -func (x *NodePolicyTarget) GetTeamId() string { +func (x *SetNodePolicyCheckpointLabelRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *NodePolicyTarget) GetClusterIds() []string { - if x != nil { - return x.ClusterIds - } - return nil -} - -func (x *NodePolicyTarget) GetPolicyId() string { +func (x *SetNodePolicyCheckpointLabelRequest) GetPolicyId() string { if x != nil { return x.PolicyId } return "" } -func (x *NodePolicyTarget) GetEnabled() bool { +func (x *SetNodePolicyCheckpointLabelRequest) GetEnabled() bool { if x != nil { return x.Enabled } return false } -func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { - if x != nil { - return x.DeletedAt - } - return nil -} - -func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { - if x != nil { - return x.Status - } - return nil -} - -type NodePolicyCondition struct { +type SetNodePolicyCheckpointLabelResponse 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"` + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *NodePolicyCondition) Reset() { - *x = NodePolicyCondition{} +func (x *SetNodePolicyCheckpointLabelResponse) Reset() { + *x = SetNodePolicyCheckpointLabelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[225] + mi := &file_api_v1_recommendation_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyCondition) String() string { +func (x *SetNodePolicyCheckpointLabelResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyCondition) ProtoMessage() {} +func (*SetNodePolicyCheckpointLabelResponse) ProtoMessage() {} -func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[225] +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 { @@ -18427,71 +21862,44 @@ func (x *NodePolicyCondition) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. -func (*NodePolicyCondition) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{225} -} - -func (x *NodePolicyCondition) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *NodePolicyCondition) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *NodePolicyCondition) GetReason() string { - if x != nil { - return x.Reason - } - return "" -} - -func (x *NodePolicyCondition) GetMessage() string { - if x != nil { - return x.Message - } - return "" +// Deprecated: Use SetNodePolicyCheckpointLabelResponse.ProtoReflect.Descriptor instead. +func (*SetNodePolicyCheckpointLabelResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{248} } -func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { +func (x *SetNodePolicyCheckpointLabelResponse) GetSuccess() bool { if x != nil { - return x.LastTransitionTime + return x.Success } - return nil + return false } -type NodePolicyTargetStatus struct { +type DeleteNodePolicyRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,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 *NodePolicyTargetStatus) Reset() { - *x = NodePolicyTargetStatus{} +func (x *DeleteNodePolicyRequest) Reset() { + *x = DeleteNodePolicyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[226] + mi := &file_api_v1_recommendation_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodePolicyTargetStatus) String() string { +func (x *DeleteNodePolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePolicyTargetStatus) ProtoMessage() {} +func (*DeleteNodePolicyRequest) ProtoMessage() {} -func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[226] +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 { @@ -18502,55 +21910,52 @@ func (x *NodePolicyTargetStatus) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. -func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{226} +// Deprecated: Use DeleteNodePolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{249} } -func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { +func (x *DeleteNodePolicyRequest) GetTeamId() string { if x != nil { - return x.Conditions + return x.TeamId } - return nil + return "" } -// 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 { +func (x *DeleteNodePolicyRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type DeleteNodePolicyResponse 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"` + 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 *ZonalShiftConfig) Reset() { - *x = ZonalShiftConfig{} +func (x *DeleteNodePolicyResponse) Reset() { + *x = DeleteNodePolicyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[227] + mi := &file_api_v1_recommendation_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ZonalShiftConfig) String() string { +func (x *DeleteNodePolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ZonalShiftConfig) ProtoMessage() {} +func (*DeleteNodePolicyResponse) ProtoMessage() {} -func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[227] +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 { @@ -18561,59 +21966,126 @@ func (x *ZonalShiftConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. -func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{227} -} - -func (x *ZonalShiftConfig) GetRespectZonalShift() bool { - if x != nil { - return x.RespectZonalShift - } - return false +// Deprecated: Use DeleteNodePolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteNodePolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} } -func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { +func (x *DeleteNodePolicyResponse) GetSuccess() bool { if x != nil { - return x.EvictImpactedNodes + return x.Success } return false } -func (x *ZonalShiftConfig) GetAllowZoneFallback() bool { +func (x *DeleteNodePolicyResponse) GetDeletedTargetCount() int32 { if x != nil { - return x.AllowZoneFallback + return x.DeletedTargetCount } - return false + return 0 } -type Taint struct { +type NodePolicy 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 + 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) + 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 *Taint) Reset() { - *x = Taint{} +func (x *NodePolicy) Reset() { + *x = NodePolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[228] + mi := &file_api_v1_recommendation_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Taint) String() string { +func (x *NodePolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Taint) ProtoMessage() {} +func (*NodePolicy) ProtoMessage() {} -func (x *Taint) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[228] +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 { @@ -18624,438 +22096,431 @@ func (x *Taint) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Taint.ProtoReflect.Descriptor instead. -func (*Taint) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{228} +// Deprecated: Use NodePolicy.ProtoReflect.Descriptor instead. +func (*NodePolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{251} } -func (x *Taint) GetKey() string { +func (x *NodePolicy) GetId() string { if x != nil { - return x.Key + return x.Id } return "" } -func (x *Taint) GetValue() string { +func (x *NodePolicy) GetName() string { if x != nil { - return x.Value + return x.Name } return "" } -func (x *Taint) GetEffect() string { +func (x *NodePolicy) GetDescription() string { if x != nil { - return x.Effect + return x.Description } return "" } -type DisruptionBudget struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - 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) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" } -func (x *DisruptionBudget) Reset() { - *x = DisruptionBudget{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[229] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetInstanceCategories() *LabelSelector { + if x != nil { + return x.InstanceCategories } + return nil } -func (x *DisruptionBudget) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetInstanceFamilies() *LabelSelector { + if x != nil { + return x.InstanceFamilies + } + return nil } -func (*DisruptionBudget) ProtoMessage() {} - -func (x *DisruptionBudget) 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 +func (x *NodePolicy) GetInstanceCpus() *LabelSelector { + if x != nil { + return x.InstanceCpus } - 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{229} +func (x *NodePolicy) GetInstanceHypervisors() *LabelSelector { + if x != nil { + return x.InstanceHypervisors + } + return nil } -func (x *DisruptionBudget) GetReasons() []string { +func (x *NodePolicy) GetInstanceGenerations() *LabelSelector { if x != nil { - return x.Reasons + return x.InstanceGenerations } return nil } -func (x *DisruptionBudget) GetNodes() string { +func (x *NodePolicy) GetInstanceSizes() *LabelSelector { if x != nil { - return x.Nodes + return x.InstanceSizes } - return "" + return nil } -func (x *DisruptionBudget) GetSchedule() string { +func (x *NodePolicy) GetInstanceShapes() *LabelSelector { if x != nil { - return x.Schedule + return x.InstanceShapes } - return "" + return nil } -func (x *DisruptionBudget) GetDuration() string { +func (x *NodePolicy) GetInstanceTypes() *LabelSelector { if x != nil { - return x.Duration + return x.InstanceTypes } - return "" + return nil } -type DisruptionPolicy 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"` +func (x *NodePolicy) GetInstanceLocalNvme() *LabelSelector { + if x != nil { + return x.InstanceLocalNvme + } + return nil } -func (x *DisruptionPolicy) Reset() { - *x = DisruptionPolicy{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[230] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicy) GetInstanceCategoriesTip() string { + if x != nil && x.InstanceCategoriesTip != nil { + return *x.InstanceCategoriesTip } + return "" } -func (x *DisruptionPolicy) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetInstanceFamiliesTip() string { + if x != nil && x.InstanceFamiliesTip != nil { + return *x.InstanceFamiliesTip + } + return "" } -func (*DisruptionPolicy) ProtoMessage() {} +func (x *NodePolicy) GetInstanceCpusTip() string { + if x != nil && x.InstanceCpusTip != nil { + return *x.InstanceCpusTip + } + return "" +} -func (x *DisruptionPolicy) 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 +func (x *NodePolicy) GetInstanceHypervisorsTip() string { + if x != nil && x.InstanceHypervisorsTip != nil { + return *x.InstanceHypervisorsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. -func (*DisruptionPolicy) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{230} +func (x *NodePolicy) GetInstanceGenerationsTip() string { + if x != nil && x.InstanceGenerationsTip != nil { + return *x.InstanceGenerationsTip + } + return "" } -func (x *DisruptionPolicy) GetConsolidateAfter() string { - if x != nil { - return x.ConsolidateAfter +func (x *NodePolicy) GetInstanceSizesTip() string { + if x != nil && x.InstanceSizesTip != nil { + return *x.InstanceSizesTip } return "" } -func (x *DisruptionPolicy) GetConsolidationPolicy() string { - if x != nil { - return x.ConsolidationPolicy +func (x *NodePolicy) GetInstanceShapesTip() string { + if x != nil && x.InstanceShapesTip != nil { + return *x.InstanceShapesTip } return "" } -func (x *DisruptionPolicy) GetExpireAfter() string { - if x != nil { - return x.ExpireAfter +func (x *NodePolicy) GetInstanceLocalNvmeTip() string { + if x != nil && x.InstanceLocalNvmeTip != nil { + return *x.InstanceLocalNvmeTip } return "" } -func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { +func (x *NodePolicy) GetZones() *LabelSelector { if x != nil { - return x.TtlSecondsAfterEmpty + return x.Zones } - return 0 + return nil } -func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { +func (x *NodePolicy) GetArchitectures() *LabelSelector { if x != nil { - return x.TerminationGracePeriodSeconds + return x.Architectures } - return 0 + return nil } -func (x *DisruptionPolicy) GetBudgets() []*DisruptionBudget { +func (x *NodePolicy) GetCapacityTypes() *LabelSelector { if x != nil { - return x.Budgets + return x.CapacityTypes } return nil } -type ResourceLimits struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetOperatingSystems() *LabelSelector { + if x != nil { + return x.OperatingSystems + } + return nil +} - 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 *NodePolicy) GetWeight() int32 { + if x != nil { + return x.Weight + } + return 0 } -func (x *ResourceLimits) Reset() { - *x = ResourceLimits{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[231] - 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 *ResourceLimits) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetArchitecturesTip() string { + if x != nil && x.ArchitecturesTip != nil { + return *x.ArchitecturesTip + } + return "" } -func (*ResourceLimits) ProtoMessage() {} +func (x *NodePolicy) GetCapacityTypeTip() string { + if x != nil && x.CapacityTypeTip != nil { + return *x.CapacityTypeTip + } + return "" +} -func (x *ResourceLimits) 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) GetOperatingSystemsTip() string { + if x != nil && x.OperatingSystemsTip != nil { + return *x.OperatingSystemsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. -func (*ResourceLimits) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{231} +func (x *NodePolicy) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil } -func (x *ResourceLimits) GetCpu() string { +func (x *NodePolicy) GetTaints() []*Taint { if x != nil { - return x.Cpu + return x.Taints } - return "" + return nil } -func (x *ResourceLimits) GetMemory() string { +func (x *NodePolicy) GetDisruption() *DisruptionPolicy { if x != nil { - return x.Memory + return x.Disruption } - return "" + return nil } -// Provider-specific stubs -type AWSNodeClassSpec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicy) GetLimits() *ResourceLimits { + if x != nil { + return x.Limits + } + return nil +} - 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 *NodePolicy) GetStartupTaints() []*Taint { + if x != nil { + return x.StartupTaints + } + return nil } -func (x *AWSNodeClassSpec) Reset() { - *x = AWSNodeClassSpec{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[232] - 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 *AWSNodeClassSpec) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicy) GetDisruptionsTip() string { + if x != nil && x.DisruptionsTip != nil { + return *x.DisruptionsTip + } + return "" } -func (*AWSNodeClassSpec) ProtoMessage() {} +func (x *NodePolicy) GetLimitsTip() string { + if x != nil && x.LimitsTip != nil { + return *x.LimitsTip + } + return "" +} -func (x *AWSNodeClassSpec) 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) GetStartupTaintsTip() string { + if x != nil && x.StartupTaintsTip != nil { + return *x.StartupTaintsTip } - return mi.MessageOf(x) + return "" } -// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. -func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{232} +func (x *NodePolicy) GetMasterOverrideRoleName() string { + if x != nil { + return x.MasterOverrideRoleName + } + return "" } -func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { +func (x *NodePolicy) GetNodePoolName() string { if x != nil { - return x.SubnetSelectorTerms + return x.NodePoolName } - return nil + return "" } -func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { +func (x *NodePolicy) GetNodeClassName() string { if x != nil { - return x.SecurityGroupSelectorTerms + return x.NodeClassName } - return nil + return "" } -func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { +func (x *NodePolicy) GetAws() *AWSNodeClassSpec { if x != nil { - return x.CapacityReservationSelectorTerms + return x.Aws } return nil } -func (x *AWSNodeClassSpec) GetAssociatePublicIpAddress() bool { - if x != nil && x.AssociatePublicIpAddress != nil { - return *x.AssociatePublicIpAddress +func (x *NodePolicy) GetGcp() *GCPNodeClassSpec { + if x != nil { + return x.Gcp } - return false + return nil } -func (x *AWSNodeClassSpec) GetAmiSelectorTerms() []*AMISelectorTerm { +func (x *NodePolicy) GetAzure() *AzureNodeClassSpec { if x != nil { - return x.AmiSelectorTerms + return x.Azure } return nil } -func (x *AWSNodeClassSpec) GetAmiFamily() string { - if x != nil && x.AmiFamily != nil { - return *x.AmiFamily +func (x *NodePolicy) GetOci() *OCINodeClassSpec { + if x != nil { + return x.Oci } - return "" + return nil } -func (x *AWSNodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData +func (x *NodePolicy) GetCloudProviderId() int64 { + if x != nil && x.CloudProviderId != nil { + return *x.CloudProviderId } - return "" + return 0 } -func (x *AWSNodeClassSpec) GetRole() string { - if x != nil && x.Role != nil { - return *x.Role +func (x *NodePolicy) GetCloudProvider() *CloudProvider { + if x != nil { + return x.CloudProvider } - return "" + return nil } -func (x *AWSNodeClassSpec) GetInstanceProfile() string { - if x != nil && x.InstanceProfile != nil { - return *x.InstanceProfile +func (x *NodePolicy) GetZonalShift() *ZonalShiftConfig { + if x != nil { + return x.ZonalShift } - return "" + return nil } -func (x *AWSNodeClassSpec) GetTags() map[string]string { +func (x *NodePolicy) GetRaw() []*RawKarpenterSpec { if x != nil { - return x.Tags + return x.Raw } return nil } -func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { +func (x *NodePolicy) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kubelet + return x.CreatedAt } return nil } -func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { +func (x *NodePolicy) 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 +func (x *NodePolicy) GetDeletedAt() *timestamppb.Timestamp { + if x != nil { + return x.DeletedAt } - return InstanceStorePolicy_INSTANCE_STORE_POLICY_RAID0 + return nil } -func (x *AWSNodeClassSpec) GetDetailedMonitoring() bool { - if x != nil && x.DetailedMonitoring != nil { - return *x.DetailedMonitoring +func (x *NodePolicy) GetSource() string { + if x != nil { + return x.Source } - return false + return "" } -func (x *AWSNodeClassSpec) GetMetadataOptions() *MetadataOptions { +func (x *NodePolicy) GetSourceClusterId() string { if x != nil { - return x.MetadataOptions + return x.SourceClusterId } - return nil + return "" } -func (x *AWSNodeClassSpec) GetContext() string { - if x != nil && x.Context != nil { - return *x.Context +func (x *NodePolicy) GetUnrepresentedRequirementKeys() []string { + if x != nil { + return x.UnrepresentedRequirementKeys } - return "" + return nil } -type GetInstanceFamiliesRequest struct { +type PreviewNodeRecommendationConfigRequest 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"` + 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 *GetInstanceFamiliesRequest) Reset() { - *x = GetInstanceFamiliesRequest{} +func (x *PreviewNodeRecommendationConfigRequest) Reset() { + *x = PreviewNodeRecommendationConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[233] + mi := &file_api_v1_recommendation_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesRequest) String() string { +func (x *PreviewNodeRecommendationConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesRequest) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigRequest) ProtoMessage() {} -func (x *GetInstanceFamiliesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[233] +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 { @@ -19066,43 +22531,64 @@ 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{233} +// Deprecated: Use PreviewNodeRecommendationConfigRequest.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{252} } -func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { +func (x *PreviewNodeRecommendationConfigRequest) GetTeamId() string { if x != nil { - return x.CloudProviders + return x.TeamId + } + return "" +} + +func (x *PreviewNodeRecommendationConfigRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *PreviewNodeRecommendationConfigRequest) GetPolicies() []*NodePolicy { + if x != nil { + return x.Policies } return nil } -type GetInstanceFamiliesResponse struct { +func (x *PreviewNodeRecommendationConfigRequest) GetPolicyIds() []string { + if x != nil { + return x.PolicyIds + } + return nil +} + +type PreviewNodeRecommendationConfigResponse 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"` + Nrc *NodeRecommendationConfig `protobuf:"bytes,1,opt,name=nrc,proto3" json:"nrc,omitempty"` } -func (x *GetInstanceFamiliesResponse) Reset() { - *x = GetInstanceFamiliesResponse{} +func (x *PreviewNodeRecommendationConfigResponse) Reset() { + *x = PreviewNodeRecommendationConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[234] + mi := &file_api_v1_recommendation_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceFamiliesResponse) String() string { +func (x *PreviewNodeRecommendationConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceFamiliesResponse) ProtoMessage() {} +func (*PreviewNodeRecommendationConfigResponse) ProtoMessage() {} -func (x *GetInstanceFamiliesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[234] +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 { @@ -19113,43 +22599,51 @@ 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{234} +// Deprecated: Use PreviewNodeRecommendationConfigResponse.ProtoReflect.Descriptor instead. +func (*PreviewNodeRecommendationConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{253} } -func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { +func (x *PreviewNodeRecommendationConfigResponse) GetNrc() *NodeRecommendationConfig { if x != nil { - return x.InstanceFamilies + return x.Nrc } return nil } -type GetInstanceSizesRequest struct { +type NodeRecommendationConfig 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") -} - -func (x *GetInstanceSizesRequest) Reset() { - *x = GetInstanceSizesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[235] + 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 *NodeRecommendationConfig) Reset() { + *x = NodeRecommendationConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceSizesRequest) String() string { +func (x *NodeRecommendationConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceSizesRequest) ProtoMessage() {} +func (*NodeRecommendationConfig) ProtoMessage() {} -func (x *GetInstanceSizesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[235] +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 { @@ -19160,91 +22654,100 @@ 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{235} +// Deprecated: Use NodeRecommendationConfig.ProtoReflect.Descriptor instead. +func (*NodeRecommendationConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{254} } -func (x *GetInstanceSizesRequest) GetCloudProviders() []string { +func (x *NodeRecommendationConfig) GetId() string { if x != nil { - return x.CloudProviders + return x.Id } - return nil + return "" } -type GetInstanceSizesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodeRecommendationConfig) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} - InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` +func (x *NodeRecommendationConfig) GetPolicyContainersJson() string { + if x != nil { + return x.PolicyContainersJson + } + return "" } -func (x *GetInstanceSizesResponse) Reset() { - *x = GetInstanceSizesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[236] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodeRecommendationConfig) GetPolicyContainersYaml() string { + if x != nil { + return x.PolicyContainersYaml } + return "" } -func (x *GetInstanceSizesResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodeRecommendationConfig) GetStatus() RecommendationStatus { + if x != nil { + return x.Status + } + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED } -func (*GetInstanceSizesResponse) ProtoMessage() {} +func (x *NodeRecommendationConfig) GetError() string { + if x != nil { + return x.Error + } + return "" +} -func (x *GetInstanceSizesResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodeRecommendationConfig) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } - return mi.MessageOf(x) + return nil } -// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{236} +func (x *NodeRecommendationConfig) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil } -func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { +func (x *NodeRecommendationConfig) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.InstanceSizes + return x.DeletedAt } return nil } -type InstanceFamily struct { +type SuggestedKarpenterConfigRequest 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"` + 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 *InstanceFamily) Reset() { - *x = InstanceFamily{} +func (x *SuggestedKarpenterConfigRequest) Reset() { + *x = SuggestedKarpenterConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[237] + mi := &file_api_v1_recommendation_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceFamily) String() string { +func (x *SuggestedKarpenterConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceFamily) ProtoMessage() {} +func (*SuggestedKarpenterConfigRequest) ProtoMessage() {} -func (x *InstanceFamily) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[237] +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 { @@ -19255,51 +22758,51 @@ func (x *InstanceFamily) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. -func (*InstanceFamily) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{237} +// Deprecated: Use SuggestedKarpenterConfigRequest.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{255} } -func (x *InstanceFamily) GetName() string { +func (x *SuggestedKarpenterConfigRequest) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *InstanceFamily) GetProviderName() string { +func (x *SuggestedKarpenterConfigRequest) GetTeamId() string { if x != nil { - return x.ProviderName + return x.TeamId } return "" } -type InstanceSize struct { +type SuggestedKarpenterConfigResponse 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"` + 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 *InstanceSize) Reset() { - *x = InstanceSize{} +func (x *SuggestedKarpenterConfigResponse) Reset() { + *x = SuggestedKarpenterConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[238] + mi := &file_api_v1_recommendation_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceSize) String() string { +func (x *SuggestedKarpenterConfigResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceSize) ProtoMessage() {} +func (*SuggestedKarpenterConfigResponse) ProtoMessage() {} -func (x *InstanceSize) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[238] +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 { @@ -19310,52 +22813,61 @@ 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{238} +// Deprecated: Use SuggestedKarpenterConfigResponse.ProtoReflect.Descriptor instead. +func (*SuggestedKarpenterConfigResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{256} } -func (x *InstanceSize) GetName() string { +func (x *SuggestedKarpenterConfigResponse) GetNgToOriginal() map[string]*NodeRecommendationConfig { if x != nil { - return x.Name + return x.NgToOriginal } - return "" + return nil } -func (x *InstanceSize) GetProviderName() string { +func (x *SuggestedKarpenterConfigResponse) GetNgToSuggested() map[string]*NodeRecommendationConfig { if x != nil { - return x.ProviderName + return x.NgToSuggested } - return "" + return nil } -type InstanceCategory struct { +type SuggestNodePolicyImprovementsRequest 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" + 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 *InstanceCategory) Reset() { - *x = InstanceCategory{} +func (x *SuggestNodePolicyImprovementsRequest) Reset() { + *x = SuggestNodePolicyImprovementsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[239] + mi := &file_api_v1_recommendation_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCategory) String() string { +func (x *SuggestNodePolicyImprovementsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCategory) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsRequest) ProtoMessage() {} -func (x *InstanceCategory) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[239] +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 { @@ -19366,58 +22878,84 @@ 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{239} +// Deprecated: Use SuggestNodePolicyImprovementsRequest.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{257} } -func (x *InstanceCategory) GetKey() string { +func (x *SuggestNodePolicyImprovementsRequest) GetTeamId() string { if x != nil { - return x.Key + return x.TeamId } return "" } -func (x *InstanceCategory) GetLabel() string { +func (x *SuggestNodePolicyImprovementsRequest) GetClusterId() string { if x != nil { - return x.Label + return x.ClusterId } return "" } -func (x *InstanceCategory) GetProviderName() string { +func (x *SuggestNodePolicyImprovementsRequest) GetPolicyId() string { if x != nil { - return x.ProviderName + return x.PolicyId } return "" } -type InstanceCPU struct { +func (x *SuggestNodePolicyImprovementsRequest) GetPolicy() *NodePolicy { + if x != nil { + return x.Policy + } + return nil +} + +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 - 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" + 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 *InstanceCPU) Reset() { - *x = InstanceCPU{} +func (x *SuggestNodePolicyImprovementsResponse) Reset() { + *x = SuggestNodePolicyImprovementsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[240] + mi := &file_api_v1_recommendation_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceCPU) String() string { +func (x *SuggestNodePolicyImprovementsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceCPU) ProtoMessage() {} +func (*SuggestNodePolicyImprovementsResponse) ProtoMessage() {} -func (x *InstanceCPU) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[240] +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 { @@ -19428,51 +22966,88 @@ 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{240} +// Deprecated: Use SuggestNodePolicyImprovementsResponse.ProtoReflect.Descriptor instead. +func (*SuggestNodePolicyImprovementsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{258} } -func (x *InstanceCPU) GetVcpu() int32 { +func (x *SuggestNodePolicyImprovementsResponse) GetOriginal() *NodePolicy { if x != nil { - return x.Vcpu + return x.Original } - return 0 + return nil } -func (x *InstanceCPU) GetProviderName() string { +func (x *SuggestNodePolicyImprovementsResponse) GetSuggested() *NodePolicy { if x != nil { - return x.ProviderName + return x.Suggested } - return "" + return nil } -type InstanceTypeName struct { +func (x *SuggestNodePolicyImprovementsResponse) GetSuggestions() []*NodePolicySuggestion { + if x != nil { + return x.Suggestions + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetContext() *SuggestionContext { + if x != nil { + return x.Context + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *SuggestNodePolicyImprovementsResponse) GetFromCache() bool { + if x != nil { + return x.FromCache + } + return false +} + +func (x *SuggestNodePolicyImprovementsResponse) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +type ListClusterNodePolicySuggestionsRequest 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" + 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 *InstanceTypeName) Reset() { - *x = InstanceTypeName{} +func (x *ListClusterNodePolicySuggestionsRequest) Reset() { + *x = ListClusterNodePolicySuggestionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[241] + mi := &file_api_v1_recommendation_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *InstanceTypeName) String() string { +func (x *ListClusterNodePolicySuggestionsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*InstanceTypeName) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsRequest) ProtoMessage() {} -func (x *InstanceTypeName) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[241] +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 { @@ -19483,50 +23058,65 @@ 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{241} +// Deprecated: Use ListClusterNodePolicySuggestionsRequest.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{259} } -func (x *InstanceTypeName) GetName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetTeamId() string { if x != nil { - return x.Name + return x.TeamId } return "" } -func (x *InstanceTypeName) GetProviderName() string { +func (x *ListClusterNodePolicySuggestionsRequest) GetClusterId() string { if x != nil { - return x.ProviderName + return x.ClusterId } return "" } -type GetInstanceCategoriesRequest 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 - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` + 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 *GetInstanceCategoriesRequest) Reset() { - *x = GetInstanceCategoriesRequest{} +func (x *ListClusterNodePolicySuggestionsResponse) Reset() { + *x = ListClusterNodePolicySuggestionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[242] + mi := &file_api_v1_recommendation_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCategoriesRequest) String() string { +func (x *ListClusterNodePolicySuggestionsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCategoriesRequest) ProtoMessage() {} +func (*ListClusterNodePolicySuggestionsResponse) ProtoMessage() {} -func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[242] +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 { @@ -19537,43 +23127,73 @@ func (x *GetInstanceCategoriesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. -func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{242} +// Deprecated: Use ListClusterNodePolicySuggestionsResponse.ProtoReflect.Descriptor instead. +func (*ListClusterNodePolicySuggestionsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{260} } -func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { +func (x *ListClusterNodePolicySuggestionsResponse) GetPolicies() []*NodePolicySuggestionsForPolicy { if x != nil { - return x.CloudProviders + return x.Policies } return nil } -type GetInstanceCategoriesResponse struct { +func (x *ListClusterNodePolicySuggestionsResponse) GetComputedAt() *timestamppb.Timestamp { + if x != nil { + return x.ComputedAt + } + return nil +} + +func (x *ListClusterNodePolicySuggestionsResponse) GetStale() bool { + if x != nil { + return x.Stale + } + return false +} + +// 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 - InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,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"` + // "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 *GetInstanceCategoriesResponse) Reset() { - *x = GetInstanceCategoriesResponse{} +func (x *NodePolicySuggestionsForPolicy) Reset() { + *x = NodePolicySuggestionsForPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[243] + mi := &file_api_v1_recommendation_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCategoriesResponse) String() string { +func (x *NodePolicySuggestionsForPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCategoriesResponse) ProtoMessage() {} +func (*NodePolicySuggestionsForPolicy) ProtoMessage() {} -func (x *GetInstanceCategoriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[243] +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 { @@ -19584,43 +23204,139 @@ 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{243} +// Deprecated: Use NodePolicySuggestionsForPolicy.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestionsForPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{261} } -func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { +func (x *NodePolicySuggestionsForPolicy) GetPolicyId() string { if x != nil { - return x.InstanceCategories + return x.PolicyId + } + return "" +} + +func (x *NodePolicySuggestionsForPolicy) GetPolicyName() string { + if x != nil { + return x.PolicyName + } + return "" +} + +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 } -type GetInstanceCPUsRequest struct { +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 - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` -} - -func (x *GetInstanceCPUsRequest) Reset() { - *x = GetInstanceCPUsRequest{} + // 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[244] + mi := &file_api_v1_recommendation_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceCPUsRequest) String() string { +func (x *NodePolicySuggestion) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceCPUsRequest) ProtoMessage() {} +func (*NodePolicySuggestion) ProtoMessage() {} -func (x *GetInstanceCPUsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[244] +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 { @@ -19631,90 +23347,134 @@ 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{244} +// Deprecated: Use NodePolicySuggestion.ProtoReflect.Descriptor instead. +func (*NodePolicySuggestion) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{262} } -func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { +func (x *NodePolicySuggestion) GetRuleId() string { if x != nil { - return x.CloudProviders + return x.RuleId } - return nil + return "" } -type GetInstanceCPUsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *NodePolicySuggestion) GetGroup() SuggestionGroup { + if x != nil { + return x.Group + } + return SuggestionGroup_SUGGESTION_GROUP_UNSPECIFIED +} - InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` +func (x *NodePolicySuggestion) GetFlavor() SuggestionFlavor { + if x != nil { + return x.Flavor + } + return SuggestionFlavor_SUGGESTION_FLAVOR_UNSPECIFIED } -func (x *GetInstanceCPUsResponse) Reset() { - *x = GetInstanceCPUsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[245] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicySuggestion) GetSeverity() SuggestionSeverity { + if x != nil { + return x.Severity } + return SuggestionSeverity_SUGGESTION_SEVERITY_UNSPECIFIED } -func (x *GetInstanceCPUsResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicySuggestion) GetFieldPath() string { + if x != nil { + return x.FieldPath + } + return "" } -func (*GetInstanceCPUsResponse) ProtoMessage() {} +func (x *NodePolicySuggestion) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} -func (x *GetInstanceCPUsResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicySuggestion) GetRationale() string { + if x != nil { + return x.Rationale } - return mi.MessageOf(x) + return "" } -// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{245} +func (x *NodePolicySuggestion) GetCurrentValueYaml() string { + if x != nil { + return x.CurrentValueYaml + } + return "" } -func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { +func (x *NodePolicySuggestion) GetSuggestedValueYaml() string { if x != nil { - return x.InstanceCpus + return x.SuggestedValueYaml + } + return "" +} + +func (x *NodePolicySuggestion) GetEvidence() []*SuggestionEvidence { + if x != nil { + return x.Evidence } return nil } -type GetInstanceTypeNamesRequest 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 - CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,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 *GetInstanceTypeNamesRequest) Reset() { - *x = GetInstanceTypeNamesRequest{} +func (x *SuggestionFieldChange) Reset() { + *x = SuggestionFieldChange{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[246] + mi := &file_api_v1_recommendation_proto_msgTypes[263] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceTypeNamesRequest) String() string { +func (x *SuggestionFieldChange) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceTypeNamesRequest) ProtoMessage() {} +func (*SuggestionFieldChange) ProtoMessage() {} -func (x *GetInstanceTypeNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[246] +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 { @@ -19725,43 +23485,70 @@ 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{246} +// Deprecated: Use SuggestionFieldChange.ProtoReflect.Descriptor instead. +func (*SuggestionFieldChange) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{263} } -func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { +func (x *SuggestionFieldChange) GetFieldPath() string { if x != nil { - return x.CloudProviders + return x.FieldPath } - return nil + return "" } -type GetInstanceTypeNamesResponse 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 - InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,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 *GetInstanceTypeNamesResponse) Reset() { - *x = GetInstanceTypeNamesResponse{} +func (x *SuggestionEvidence) Reset() { + *x = SuggestionEvidence{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[247] + mi := &file_api_v1_recommendation_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetInstanceTypeNamesResponse) String() string { +func (x *SuggestionEvidence) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetInstanceTypeNamesResponse) ProtoMessage() {} +func (*SuggestionEvidence) ProtoMessage() {} -func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[247] +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 { @@ -19772,44 +23559,84 @@ func (x *GetInstanceTypeNamesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. -func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{247} +// Deprecated: Use SuggestionEvidence.ProtoReflect.Descriptor instead. +func (*SuggestionEvidence) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{264} } -func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { +func (x *SuggestionEvidence) GetLabel() string { if x != nil { - return x.InstanceTypes + return x.Label } - return nil + return "" } -type SubnetSelectorTerm 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"` +func (x *SuggestionEvidence) GetValue() string { + if x != nil { + return x.Value + } + return "" } -func (x *SubnetSelectorTerm) Reset() { - *x = SubnetSelectorTerm{} +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 +} + +// 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 + + 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 *SuggestionWorkloadRef) Reset() { + *x = SuggestionWorkloadRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[248] + mi := &file_api_v1_recommendation_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SubnetSelectorTerm) String() string { +func (x *SuggestionWorkloadRef) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SubnetSelectorTerm) ProtoMessage() {} +func (*SuggestionWorkloadRef) ProtoMessage() {} -func (x *SubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[248] +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 { @@ -19820,52 +23647,87 @@ 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{248} +// Deprecated: Use SuggestionWorkloadRef.ProtoReflect.Descriptor instead. +func (*SuggestionWorkloadRef) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{265} } -func (x *SubnetSelectorTerm) GetTags() map[string]string { +func (x *SuggestionWorkloadRef) GetUid() string { if x != nil { - return x.Tags + return x.Uid } - return nil + return "" } -func (x *SubnetSelectorTerm) GetId() string { +func (x *SuggestionWorkloadRef) GetKind() string { if x != nil { - return x.Id + return x.Kind } return "" } -type SecurityGroupSelectorTerm struct { +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 - 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"` + 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 *SecurityGroupSelectorTerm) Reset() { - *x = SecurityGroupSelectorTerm{} +func (x *SuggestionContext) Reset() { + *x = SuggestionContext{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[249] + mi := &file_api_v1_recommendation_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SecurityGroupSelectorTerm) String() string { +func (x *SuggestionContext) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SecurityGroupSelectorTerm) ProtoMessage() {} +func (*SuggestionContext) ProtoMessage() {} -func (x *SecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[249] +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 { @@ -19876,59 +23738,80 @@ 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{249} +// Deprecated: Use SuggestionContext.ProtoReflect.Descriptor instead. +func (*SuggestionContext) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} } -func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { +func (x *SuggestionContext) GetWindow() ProfileWindow { if x != nil { - return x.Tags + return x.Window + } + return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED +} + +func (x *SuggestionContext) GetMatchedNodePools() []string { + if x != nil { + return x.MatchedNodePools } return nil } -func (x *SecurityGroupSelectorTerm) GetId() string { +func (x *SuggestionContext) GetNodeCount() int32 { if x != nil { - return x.Id + return x.NodeCount } - return "" + return 0 } -func (x *SecurityGroupSelectorTerm) GetName() string { +func (x *SuggestionContext) GetEvidenceScope() EvidenceScope { if x != nil { - return x.Name + return x.EvidenceScope } - return "" + return EvidenceScope_EVIDENCE_SCOPE_UNSPECIFIED } -type CapacityReservationSelectorTerm struct { +func (x *SuggestionContext) GetWorkloadProfileCount() int32 { + if x != nil { + return x.WorkloadProfileCount + } + return 0 +} + +func (x *SuggestionContext) GetUnrepresentedRequirementKeys() []string { + if x != nil { + return x.UnrepresentedRequirementKeys + } + return nil +} + +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"` - OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_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 *CapacityReservationSelectorTerm) Reset() { - *x = CapacityReservationSelectorTerm{} +func (x *GetAvailableKindsByTargetingFiltersRequest) Reset() { + *x = GetAvailableKindsByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[250] + mi := &file_api_v1_recommendation_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CapacityReservationSelectorTerm) String() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CapacityReservationSelectorTerm) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersRequest) ProtoMessage() {} -func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[250] +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 { @@ -19939,62 +23822,62 @@ func (x *CapacityReservationSelectorTerm) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. -func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{250} +// Deprecated: Use GetAvailableKindsByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{267} } -func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Tags + return x.TeamId } - return nil + return "" } -func (x *CapacityReservationSelectorTerm) GetId() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetClusterIds() []string { if x != nil { - return x.Id + return x.ClusterIds } - return "" + return nil } -func (x *CapacityReservationSelectorTerm) GetOwnerId() string { +func (x *GetAvailableKindsByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.OwnerId + return x.TargetFilters } - return "" + return nil } -type AMISelectorTerm struct { +// SearchResourcesByTargetingFilters allows searching for resources that match targeting filter criteria +type SearchResourcesByTargetingFiltersRequest 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"` + 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 *AMISelectorTerm) Reset() { - *x = AMISelectorTerm{} +func (x *SearchResourcesByTargetingFiltersRequest) Reset() { + *x = SearchResourcesByTargetingFiltersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[251] + mi := &file_api_v1_recommendation_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AMISelectorTerm) String() string { +func (x *SearchResourcesByTargetingFiltersRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AMISelectorTerm) ProtoMessage() {} +func (*SearchResourcesByTargetingFiltersRequest) ProtoMessage() {} -func (x *AMISelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[251] +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 { @@ -20005,89 +23888,79 @@ 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{251} +// Deprecated: Use SearchResourcesByTargetingFiltersRequest.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{268} } -func (x *AMISelectorTerm) GetAlias() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTeamId() string { if x != nil { - return x.Alias + return x.TeamId } return "" } -func (x *AMISelectorTerm) GetTags() map[string]string { +func (x *SearchResourcesByTargetingFiltersRequest) GetClusterIds() []string { if x != nil { - return x.Tags + return x.ClusterIds } return nil } -func (x *AMISelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *AMISelectorTerm) GetName() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetSearchQuery() string { if x != nil { - return x.Name + return x.SearchQuery } return "" } -func (x *AMISelectorTerm) GetOwner() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilterType() TargetFilterType { if x != nil { - return x.Owner + return x.TargetFilterType } - return "" + return TargetFilterType_TARGET_FILTER_TYPE_UNSPECIFIED } -func (x *AMISelectorTerm) GetSsmParameter() string { +func (x *SearchResourcesByTargetingFiltersRequest) GetTargetFilters() *TargetFilters { if x != nil { - return x.SsmParameter + return x.TargetFilters } - return "" + return nil } -type KubeletConfiguration struct { +type TargetFilters 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"` + 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 *KubeletConfiguration) Reset() { - *x = KubeletConfiguration{} +func (x *TargetFilters) Reset() { + *x = TargetFilters{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[252] + mi := &file_api_v1_recommendation_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KubeletConfiguration) String() string { +func (x *TargetFilters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KubeletConfiguration) ProtoMessage() {} +func (*TargetFilters) ProtoMessage() {} -func (x *KubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[252] +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 { @@ -20098,122 +23971,85 @@ 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{252} +// Deprecated: Use TargetFilters.ProtoReflect.Descriptor instead. +func (*TargetFilters) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{269} } -func (x *KubeletConfiguration) GetClusterDns() []string { +func (x *TargetFilters) GetNamespaceNames() []string { if x != nil { - return x.ClusterDns + return x.NamespaceNames } return nil } -func (x *KubeletConfiguration) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods - } - return 0 -} - -func (x *KubeletConfiguration) GetPodsPerCore() int32 { - if x != nil && x.PodsPerCore != nil { - return *x.PodsPerCore - } - return 0 -} - -func (x *KubeletConfiguration) GetSystemReserved() map[string]string { +func (x *TargetFilters) GetWorkloadNames() []string { if x != nil { - return x.SystemReserved + return x.WorkloadNames } return nil } -func (x *KubeletConfiguration) GetKubeReserved() map[string]string { +func (x *TargetFilters) GetNodeGroupNames() []string { if x != nil { - return x.KubeReserved + return x.NodeGroupNames } return nil } -func (x *KubeletConfiguration) GetEvictionHard() map[string]string { +func (x *TargetFilters) GetLabels() []string { if x != nil { - return x.EvictionHard + return x.Labels } return nil } -func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { +func (x *TargetFilters) GetKindFilter() []K8SObjectKind { if x != nil { - return x.EvictionSoft + return x.KindFilter } return nil } -func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { +func (x *TargetFilters) GetNamePattern() *RegexPattern { if x != nil { - return x.EvictionSoftGracePeriod + return x.NamePattern } 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 - } - return 0 -} - -func (x *KubeletConfiguration) GetCpuCfsQuota() bool { - if x != nil && x.CpuCfsQuota != nil { - return *x.CpuCfsQuota +func (x *TargetFilters) GetNamespacePattern() *RegexPattern { + if x != nil { + return x.NamespacePattern } - return false + return nil } -type BlockDeviceMapping struct { +type GetAvailableKindsByTargetingFiltersResponse 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"` + Kinds []K8SObjectKind `protobuf:"varint,1,rep,packed,name=kinds,proto3,enum=api.v1.K8SObjectKind" json:"kinds,omitempty"` } -func (x *BlockDeviceMapping) Reset() { - *x = BlockDeviceMapping{} +func (x *GetAvailableKindsByTargetingFiltersResponse) Reset() { + *x = GetAvailableKindsByTargetingFiltersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[253] + mi := &file_api_v1_recommendation_proto_msgTypes[270] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDeviceMapping) String() string { +func (x *GetAvailableKindsByTargetingFiltersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDeviceMapping) ProtoMessage() {} +func (*GetAvailableKindsByTargetingFiltersResponse) ProtoMessage() {} -func (x *BlockDeviceMapping) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[253] +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 { @@ -20224,65 +24060,46 @@ 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{253} -} - -func (x *BlockDeviceMapping) GetDeviceName() string { - if x != nil && x.DeviceName != nil { - return *x.DeviceName - } - return "" +// Deprecated: Use GetAvailableKindsByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*GetAvailableKindsByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{270} } -func (x *BlockDeviceMapping) GetEbs() *BlockDevice { +func (x *GetAvailableKindsByTargetingFiltersResponse) GetKinds() []K8SObjectKind { if x != nil { - return x.Ebs + return x.Kinds } return nil } -func (x *BlockDeviceMapping) GetRootVolume() bool { - if x != nil && x.RootVolume != nil { - return *x.RootVolume - } - return false -} - -type BlockDevice struct { +type SearchResourcesByTargetingFiltersResponse 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"` + 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 *BlockDevice) Reset() { - *x = BlockDevice{} +func (x *SearchResourcesByTargetingFiltersResponse) Reset() { + *x = SearchResourcesByTargetingFiltersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[254] + mi := &file_api_v1_recommendation_proto_msgTypes[271] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BlockDevice) String() string { +func (x *SearchResourcesByTargetingFiltersResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BlockDevice) ProtoMessage() {} +func (*SearchResourcesByTargetingFiltersResponse) ProtoMessage() {} -func (x *BlockDevice) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[254] +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 { @@ -20293,102 +24110,64 @@ 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{254} -} - -func (x *BlockDevice) GetDeleteOnTermination() bool { - if x != nil && x.DeleteOnTermination != nil { - return *x.DeleteOnTermination - } - return false -} - -func (x *BlockDevice) GetEncrypted() bool { - if x != nil && x.Encrypted != nil { - return *x.Encrypted - } - return false -} - -func (x *BlockDevice) GetIops() int64 { - if x != nil && x.Iops != nil { - return *x.Iops - } - return 0 -} - -func (x *BlockDevice) GetKmsKeyId() string { - if x != nil && x.KmsKeyId != nil { - return *x.KmsKeyId - } - return "" -} - -func (x *BlockDevice) GetSnapshotId() string { - if x != nil && x.SnapshotId != nil { - return *x.SnapshotId - } - return "" +// Deprecated: Use SearchResourcesByTargetingFiltersResponse.ProtoReflect.Descriptor instead. +func (*SearchResourcesByTargetingFiltersResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{271} } -func (x *BlockDevice) GetThroughput() int64 { - if x != nil && x.Throughput != nil { - return *x.Throughput +func (x *SearchResourcesByTargetingFiltersResponse) GetNamespaces() []*NamespaceSearchResult { + if x != nil { + return x.Namespaces } - return 0 + return nil } -func (x *BlockDevice) GetVolumeInitializationRate() int32 { - if x != nil && x.VolumeInitializationRate != nil { - return *x.VolumeInitializationRate +func (x *SearchResourcesByTargetingFiltersResponse) GetWorkloads() []*WorkloadSearchResult { + if x != nil { + return x.Workloads } - return 0 + return nil } -func (x *BlockDevice) GetVolumeSize() string { - if x != nil && x.VolumeSize != nil { - return *x.VolumeSize +func (x *SearchResourcesByTargetingFiltersResponse) GetNodeGroups() []*NodeGroupSearchResult { + if x != nil { + return x.NodeGroups } - return "" + return nil } -func (x *BlockDevice) GetVolumeType() string { - if x != nil && x.VolumeType != nil { - return *x.VolumeType +func (x *SearchResourcesByTargetingFiltersResponse) GetLabels() []*LabelSearchResult { + if x != nil { + return x.Labels } - return "" + return nil } -type MetadataOptions struct { +type NamespaceSearchResult 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"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *MetadataOptions) Reset() { - *x = MetadataOptions{} +func (x *NamespaceSearchResult) Reset() { + *x = NamespaceSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[255] + mi := &file_api_v1_recommendation_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MetadataOptions) String() string { +func (x *NamespaceSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MetadataOptions) ProtoMessage() {} +func (*NamespaceSearchResult) ProtoMessage() {} -func (x *MetadataOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[255] +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 { @@ -20399,71 +24178,44 @@ 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{255} +// Deprecated: Use NamespaceSearchResult.ProtoReflect.Descriptor instead. +func (*NamespaceSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{272} } -func (x *MetadataOptions) GetHttpEndpoint() string { - if x != nil && x.HttpEndpoint != nil { - return *x.HttpEndpoint +func (x *NamespaceSearchResult) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *MetadataOptions) GetHttpProtocolIpv6() string { - if x != nil && x.HttpProtocolIpv6 != nil { - return *x.HttpProtocolIpv6 - } - 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 - } - return "" -} - -type GCPNodeClassSpec struct { +type WorkloadSearchResult 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"` + 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 *GCPNodeClassSpec) Reset() { - *x = GCPNodeClassSpec{} +func (x *WorkloadSearchResult) Reset() { + *x = WorkloadSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[256] + mi := &file_api_v1_recommendation_proto_msgTypes[273] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPNodeClassSpec) String() string { +func (x *WorkloadSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPNodeClassSpec) ProtoMessage() {} +func (*WorkloadSearchResult) ProtoMessage() {} -func (x *GCPNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[256] +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 { @@ -20474,93 +24226,50 @@ 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{256} +// Deprecated: Use WorkloadSearchResult.ProtoReflect.Descriptor instead. +func (*WorkloadSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{273} } -func (x *GCPNodeClassSpec) GetServiceAccount() string { +func (x *WorkloadSearchResult) GetKind() string { if x != nil { - return x.ServiceAccount + return x.Kind } return "" } -func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { +func (x *WorkloadSearchResult) GetName() string { if x != nil { - return x.ImageSelectorTerms - } - return nil -} - -func (x *GCPNodeClassSpec) GetImageFamily() string { - if x != nil && x.ImageFamily != nil { - return *x.ImageFamily + return x.Name } return "" } -func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { - if x != nil { - return x.KubeletConfiguration - } - return nil -} - -func (x *GCPNodeClassSpec) GetLabels() map[string]string { - if x != nil { - return x.Labels - } - return nil -} - -func (x *GCPNodeClassSpec) GetMetadata() map[string]string { - if x != nil { - return x.Metadata - } - return nil -} - -func (x *GCPNodeClassSpec) GetNetworkTags() []string { - if x != nil { - return x.NetworkTags - } - return nil -} - -func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { - if x != nil { - return x.Disks - } - return nil -} - -type GCPImageSelectorTerm struct { +type NodeGroupSearchResult 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"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` } -func (x *GCPImageSelectorTerm) Reset() { - *x = GCPImageSelectorTerm{} +func (x *NodeGroupSearchResult) Reset() { + *x = NodeGroupSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[257] + mi := &file_api_v1_recommendation_proto_msgTypes[274] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPImageSelectorTerm) String() string { +func (x *NodeGroupSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPImageSelectorTerm) ProtoMessage() {} +func (*NodeGroupSearchResult) ProtoMessage() {} -func (x *GCPImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[257] +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 { @@ -20571,54 +24280,44 @@ 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{257} -} - -func (x *GCPImageSelectorTerm) GetAlias() string { - if x != nil { - return x.Alias - } - return "" +// Deprecated: Use NodeGroupSearchResult.ProtoReflect.Descriptor instead. +func (*NodeGroupSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{274} } -func (x *GCPImageSelectorTerm) GetId() string { +func (x *NodeGroupSearchResult) GetName() string { if x != nil { - return x.Id + return x.Name } return "" } -type GCPDisk struct { +type LabelSearchResult 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"` + 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 *GCPDisk) Reset() { - *x = GCPDisk{} +func (x *LabelSearchResult) Reset() { + *x = LabelSearchResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[258] + mi := &file_api_v1_recommendation_proto_msgTypes[275] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCPDisk) String() string { +func (x *LabelSearchResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPDisk) ProtoMessage() {} +func (*LabelSearchResult) ProtoMessage() {} -func (x *GCPDisk) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[258] +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 { @@ -20629,77 +24328,50 @@ 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{258} -} - -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 +// Deprecated: Use LabelSearchResult.ProtoReflect.Descriptor instead. +func (*LabelSearchResult) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{275} } -func (x *GCPDisk) GetSecondaryBootImage() string { +func (x *LabelSearchResult) GetKey() string { if x != nil { - return x.SecondaryBootImage + return x.Key } return "" } -func (x *GCPDisk) GetSecondaryBootMode() string { +func (x *LabelSearchResult) GetValue() string { if x != nil { - return x.SecondaryBootMode + return x.Value } return "" } -type AzureNodeClassSpec struct { +type CreateNodePolicyTargetsRequest 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"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *AzureNodeClassSpec) Reset() { - *x = AzureNodeClassSpec{} +func (x *CreateNodePolicyTargetsRequest) Reset() { + *x = CreateNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[259] + mi := &file_api_v1_recommendation_proto_msgTypes[276] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureNodeClassSpec) String() string { +func (x *CreateNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureNodeClassSpec) ProtoMessage() {} +func (*CreateNodePolicyTargetsRequest) ProtoMessage() {} -func (x *AzureNodeClassSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[259] +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 { @@ -20710,94 +24382,43 @@ 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{259} -} - -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.Tags - } - return nil +// Deprecated: Use CreateNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{276} } -func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { +func (x *CreateNodePolicyTargetsRequest) GetTargets() []*NodePolicyTarget { if x != nil { - return x.Kubelet + return x.Targets } return nil } -func (x *AzureNodeClassSpec) GetMaxPods() int32 { - if x != nil && x.MaxPods != nil { - return *x.MaxPods - } - return 0 -} - -type AzureKubeletConfiguration struct { +type CreateNodePolicyTargetsResponse 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"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *AzureKubeletConfiguration) Reset() { - *x = AzureKubeletConfiguration{} +func (x *CreateNodePolicyTargetsResponse) Reset() { + *x = CreateNodePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[260] + mi := &file_api_v1_recommendation_proto_msgTypes[277] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AzureKubeletConfiguration) String() string { +func (x *CreateNodePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AzureKubeletConfiguration) ProtoMessage() {} +func (*CreateNodePolicyTargetsResponse) ProtoMessage() {} -func (x *AzureKubeletConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[260] +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 { @@ -20808,108 +24429,43 @@ 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{260} -} - -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 "" +// Deprecated: Use CreateNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*CreateNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{277} } -func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { +func (x *CreateNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.AllowedUnsafeSysctls + return x.Targets } return nil } -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 { +type ListNodePolicyTargetsRequest 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"` + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` } -func (x *OCIImageSelectorTerm) Reset() { - *x = OCIImageSelectorTerm{} +func (x *ListNodePolicyTargetsRequest) Reset() { + *x = ListNodePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[261] + mi := &file_api_v1_recommendation_proto_msgTypes[278] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIImageSelectorTerm) String() string { +func (x *ListNodePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIImageSelectorTerm) ProtoMessage() {} +func (*ListNodePolicyTargetsRequest) ProtoMessage() {} -func (x *OCIImageSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[261] +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 { @@ -20920,58 +24476,43 @@ 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{261} -} - -func (x *OCIImageSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *OCIImageSelectorTerm) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use ListNodePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{278} } -func (x *OCIImageSelectorTerm) GetCompartmentId() string { +func (x *ListNodePolicyTargetsRequest) GetTeamId() string { if x != nil { - return x.CompartmentId + return x.TeamId } return "" } -type OCISubnetSelectorTerm struct { +type ListNodePolicyTargetsResponse 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"` + Targets []*NodePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *OCISubnetSelectorTerm) Reset() { - *x = OCISubnetSelectorTerm{} +func (x *ListNodePolicyTargetsResponse) Reset() { + *x = ListNodePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[262] + mi := &file_api_v1_recommendation_proto_msgTypes[279] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISubnetSelectorTerm) String() string { +func (x *ListNodePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISubnetSelectorTerm) ProtoMessage() {} +func (*ListNodePolicyTargetsResponse) ProtoMessage() {} -func (x *OCISubnetSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[262] +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 { @@ -20982,51 +24523,43 @@ 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{262} -} - -func (x *OCISubnetSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use ListNodePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListNodePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{279} } -func (x *OCISubnetSelectorTerm) GetName() string { +func (x *ListNodePolicyTargetsResponse) GetTargets() []*NodePolicyTarget { if x != nil { - return x.Name + return x.Targets } - return "" + return nil } -type OCISecurityGroupSelectorTerm struct { +type UpdateNodePolicyTargetRequest 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"` + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *OCISecurityGroupSelectorTerm) Reset() { - *x = OCISecurityGroupSelectorTerm{} +func (x *UpdateNodePolicyTargetRequest) Reset() { + *x = UpdateNodePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[263] + mi := &file_api_v1_recommendation_proto_msgTypes[280] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCISecurityGroupSelectorTerm) String() string { +func (x *UpdateNodePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} +func (*UpdateNodePolicyTargetRequest) ProtoMessage() {} -func (x *OCISecurityGroupSelectorTerm) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[263] +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 { @@ -21037,51 +24570,43 @@ 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{263} -} - -func (x *OCISecurityGroupSelectorTerm) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use UpdateNodePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{280} } -func (x *OCISecurityGroupSelectorTerm) GetName() string { +func (x *UpdateNodePolicyTargetRequest) GetTarget() *NodePolicyTarget { if x != nil { - return x.Name + return x.Target } - return "" + return nil } -type OCIBootConfig struct { +type UpdateNodePolicyTargetResponse 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"` + Target *NodePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *OCIBootConfig) Reset() { - *x = OCIBootConfig{} +func (x *UpdateNodePolicyTargetResponse) Reset() { + *x = UpdateNodePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[264] + mi := &file_api_v1_recommendation_proto_msgTypes[281] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIBootConfig) String() string { +func (x *UpdateNodePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIBootConfig) ProtoMessage() {} +func (*UpdateNodePolicyTargetResponse) ProtoMessage() {} -func (x *OCIBootConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[264] +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 { @@ -21092,54 +24617,58 @@ 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{264} -} - -func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { - if x != nil { - return x.BootVolumeSizeInGbs - } - return 0 +// Deprecated: Use UpdateNodePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateNodePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{281} } -func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { +func (x *UpdateNodePolicyTargetResponse) GetTarget() *NodePolicyTarget { if x != nil { - return x.BootVolumeVpusPerGb + return x.Target } - return 0 + return nil } -type OCILaunchOptions struct { +type NodePolicyTarget 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"` + 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 *OCILaunchOptions) Reset() { - *x = OCILaunchOptions{} +func (x *NodePolicyTarget) Reset() { + *x = NodePolicyTarget{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[265] + mi := &file_api_v1_recommendation_proto_msgTypes[282] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCILaunchOptions) String() string { +func (x *NodePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCILaunchOptions) ProtoMessage() {} +func (*NodePolicyTarget) ProtoMessage() {} -func (x *OCILaunchOptions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[265] +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 { @@ -21150,139 +24679,122 @@ 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{265} +// Deprecated: Use NodePolicyTarget.ProtoReflect.Descriptor instead. +func (*NodePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{282} } -func (x *OCILaunchOptions) GetBootVolumeType() string { - if x != nil && x.BootVolumeType != nil { - return *x.BootVolumeType +func (x *NodePolicyTarget) GetTargetId() string { + if x != nil { + return x.TargetId } return "" } -func (x *OCILaunchOptions) GetFirmware() string { - if x != nil && x.Firmware != nil { - return *x.Firmware +func (x *NodePolicyTarget) GetName() string { + if x != nil { + return x.Name } return "" } -func (x *OCILaunchOptions) GetNetworkType() string { - if x != nil && x.NetworkType != nil { - return *x.NetworkType +func (x *NodePolicyTarget) GetDescription() string { + if x != nil { + return x.Description } return "" } -func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { - if x != nil && x.RemoteDataVolumeType != nil { - return *x.RemoteDataVolumeType +func (x *NodePolicyTarget) GetTeamId() string { + if x != nil { + return x.TeamId } return "" } -func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { - if x != nil && x.IsConsistentVolumeNamingEnabled != nil { - return *x.IsConsistentVolumeNamingEnabled +func (x *NodePolicyTarget) GetClusterIds() []string { + if x != nil { + return x.ClusterIds } - return false -} - -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"` + return nil } -func (x *OCIVolumeAttributes) Reset() { - *x = OCIVolumeAttributes{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[266] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *NodePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId } + return "" } -func (x *OCIVolumeAttributes) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *NodePolicyTarget) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false } -func (*OCIVolumeAttributes) ProtoMessage() {} - -func (x *OCIVolumeAttributes) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *NodePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } - return mi.MessageOf(x) + return nil } -// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. -func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{266} +func (x *NodePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil } -func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { +func (x *NodePolicyTarget) GetDeletedAt() *timestamppb.Timestamp { if x != nil { - return x.SizeInGbs + return x.DeletedAt } - return 0 + return nil } -func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { +func (x *NodePolicyTarget) GetStatus() *NodePolicyTargetStatus { if x != nil { - return x.VpusPerGb + return x.Status } - return 0 + return nil } -type OCINodeClassSpec struct { +type NodePolicyCondition 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"` + // 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 *OCINodeClassSpec) Reset() { - *x = OCINodeClassSpec{} +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 *OCINodeClassSpec) String() string { +func (x *NodePolicyCondition) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClassSpec) ProtoMessage() {} +func (*NodePolicyCondition) ProtoMessage() {} -func (x *OCINodeClassSpec) 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 { @@ -21293,136 +24805,130 @@ 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{267} +// Deprecated: Use NodePolicyCondition.ProtoReflect.Descriptor instead. +func (*NodePolicyCondition) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{283} } -func (x *OCINodeClassSpec) GetVcnId() string { +func (x *NodePolicyCondition) GetType() string { if x != nil { - return x.VcnId + return x.Type } return "" } -func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { - if x != nil { - return x.ImageSelector - } - return nil -} - -func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { +func (x *NodePolicyCondition) GetStatus() string { if x != nil { - return x.SubnetSelector + return x.Status } - return nil + return "" } -func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { +func (x *NodePolicyCondition) GetReason() string { if x != nil { - return x.SecurityGroupSelector - } - return nil -} - -func (x *OCINodeClassSpec) GetUserData() string { - if x != nil && x.UserData != nil { - return *x.UserData + return x.Reason } return "" } -func (x *OCINodeClassSpec) GetPreInstallScript() string { - if x != nil && x.PreInstallScript != nil { - return *x.PreInstallScript +func (x *NodePolicyCondition) GetMessage() string { + if x != nil { + return x.Message } return "" } -func (x *OCINodeClassSpec) GetMetaData() map[string]string { +func (x *NodePolicyCondition) GetLastTransitionTime() *timestamppb.Timestamp { if x != nil { - return x.MetaData + return x.LastTransitionTime } return nil } -func (x *OCINodeClassSpec) GetImageFamily() string { - if x != nil { - return x.ImageFamily - } - return "" -} +type NodePolicyTargetStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *OCINodeClassSpec) GetTags() map[string]string { - if x != nil { - return x.Tags - } - return nil + Conditions []*NodePolicyCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` } -func (x *OCINodeClassSpec) GetFreeFormTags() map[string]string { - if x != nil { - return x.FreeFormTags +func (x *NodePolicyTargetStatus) Reset() { + *x = NodePolicyTargetStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[284] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *OCINodeClassSpec) GetBootConfig() *OCIBootConfig { - if x != nil { - return x.BootConfig - } - return nil +func (x *NodePolicyTargetStatus) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *OCINodeClassSpec) GetLaunchOptions() *OCILaunchOptions { - if x != nil { - return x.LaunchOptions +func (*NodePolicyTargetStatus) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *OCINodeClassSpec) GetBlockDevices() []*OCIVolumeAttributes { - if x != nil { - return x.BlockDevices - } - return nil +// Deprecated: Use NodePolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*NodePolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{284} } -func (x *OCINodeClassSpec) GetAgentList() []string { +func (x *NodePolicyTargetStatus) GetConditions() []*NodePolicyCondition { if x != nil { - return x.AgentList + return x.Conditions } return nil } -type KarpenterSettingsRecommendation 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 - // 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"` + // 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 *KarpenterSettingsRecommendation) Reset() { - *x = KarpenterSettingsRecommendation{} +func (x *ZonalShiftConfig) Reset() { + *x = ZonalShiftConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[268] + mi := &file_api_v1_recommendation_proto_msgTypes[285] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KarpenterSettingsRecommendation) String() string { +func (x *ZonalShiftConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KarpenterSettingsRecommendation) ProtoMessage() {} +func (*ZonalShiftConfig) ProtoMessage() {} -func (x *KarpenterSettingsRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[268] +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 { @@ -21433,51 +24939,59 @@ 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{268} +// Deprecated: Use ZonalShiftConfig.ProtoReflect.Descriptor instead. +func (*ZonalShiftConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{285} } -func (x *KarpenterSettingsRecommendation) GetContents() []byte { +func (x *ZonalShiftConfig) GetRespectZonalShift() bool { if x != nil { - return x.Contents + return x.RespectZonalShift } - return nil + return false } -func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { +func (x *ZonalShiftConfig) GetEvictImpactedNodes() bool { if x != nil { - return x.RecommendationId + return x.EvictImpactedNodes } - return "" + return false } -type RawKarpenterSpec struct { +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 - 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"` + 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 *RawKarpenterSpec) Reset() { - *x = RawKarpenterSpec{} +func (x *Taint) Reset() { + *x = Taint{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[269] + mi := &file_api_v1_recommendation_proto_msgTypes[286] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *RawKarpenterSpec) String() string { +func (x *Taint) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RawKarpenterSpec) ProtoMessage() {} +func (*Taint) ProtoMessage() {} -func (x *RawKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[269] +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 { @@ -21488,54 +25002,60 @@ 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{269} +// Deprecated: Use Taint.ProtoReflect.Descriptor instead. +func (*Taint) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{286} } -func (x *RawKarpenterSpec) GetNodepoolYaml() string { +func (x *Taint) GetKey() string { if x != nil { - return x.NodepoolYaml + return x.Key } return "" } -func (x *RawKarpenterSpec) GetNodeclassYaml() string { +func (x *Taint) GetValue() string { if x != nil { - return x.NodeclassYaml + return x.Value } return "" } -type NodeRecommendation 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 - 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"` + 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 *NodeRecommendation) Reset() { - *x = NodeRecommendation{} +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 *NodeRecommendation) String() string { +func (x *DisruptionBudget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeRecommendation) ProtoMessage() {} +func (*DisruptionBudget) ProtoMessage() {} -func (x *NodeRecommendation) 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 { @@ -21546,72 +25066,69 @@ 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{270} -} - -func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { - if x != nil { - return x.Aws - } - return nil +// Deprecated: Use DisruptionBudget.ProtoReflect.Descriptor instead. +func (*DisruptionBudget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{287} } -func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { +func (x *DisruptionBudget) GetReasons() []string { if x != nil { - return x.Aks + return x.Reasons } return nil } -func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { +func (x *DisruptionBudget) GetNodes() string { if x != nil { - return x.Gcp + return x.Nodes } - return nil + return "" } -func (x *NodeRecommendation) GetOci() *OCIKarpenterSpec { +func (x *DisruptionBudget) GetSchedule() string { if x != nil { - return x.Oci + return x.Schedule } - return nil + return "" } -func (x *NodeRecommendation) GetNodeRecCfgId() string { +func (x *DisruptionBudget) GetDuration() string { if x != nil { - return x.NodeRecCfgId + return x.Duration } return "" } -type AWSKarpenterSpec struct { +type DisruptionPolicy 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"` + 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 *AWSKarpenterSpec) Reset() { - *x = AWSKarpenterSpec{} +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 *AWSKarpenterSpec) String() string { +func (x *DisruptionPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AWSKarpenterSpec) ProtoMessage() {} +func (*DisruptionPolicy) ProtoMessage() {} -func (x *AWSKarpenterSpec) 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 { @@ -21622,51 +25139,79 @@ 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{271} +// Deprecated: Use DisruptionPolicy.ProtoReflect.Descriptor instead. +func (*DisruptionPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{288} } -func (x *AWSKarpenterSpec) GetNp() []*NodePool { +func (x *DisruptionPolicy) GetConsolidateAfter() string { if x != nil { - return x.Np + return x.ConsolidateAfter } - return nil + return "" } -func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { +func (x *DisruptionPolicy) GetConsolidationPolicy() string { if x != nil { - return x.Ec2Nc + return x.ConsolidationPolicy } - return nil -} - -type AKSKarpenterSpec 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"` + return "" } -func (x *AKSKarpenterSpec) Reset() { - *x = AKSKarpenterSpec{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[272] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *DisruptionPolicy) GetExpireAfter() string { + if x != nil { + return x.ExpireAfter } + return "" } -func (x *AKSKarpenterSpec) String() string { +func (x *DisruptionPolicy) GetTtlSecondsAfterEmpty() int32 { + if x != nil { + return x.TtlSecondsAfterEmpty + } + return 0 +} + +func (x *DisruptionPolicy) GetTerminationGracePeriodSeconds() int32 { + if x != nil { + return x.TerminationGracePeriodSeconds + } + return 0 +} + +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 + + 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 *ResourceLimits) Reset() { + *x = ResourceLimits{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[289] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResourceLimits) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSKarpenterSpec) ProtoMessage() {} +func (*ResourceLimits) ProtoMessage() {} -func (x *AKSKarpenterSpec) 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 { @@ -21677,50 +25222,66 @@ 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{272} +// Deprecated: Use ResourceLimits.ProtoReflect.Descriptor instead. +func (*ResourceLimits) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{289} } -func (x *AKSKarpenterSpec) GetNp() []*NodePool { +func (x *ResourceLimits) GetCpu() string { if x != nil { - return x.Np + return x.Cpu } - return nil + return "" } -func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { +func (x *ResourceLimits) GetMemory() string { if x != nil { - return x.Aksnc + return x.Memory } - return nil + return "" } -type NodePool struct { +// Provider-specific stubs +type AWSNodeClassSpec 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 + 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 *NodePool) Reset() { - *x = NodePool{} +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 *NodePool) String() string { +func (x *AWSNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodePool) ProtoMessage() {} +func (*AWSNodeClassSpec) ProtoMessage() {} -func (x *NodePool) 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 { @@ -21731,43 +25292,148 @@ 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{273} +// Deprecated: Use AWSNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AWSNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} } -func (x *NodePool) GetContents() []byte { +func (x *AWSNodeClassSpec) GetSubnetSelectorTerms() []*SubnetSelectorTerm { if x != nil { - return x.Contents + return x.SubnetSelectorTerms } return nil } -type EC2NodeClass struct { +func (x *AWSNodeClassSpec) GetSecurityGroupSelectorTerms() []*SecurityGroupSelectorTerm { + if x != nil { + return x.SecurityGroupSelectorTerms + } + return nil +} + +func (x *AWSNodeClassSpec) GetCapacityReservationSelectorTerms() []*CapacityReservationSelectorTerm { + if x != nil { + return x.CapacityReservationSelectorTerms + } + return nil +} + +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.AmiSelectorTerms + } + return nil +} + +func (x *AWSNodeClassSpec) GetAmiFamily() string { + if x != nil && x.AmiFamily != nil { + return *x.AmiFamily + } + return "" +} + +func (x *AWSNodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData + } + return "" +} + +func (x *AWSNodeClassSpec) GetRole() string { + if x != nil && x.Role != nil { + return *x.Role + } + return "" +} + +func (x *AWSNodeClassSpec) GetInstanceProfile() string { + if x != nil && x.InstanceProfile != nil { + return *x.InstanceProfile + } + return "" +} + +func (x *AWSNodeClassSpec) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *AWSNodeClassSpec) GetKubelet() *KubeletConfiguration { + if x != nil { + return x.Kubelet + } + return nil +} + +func (x *AWSNodeClassSpec) GetBlockDeviceMappings() []*BlockDeviceMapping { + if x != nil { + return x.BlockDeviceMappings + } + 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 { + if x != nil { + return x.MetadataOptions + } + return nil +} + +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 []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 + 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 *EC2NodeClass) Reset() { - *x = EC2NodeClass{} +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 *EC2NodeClass) String() string { +func (x *GetInstanceFamiliesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*EC2NodeClass) ProtoMessage() {} +func (*GetInstanceFamiliesRequest) ProtoMessage() {} -func (x *EC2NodeClass) 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 { @@ -21778,43 +25444,43 @@ 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{274} +// Deprecated: Use GetInstanceFamiliesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{291} } -func (x *EC2NodeClass) GetContents() []byte { +func (x *GetInstanceFamiliesRequest) GetCloudProviders() []string { if x != nil { - return x.Contents + return x.CloudProviders } return nil } -type AKSNodeClass struct { +type GetInstanceFamiliesResponse 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 + InstanceFamilies []*InstanceFamily `protobuf:"bytes,1,rep,name=instance_families,json=instanceFamilies,proto3" json:"instance_families,omitempty"` } -func (x *AKSNodeClass) Reset() { - *x = AKSNodeClass{} +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 *AKSNodeClass) String() string { +func (x *GetInstanceFamiliesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AKSNodeClass) ProtoMessage() {} +func (*GetInstanceFamiliesResponse) ProtoMessage() {} -func (x *AKSNodeClass) 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 { @@ -21825,44 +25491,43 @@ 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{275} +// Deprecated: Use GetInstanceFamiliesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceFamiliesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{292} } -func (x *AKSNodeClass) GetContents() []byte { +func (x *GetInstanceFamiliesResponse) GetInstanceFamilies() []*InstanceFamily { if x != nil { - return x.Contents + return x.InstanceFamilies } return nil } -type GCPKarpenterSpec struct { +type GetInstanceSizesRequest 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"` + 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 *GCPKarpenterSpec) Reset() { - *x = GCPKarpenterSpec{} +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 *GCPKarpenterSpec) String() string { +func (x *GetInstanceSizesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCPKarpenterSpec) ProtoMessage() {} +func (*GetInstanceSizesRequest) ProtoMessage() {} -func (x *GCPKarpenterSpec) 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 { @@ -21873,50 +25538,43 @@ 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{276} -} - -func (x *GCPKarpenterSpec) GetNp() []*NodePool { - if x != nil { - return x.Np - } - return nil +// Deprecated: Use GetInstanceSizesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{293} } -func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { +func (x *GetInstanceSizesRequest) GetCloudProviders() []string { if x != nil { - return x.NodeClasses + return x.CloudProviders } return nil } -type GCENodeClass struct { +type GetInstanceSizesResponse 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 + InstanceSizes []*InstanceSize `protobuf:"bytes,1,rep,name=instance_sizes,json=instanceSizes,proto3" json:"instance_sizes,omitempty"` } -func (x *GCENodeClass) Reset() { - *x = GCENodeClass{} +func (x *GetInstanceSizesResponse) Reset() { + *x = GetInstanceSizesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[277] + mi := &file_api_v1_recommendation_proto_msgTypes[294] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GCENodeClass) String() string { +func (x *GetInstanceSizesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GCENodeClass) ProtoMessage() {} +func (*GetInstanceSizesResponse) ProtoMessage() {} -func (x *GCENodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[277] +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 { @@ -21927,44 +25585,43 @@ 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{277} +// Deprecated: Use GetInstanceSizesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceSizesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} } -func (x *GCENodeClass) GetContents() []byte { +func (x *GetInstanceSizesResponse) GetInstanceSizes() []*InstanceSize { if x != nil { - return x.Contents + return x.InstanceSizes } return nil } -type OCIKarpenterSpec 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"` - NodeClasses []*OCINodeClass `protobuf:"bytes,2,rep,name=node_classes,json=nodeClasses,proto3" json:"node_classes,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 *OCIKarpenterSpec) Reset() { - *x = OCIKarpenterSpec{} +func (x *GetInstanceShapesRequest) Reset() { + *x = GetInstanceShapesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[278] + mi := &file_api_v1_recommendation_proto_msgTypes[295] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCIKarpenterSpec) String() string { +func (x *GetInstanceShapesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCIKarpenterSpec) ProtoMessage() {} +func (*GetInstanceShapesRequest) ProtoMessage() {} -func (x *OCIKarpenterSpec) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[278] +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 { @@ -21975,50 +25632,43 @@ 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{278} -} - -func (x *OCIKarpenterSpec) 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 *OCIKarpenterSpec) GetNodeClasses() []*OCINodeClass { +func (x *GetInstanceShapesRequest) GetCloudProviders() []string { if x != nil { - return x.NodeClasses + return x.CloudProviders } return nil } -type OCINodeClass struct { +type GetInstanceShapesResponse 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 + InstanceShapes []*InstanceShape `protobuf:"bytes,1,rep,name=instance_shapes,json=instanceShapes,proto3" json:"instance_shapes,omitempty"` } -func (x *OCINodeClass) Reset() { - *x = OCINodeClass{} +func (x *GetInstanceShapesResponse) Reset() { + *x = GetInstanceShapesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[279] + mi := &file_api_v1_recommendation_proto_msgTypes[296] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *OCINodeClass) String() string { +func (x *GetInstanceShapesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*OCINodeClass) ProtoMessage() {} +func (*GetInstanceShapesResponse) ProtoMessage() {} -func (x *OCINodeClass) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[279] +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 { @@ -22029,65 +25679,44 @@ 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{279} +// Deprecated: Use GetInstanceShapesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceShapesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{296} } -func (x *OCINodeClass) GetContents() []byte { +func (x *GetInstanceShapesResponse) GetInstanceShapes() []*InstanceShape { if x != nil { - return x.Contents + return x.InstanceShapes } return nil } -// StorageRecommendationPolicy represents a policy for PVC/storage optimization -type StorageRecommendationPolicy struct { +type InstanceFamily 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"` + 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 *StorageRecommendationPolicy) Reset() { - *x = StorageRecommendationPolicy{} +func (x *InstanceFamily) Reset() { + *x = InstanceFamily{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[280] + mi := &file_api_v1_recommendation_proto_msgTypes[297] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StorageRecommendationPolicy) String() string { +func (x *InstanceFamily) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StorageRecommendationPolicy) ProtoMessage() {} +func (*InstanceFamily) ProtoMessage() {} -func (x *StorageRecommendationPolicy) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[280] +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 { @@ -22098,190 +25727,224 @@ 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{280} +// Deprecated: Use InstanceFamily.ProtoReflect.Descriptor instead. +func (*InstanceFamily) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} } -func (x *StorageRecommendationPolicy) GetPolicyId() string { +func (x *InstanceFamily) GetName() string { if x != nil { - return x.PolicyId + return x.Name } return "" } -func (x *StorageRecommendationPolicy) GetTeamId() string { +func (x *InstanceFamily) GetProviderName() string { if x != nil { - return x.TeamId + return x.ProviderName } return "" } -func (x *StorageRecommendationPolicy) GetName() string { - if x != nil { - return x.Name - } - return "" +type InstanceShape 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 *StorageRecommendationPolicy) GetDescription() string { - if x != nil { - return x.Description +func (x *InstanceShape) Reset() { + *x = InstanceShape{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[298] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { - if x != nil { - return x.ActionTrigger +func (x *InstanceShape) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstanceShape) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { +// Deprecated: Use InstanceShape.ProtoReflect.Descriptor instead. +func (*InstanceShape) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{298} +} + +func (x *InstanceShape) GetName() string { if x != nil { - return x.ActionTriggers + return x.Name } - return nil + return "" } -func (x *StorageRecommendationPolicy) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *InstanceShape) GetProviderName() string { + if x != nil { + return x.ProviderName } return "" } -func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds - } - return 0 +type InstanceSize 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 *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent +func (x *InstanceSize) Reset() { + *x = InstanceSize{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[299] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull - } - return 0 +func (x *InstanceSize) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction +func (*InstanceSize) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 +// Deprecated: Use InstanceSize.ProtoReflect.Descriptor instead. +func (*InstanceSize) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{299} } -func (x *StorageRecommendationPolicy) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *InstanceSize) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -func (x *StorageRecommendationPolicy) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays +func (x *InstanceSize) GetProviderName() string { + if x != nil { + return x.ProviderName } - return 0 + return "" } -func (x *StorageRecommendationPolicy) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib - } - return 0 +type InstanceCategory 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" } -func (x *StorageRecommendationPolicy) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd +func (x *InstanceCategory) Reset() { + *x = InstanceCategory{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[300] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *StorageRecommendationPolicy) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *InstanceCategory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstanceCategory) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *StorageRecommendationPolicy) GetIsDefaultPolicy() bool { +// Deprecated: Use InstanceCategory.ProtoReflect.Descriptor instead. +func (*InstanceCategory) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{300} +} + +func (x *InstanceCategory) GetKey() string { if x != nil { - return x.IsDefaultPolicy + return x.Key } - return false + return "" } -func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { +func (x *InstanceCategory) GetLabel() string { if x != nil { - return x.CreatedAt + return x.Label } - return nil + return "" } -func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { +func (x *InstanceCategory) GetProviderName() string { if x != nil { - return x.UpdatedAt + return x.ProviderName } - return nil + return "" } -type CreateStorageRecommendationPolicyRequest struct { +type InstanceCPU 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"` + 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 *CreateStorageRecommendationPolicyRequest) Reset() { - *x = CreateStorageRecommendationPolicyRequest{} +func (x *InstanceCPU) Reset() { + *x = InstanceCPU{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[281] + mi := &file_api_v1_recommendation_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyRequest) String() string { +func (x *InstanceCPU) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*InstanceCPU) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[281] +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 { @@ -22292,141 +25955,152 @@ 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{281} +// Deprecated: Use InstanceCPU.ProtoReflect.Descriptor instead. +func (*InstanceCPU) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{301} } -func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *InstanceCPU) GetVcpu() int32 { if x != nil { - return x.TeamId + return x.Vcpu } - return "" + return 0 } -func (x *CreateStorageRecommendationPolicyRequest) GetName() string { +func (x *InstanceCPU) GetProviderName() string { if x != nil { - return x.Name + return x.ProviderName } return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +type InstanceTypeName 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 *CreateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *InstanceTypeName) Reset() { + *x = InstanceTypeName{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[302] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *CreateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" +func (x *InstanceTypeName) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds +func (*InstanceTypeName) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetTargetUtilizationPercent() float32 { - if x != nil && x.TargetUtilizationPercent != nil { - return *x.TargetUtilizationPercent - } - return 0 +// Deprecated: Use InstanceTypeName.ProtoReflect.Descriptor instead. +func (*InstanceTypeName) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} } -func (x *CreateStorageRecommendationPolicyRequest) GetWarnDaysToFull() int32 { - if x != nil && x.WarnDaysToFull != nil { - return *x.WarnDaysToFull +func (x *InstanceTypeName) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetMaxExpansionPerAction() float32 { - if x != nil && x.MaxExpansionPerAction != nil { - return *x.MaxExpansionPerAction +func (x *InstanceTypeName) GetProviderName() string { + if x != nil { + return x.ProviderName } - return 0 + return "" } -func (x *CreateStorageRecommendationPolicyRequest) GetMinDataPoints() int32 { - if x != nil && x.MinDataPoints != nil { - return *x.MinDataPoints - } - return 0 +type GetInstanceCategoriesRequest 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 *CreateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +func (x *GetInstanceCategoriesRequest) Reset() { + *x = GetInstanceCategoriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[303] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *CreateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 +func (x *GetInstanceCategoriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib +func (*GetInstanceCategoriesRequest) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *CreateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd - } - return 0 +// Deprecated: Use GetInstanceCategoriesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{303} } -func (x *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *GetInstanceCategoriesRequest) GetCloudProviders() []string { + if x != nil { + return x.CloudProviders } - return 0 + return nil } -type CreateStorageRecommendationPolicyResponse struct { +type GetInstanceCategoriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + InstanceCategories []*InstanceCategory `protobuf:"bytes,1,rep,name=instance_categories,json=instanceCategories,proto3" json:"instance_categories,omitempty"` } -func (x *CreateStorageRecommendationPolicyResponse) Reset() { - *x = CreateStorageRecommendationPolicyResponse{} +func (x *GetInstanceCategoriesResponse) Reset() { + *x = GetInstanceCategoriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[282] + mi := &file_api_v1_recommendation_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStorageRecommendationPolicyResponse) String() string { +func (x *GetInstanceCategoriesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*GetInstanceCategoriesResponse) ProtoMessage() {} -func (x *CreateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[282] +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 { @@ -22437,43 +26111,43 @@ 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{282} +// Deprecated: Use GetInstanceCategoriesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCategoriesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{304} } -func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *GetInstanceCategoriesResponse) GetInstanceCategories() []*InstanceCategory { if x != nil { - return x.Policy + return x.InstanceCategories } return nil } -type GetStorageRecommendationPolicyRequest struct { +type GetInstanceCPUsRequest 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"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *GetStorageRecommendationPolicyRequest) Reset() { - *x = GetStorageRecommendationPolicyRequest{} +func (x *GetInstanceCPUsRequest) Reset() { + *x = GetInstanceCPUsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[283] + mi := &file_api_v1_recommendation_proto_msgTypes[305] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyRequest) String() string { +func (x *GetInstanceCPUsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*GetInstanceCPUsRequest) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[283] +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 { @@ -22484,43 +26158,43 @@ 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{283} +// Deprecated: Use GetInstanceCPUsRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{305} } -func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *GetInstanceCPUsRequest) GetCloudProviders() []string { if x != nil { - return x.PolicyId + return x.CloudProviders } - return "" + return nil } -type GetStorageRecommendationPolicyResponse struct { +type GetInstanceCPUsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` + InstanceCpus []*InstanceCPU `protobuf:"bytes,1,rep,name=instance_cpus,json=instanceCpus,proto3" json:"instance_cpus,omitempty"` } -func (x *GetStorageRecommendationPolicyResponse) Reset() { - *x = GetStorageRecommendationPolicyResponse{} +func (x *GetInstanceCPUsResponse) Reset() { + *x = GetInstanceCPUsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[284] + mi := &file_api_v1_recommendation_proto_msgTypes[306] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetStorageRecommendationPolicyResponse) String() string { +func (x *GetInstanceCPUsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*GetInstanceCPUsResponse) ProtoMessage() {} -func (x *GetStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[284] +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 { @@ -22531,43 +26205,43 @@ 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{284} +// Deprecated: Use GetInstanceCPUsResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceCPUsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{306} } -func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *GetInstanceCPUsResponse) GetInstanceCpus() []*InstanceCPU { if x != nil { - return x.Policy + return x.InstanceCpus } return nil } -type ListStorageRecommendationPoliciesRequest 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"` + CloudProviders []string `protobuf:"bytes,1,rep,name=cloud_providers,json=cloudProviders,proto3" json:"cloud_providers,omitempty"` } -func (x *ListStorageRecommendationPoliciesRequest) Reset() { - *x = ListStorageRecommendationPoliciesRequest{} +func (x *GetInstanceTypeNamesRequest) Reset() { + *x = GetInstanceTypeNamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[285] + mi := &file_api_v1_recommendation_proto_msgTypes[307] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesRequest) String() string { +func (x *GetInstanceTypeNamesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} +func (*GetInstanceTypeNamesRequest) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[285] +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 { @@ -22578,43 +26252,43 @@ 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{285} +// Deprecated: Use GetInstanceTypeNamesRequest.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{307} } -func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { +func (x *GetInstanceTypeNamesRequest) GetCloudProviders() []string { if x != nil { - return x.TeamId + return x.CloudProviders } - return "" + return nil } -type ListStorageRecommendationPoliciesResponse struct { +type GetInstanceTypeNamesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` + InstanceTypes []*InstanceTypeName `protobuf:"bytes,1,rep,name=instance_types,json=instanceTypes,proto3" json:"instance_types,omitempty"` } -func (x *ListStorageRecommendationPoliciesResponse) Reset() { - *x = ListStorageRecommendationPoliciesResponse{} +func (x *GetInstanceTypeNamesResponse) Reset() { + *x = GetInstanceTypeNamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[286] + mi := &file_api_v1_recommendation_proto_msgTypes[308] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStorageRecommendationPoliciesResponse) String() string { +func (x *GetInstanceTypeNamesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} +func (*GetInstanceTypeNamesResponse) ProtoMessage() {} -func (x *ListStorageRecommendationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[286] +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 { @@ -22625,58 +26299,44 @@ 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{286} +// Deprecated: Use GetInstanceTypeNamesResponse.ProtoReflect.Descriptor instead. +func (*GetInstanceTypeNamesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{308} } -func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { +func (x *GetInstanceTypeNamesResponse) GetInstanceTypes() []*InstanceTypeName { if x != nil { - return x.Policies + return x.InstanceTypes } return nil } -type UpdateStorageRecommendationPolicyRequest 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"` - 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"` + 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 *UpdateStorageRecommendationPolicyRequest) Reset() { - *x = UpdateStorageRecommendationPolicyRequest{} +func (x *SubnetSelectorTerm) Reset() { + *x = SubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[287] + mi := &file_api_v1_recommendation_proto_msgTypes[309] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyRequest) String() string { +func (x *SubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*SubnetSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[287] +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 { @@ -22687,148 +26347,115 @@ 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{287} +// Deprecated: Use SubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*SubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{309} } -func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *SubnetSelectorTerm) GetTags() map[string]string { if x != nil { - return x.PolicyId + return x.Tags } - return "" + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *SubnetSelectorTerm) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *UpdateStorageRecommendationPolicyRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} +type SecurityGroupSelectorTerm struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" + 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 *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (x *SecurityGroupSelectorTerm) Reset() { + *x = SecurityGroupSelectorTerm{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[310] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" +func (x *SecurityGroupSelectorTerm) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { - if x != nil && x.LookbackPeriodSeconds != nil { - return *x.LookbackPeriodSeconds - } - 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 -} +func (*SecurityGroupSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { - if x != nil && x.CriticalDaysToFull != nil { - return *x.CriticalDaysToFull +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { - if x != nil && x.HeadroomDays != nil { - return *x.HeadroomDays - } - return 0 +// Deprecated: Use SecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*SecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{310} } -func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { - if x != nil && x.MinResizeIncrementGib != nil { - return *x.MinResizeIncrementGib +func (x *SecurityGroupSelectorTerm) GetTags() map[string]string { + if x != nil { + return x.Tags } - return 0 + return nil } -func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { - if x != nil && x.MaxMonthlyCostUsd != nil { - return *x.MaxMonthlyCostUsd +func (x *SecurityGroupSelectorTerm) GetId() string { + if x != nil { + return x.Id } - return 0 + return "" } -func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { - if x != nil && x.CooldownWindowSeconds != nil { - return *x.CooldownWindowSeconds +func (x *SecurityGroupSelectorTerm) GetName() string { + if x != nil { + return x.Name } - return 0 + return "" } -type UpdateStorageRecommendationPolicyResponse struct { +type CapacityReservationSelectorTerm 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"` + OwnerId string `protobuf:"bytes,3,opt,name=owner_id,json=ownerId,proto3" json:"owner_id,omitempty"` } -func (x *UpdateStorageRecommendationPolicyResponse) Reset() { - *x = UpdateStorageRecommendationPolicyResponse{} +func (x *CapacityReservationSelectorTerm) Reset() { + *x = CapacityReservationSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[288] + mi := &file_api_v1_recommendation_proto_msgTypes[311] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStorageRecommendationPolicyResponse) String() string { +func (x *CapacityReservationSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} +func (*CapacityReservationSelectorTerm) ProtoMessage() {} -func (x *UpdateStorageRecommendationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[288] +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 { @@ -22839,44 +26466,62 @@ 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{288} +// Deprecated: Use CapacityReservationSelectorTerm.ProtoReflect.Descriptor instead. +func (*CapacityReservationSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{311} } -func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { +func (x *CapacityReservationSelectorTerm) GetTags() map[string]string { if x != nil { - return x.Policy + return x.Tags } return nil } -type DeleteStorageRecommendationPolicyRequest struct { +func (x *CapacityReservationSelectorTerm) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *CapacityReservationSelectorTerm) GetOwnerId() string { + if x != nil { + return x.OwnerId + } + return "" +} + +type AMISelectorTerm 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"` + 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 *DeleteStorageRecommendationPolicyRequest) Reset() { - *x = DeleteStorageRecommendationPolicyRequest{} +func (x *AMISelectorTerm) Reset() { + *x = AMISelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[289] + mi := &file_api_v1_recommendation_proto_msgTypes[312] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStorageRecommendationPolicyRequest) String() string { +func (x *AMISelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} +func (*AMISelectorTerm) ProtoMessage() {} -func (x *DeleteStorageRecommendationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[289] +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 { @@ -22887,109 +26532,89 @@ 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{289} +// Deprecated: Use AMISelectorTerm.ProtoReflect.Descriptor instead. +func (*AMISelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{312} } -func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { +func (x *AMISelectorTerm) GetAlias() string { if x != nil { - return x.PolicyId + return x.Alias } return "" } -func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { +func (x *AMISelectorTerm) GetTags() map[string]string { if x != nil { - return x.TeamId + return x.Tags } - return "" -} - -type DeleteStorageRecommendationPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` + return nil } -func (x *DeleteStorageRecommendationPolicyResponse) Reset() { - *x = DeleteStorageRecommendationPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[290] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *AMISelectorTerm) GetId() string { + if x != nil { + return x.Id } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} - -func (x *DeleteStorageRecommendationPolicyResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *AMISelectorTerm) GetName() string { + if x != nil { + return x.Name } - return mi.MessageOf(x) + return "" } -// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. -func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{290} +func (x *AMISelectorTerm) GetOwner() string { + if x != nil { + return x.Owner + } + return "" } -func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { +func (x *AMISelectorTerm) GetSsmParameter() string { if x != nil { - return x.Success + return x.SsmParameter } - return false + return "" } -// StoragePolicyTarget maps a storage policy to clusters with targeting filters -type StoragePolicyTarget struct { +type KubeletConfiguration 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"` + 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 *StoragePolicyTarget) Reset() { - *x = StoragePolicyTarget{} +func (x *KubeletConfiguration) Reset() { + *x = KubeletConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[291] + mi := &file_api_v1_recommendation_proto_msgTypes[313] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StoragePolicyTarget) String() string { +func (x *KubeletConfiguration) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StoragePolicyTarget) ProtoMessage() {} +func (*KubeletConfiguration) ProtoMessage() {} -func (x *StoragePolicyTarget) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[291] +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 { @@ -23000,120 +26625,122 @@ 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{291} +// Deprecated: Use KubeletConfiguration.ProtoReflect.Descriptor instead. +func (*KubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} } -func (x *StoragePolicyTarget) GetTargetId() string { +func (x *KubeletConfiguration) GetClusterDns() []string { if x != nil { - return x.TargetId + return x.ClusterDns } - return "" + return nil } -func (x *StoragePolicyTarget) GetName() string { - if x != nil { - return x.Name +func (x *KubeletConfiguration) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods } - return "" + return 0 } -func (x *StoragePolicyTarget) GetDescription() string { - if x != nil { - return x.Description +func (x *KubeletConfiguration) GetPodsPerCore() int32 { + if x != nil && x.PodsPerCore != nil { + return *x.PodsPerCore } - return "" + return 0 } -func (x *StoragePolicyTarget) GetTeamId() string { +func (x *KubeletConfiguration) GetSystemReserved() map[string]string { if x != nil { - return x.TeamId + return x.SystemReserved } - return "" + return nil } -func (x *StoragePolicyTarget) GetClusterIds() []string { +func (x *KubeletConfiguration) GetKubeReserved() map[string]string { if x != nil { - return x.ClusterIds + return x.KubeReserved } return nil } -func (x *StoragePolicyTarget) GetPolicyId() string { +func (x *KubeletConfiguration) GetEvictionHard() map[string]string { if x != nil { - return x.PolicyId + return x.EvictionHard } - return "" + return nil } -func (x *StoragePolicyTarget) GetEnabled() bool { +func (x *KubeletConfiguration) GetEvictionSoft() map[string]string { if x != nil { - return x.Enabled + return x.EvictionSoft } - return false + return nil } -func (x *StoragePolicyTarget) GetNamespaceSelector() *LabelSelector { +func (x *KubeletConfiguration) GetEvictionSoftGracePeriod() map[string]string { if x != nil { - return x.NamespaceSelector + return x.EvictionSoftGracePeriod } return nil } -func (x *StoragePolicyTarget) GetStorageClasses() []string { - if x != nil { - return x.StorageClasses +func (x *KubeletConfiguration) GetEvictionMaxPodGracePeriod() int32 { + if x != nil && x.EvictionMaxPodGracePeriod != nil { + return *x.EvictionMaxPodGracePeriod } - return nil + return 0 } -func (x *StoragePolicyTarget) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt +func (x *KubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent } - return nil + return 0 } -func (x *StoragePolicyTarget) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt +func (x *KubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent } - return nil + return 0 } -type CreateStoragePolicyTargetRequest struct { +func (x *KubeletConfiguration) GetCpuCfsQuota() bool { + if x != nil && x.CpuCfsQuota != nil { + return *x.CpuCfsQuota + } + return false +} + +type BlockDeviceMapping 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"` + 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 *CreateStoragePolicyTargetRequest) Reset() { - *x = CreateStoragePolicyTargetRequest{} +func (x *BlockDeviceMapping) Reset() { + *x = BlockDeviceMapping{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[292] + mi := &file_api_v1_recommendation_proto_msgTypes[314] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetRequest) String() string { +func (x *BlockDeviceMapping) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} +func (*BlockDeviceMapping) ProtoMessage() {} -func (x *CreateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[292] +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 { @@ -23124,92 +26751,65 @@ 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{292} -} - -func (x *CreateStoragePolicyTargetRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CreateStoragePolicyTargetRequest) GetDescription() string { - if x != nil { - return x.Description - } - return "" +// Deprecated: Use BlockDeviceMapping.ProtoReflect.Descriptor instead. +func (*BlockDeviceMapping) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{314} } -func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *BlockDeviceMapping) GetDeviceName() string { + if x != nil && x.DeviceName != nil { + return *x.DeviceName } return "" } -func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { +func (x *BlockDeviceMapping) GetEbs() *BlockDevice { if x != nil { - return x.ClusterIds + return x.Ebs } return nil } -func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId - } - return "" -} - -func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { - if x != nil { - return x.Enabled +func (x *BlockDeviceMapping) GetRootVolume() bool { + if x != nil && x.RootVolume != nil { + return *x.RootVolume } return false } -func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { - if x != nil { - return x.NamespaceSelector - } - return nil -} - -func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { - if x != nil { - return x.StorageClasses - } - return nil -} - -type CreateStoragePolicyTargetResponse struct { +type BlockDevice struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,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 *CreateStoragePolicyTargetResponse) Reset() { - *x = CreateStoragePolicyTargetResponse{} +func (x *BlockDevice) Reset() { + *x = BlockDevice{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[293] + mi := &file_api_v1_recommendation_proto_msgTypes[315] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateStoragePolicyTargetResponse) String() string { +func (x *BlockDevice) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} +func (*BlockDevice) ProtoMessage() {} -func (x *CreateStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[293] +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 { @@ -23220,98 +26820,102 @@ 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{293} +// Deprecated: Use BlockDevice.ProtoReflect.Descriptor instead. +func (*BlockDevice) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{315} } -func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { - if x != nil { - return x.Target +func (x *BlockDevice) GetDeleteOnTermination() bool { + if x != nil && x.DeleteOnTermination != nil { + return *x.DeleteOnTermination } - return nil -} - -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,oneof" json:"cluster_id,omitempty"` + return false } -func (x *ListStoragePolicyTargetsRequest) Reset() { - *x = ListStoragePolicyTargetsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[294] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *BlockDevice) GetEncrypted() bool { + if x != nil && x.Encrypted != nil { + return *x.Encrypted } + return false } -func (x *ListStoragePolicyTargetsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} - -func (x *ListStoragePolicyTargetsRequest) 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 +func (x *BlockDevice) GetIops() int64 { + if x != nil && x.Iops != nil { + return *x.Iops } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{294} +func (x *BlockDevice) GetKmsKeyId() string { + if x != nil && x.KmsKeyId != nil { + return *x.KmsKeyId + } + return "" } -func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *BlockDevice) GetSnapshotId() string { + if x != nil && x.SnapshotId != nil { + return *x.SnapshotId } return "" } -func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *BlockDevice) GetThroughput() int64 { + if x != nil && x.Throughput != nil { + return *x.Throughput + } + return 0 +} + +func (x *BlockDevice) GetVolumeInitializationRate() int32 { + if x != nil && x.VolumeInitializationRate != nil { + return *x.VolumeInitializationRate + } + return 0 +} + +func (x *BlockDevice) GetVolumeSize() string { + if x != nil && x.VolumeSize != nil { + return *x.VolumeSize } return "" } -type ListStoragePolicyTargetsResponse struct { +func (x *BlockDevice) GetVolumeType() string { + if x != nil && x.VolumeType != nil { + return *x.VolumeType + } + return "" +} + +type MetadataOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,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 *ListStoragePolicyTargetsResponse) Reset() { - *x = ListStoragePolicyTargetsResponse{} +func (x *MetadataOptions) Reset() { + *x = MetadataOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[295] + mi := &file_api_v1_recommendation_proto_msgTypes[316] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListStoragePolicyTargetsResponse) String() string { +func (x *MetadataOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} +func (*MetadataOptions) ProtoMessage() {} -func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[295] +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 { @@ -23322,43 +26926,71 @@ func (x *ListStoragePolicyTargetsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. -func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{295} +// Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. +func (*MetadataOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{316} } -func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { - if x != nil { - return x.Targets +func (x *MetadataOptions) GetHttpEndpoint() string { + if x != nil && x.HttpEndpoint != nil { + return *x.HttpEndpoint } - return nil + return "" } -type UpdateStoragePolicyTargetRequest struct { +func (x *MetadataOptions) GetHttpProtocolIpv6() string { + if x != nil && x.HttpProtocolIpv6 != nil { + return *x.HttpProtocolIpv6 + } + 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 + } + return "" +} + +type GCPNodeClassSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,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 *UpdateStoragePolicyTargetRequest) Reset() { - *x = UpdateStoragePolicyTargetRequest{} +func (x *GCPNodeClassSpec) Reset() { + *x = GCPNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[296] + mi := &file_api_v1_recommendation_proto_msgTypes[317] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpdateStoragePolicyTargetRequest) String() string { +func (x *GCPNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} +func (*GCPNodeClassSpec) ProtoMessage() {} -func (x *UpdateStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[296] +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 { @@ -23369,91 +27001,93 @@ 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{296} +// Deprecated: Use GCPNodeClassSpec.ProtoReflect.Descriptor instead. +func (*GCPNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{317} } -func (x *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { +func (x *GCPNodeClassSpec) GetServiceAccount() string { if x != nil { - return x.Target + return x.ServiceAccount } - return nil + return "" } -type UpdateStoragePolicyTargetResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` +func (x *GCPNodeClassSpec) GetImageSelectorTerms() []*GCPImageSelectorTerm { + if x != nil { + return x.ImageSelectorTerms + } + return nil } -func (x *UpdateStoragePolicyTargetResponse) Reset() { - *x = UpdateStoragePolicyTargetResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[297] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *GCPNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily } + return "" } -func (x *UpdateStoragePolicyTargetResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *GCPNodeClassSpec) GetKubeletConfiguration() *KubeletConfiguration { + if x != nil { + return x.KubeletConfiguration + } + return nil } -func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} +func (x *GCPNodeClassSpec) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} -func (x *UpdateStoragePolicyTargetResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *GCPNodeClassSpec) GetMetadata() map[string]string { + if x != nil { + return x.Metadata } - return mi.MessageOf(x) + return nil } -// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. -func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{297} +func (x *GCPNodeClassSpec) GetNetworkTags() []string { + if x != nil { + return x.NetworkTags + } + return nil } -func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { +func (x *GCPNodeClassSpec) GetDisks() []*GCPDisk { if x != nil { - return x.Target + return x.Disks } return nil } -type DeleteStoragePolicyTargetRequest struct { +type GCPImageSelectorTerm 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"` + 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 *DeleteStoragePolicyTargetRequest) Reset() { - *x = DeleteStoragePolicyTargetRequest{} +func (x *GCPImageSelectorTerm) Reset() { + *x = GCPImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[298] + mi := &file_api_v1_recommendation_proto_msgTypes[318] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetRequest) String() string { +func (x *GCPImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} +func (*GCPImageSelectorTerm) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[298] +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 { @@ -23464,50 +27098,54 @@ 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{298} +// Deprecated: Use GCPImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*GCPImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{318} } -func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { +func (x *GCPImageSelectorTerm) GetAlias() string { if x != nil { - return x.TargetId + return x.Alias } return "" } -func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { +func (x *GCPImageSelectorTerm) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -type DeleteStoragePolicyTargetResponse struct { +type GCPDisk struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,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 *DeleteStoragePolicyTargetResponse) Reset() { - *x = DeleteStoragePolicyTargetResponse{} +func (x *GCPDisk) Reset() { + *x = GCPDisk{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[299] + mi := &file_api_v1_recommendation_proto_msgTypes[319] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteStoragePolicyTargetResponse) String() string { +func (x *GCPDisk) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} +func (*GCPDisk) ProtoMessage() {} -func (x *DeleteStoragePolicyTargetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[299] +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 { @@ -23518,72 +27156,78 @@ 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{299} +// Deprecated: Use GCPDisk.ProtoReflect.Descriptor instead. +func (*GCPDisk) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{319} } -func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { +func (x *GCPDisk) GetSizeGib() int32 { if x != nil { - return x.Success + 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 } -// PvcStorageRecommendation represents a specific recommendation for a PVC -type PvcStorageRecommendation struct { +func (x *GCPDisk) GetSecondaryBootImage() string { + if x != nil { + return x.SecondaryBootImage + } + return "" +} + +func (x *GCPDisk) GetSecondaryBootMode() string { + if x != nil { + return x.SecondaryBootMode + } + return "" +} + +type AzureNodeClassSpec 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"` + 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 *PvcStorageRecommendation) Reset() { - *x = PvcStorageRecommendation{} +func (x *AzureNodeClassSpec) Reset() { + *x = AzureNodeClassSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[300] + mi := &file_api_v1_recommendation_proto_msgTypes[320] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PvcStorageRecommendation) String() string { +func (x *AzureNodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PvcStorageRecommendation) ProtoMessage() {} +func (*AzureNodeClassSpec) ProtoMessage() {} -func (x *PvcStorageRecommendation) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[300] +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 { @@ -23594,239 +27238,213 @@ 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{300} +// Deprecated: Use AzureNodeClassSpec.ProtoReflect.Descriptor instead. +func (*AzureNodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{320} } -func (x *PvcStorageRecommendation) GetRecommendationId() string { - if x != nil { - return x.RecommendationId +func (x *AzureNodeClassSpec) GetVnetSubnetId() string { + if x != nil && x.VnetSubnetId != nil { + return *x.VnetSubnetId } return "" } -func (x *PvcStorageRecommendation) GetPvcUid() string { - if x != nil { - return x.PvcUid +func (x *AzureNodeClassSpec) GetOsDiskSizeGb() int32 { + if x != nil && x.OsDiskSizeGb != nil { + return *x.OsDiskSizeGb } - return "" + return 0 } -func (x *PvcStorageRecommendation) GetPvcName() string { - if x != nil { - return x.PvcName +func (x *AzureNodeClassSpec) GetImageFamily() string { + if x != nil && x.ImageFamily != nil { + return *x.ImageFamily } return "" } -func (x *PvcStorageRecommendation) GetNamespace() string { - if x != nil { - return x.Namespace +func (x *AzureNodeClassSpec) GetFipsMode() string { + if x != nil && x.FipsMode != nil { + return *x.FipsMode } return "" } -func (x *PvcStorageRecommendation) GetClusterId() string { +func (x *AzureNodeClassSpec) GetTags() map[string]string { if x != nil { - return x.ClusterId + return x.Tags } - return "" + return nil } -func (x *PvcStorageRecommendation) GetTeamId() string { +func (x *AzureNodeClassSpec) GetKubelet() *AzureKubeletConfiguration { if x != nil { - return x.TeamId + return x.Kubelet } - return "" + return nil } -func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { - if x != nil { - return x.CurrentCapacityBytes +func (x *AzureNodeClassSpec) GetMaxPods() int32 { + if x != nil && x.MaxPods != nil { + return *x.MaxPods } return 0 } -func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { - if x != nil { - return x.RecommendedCapacityBytes +func (x *AzureNodeClassSpec) GetImageVersion() string { + if x != nil && x.ImageVersion != nil { + return *x.ImageVersion } - return 0 + return "" } -func (x *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { - if x != nil { - return x.UsedBytesAtTime - } - return 0 +type AzureKubeletConfiguration 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"` } -func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { - if x != nil { - return x.UtilizationPct +func (x *AzureKubeletConfiguration) Reset() { + *x = AzureKubeletConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[321] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { - if x != nil { - return x.GrowthRateBytesPerDay - } - return 0 +func (x *AzureKubeletConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *PvcStorageRecommendation) GetDaysToFull() float64 { - if x != nil { - return x.DaysToFull +func (*AzureKubeletConfiguration) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { - if x != nil { - return x.ConfidenceScore - } - return 0 +// Deprecated: Use AzureKubeletConfiguration.ProtoReflect.Descriptor instead. +func (*AzureKubeletConfiguration) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{321} } -func (x *PvcStorageRecommendation) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *AzureKubeletConfiguration) GetCpuManagerPolicy() string { + if x != nil && x.CpuManagerPolicy != nil { + return *x.CpuManagerPolicy } return "" } -func (x *PvcStorageRecommendation) GetPolicyTargetId() string { - if x != nil && x.PolicyTargetId != nil { - return *x.PolicyTargetId +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 *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { - if x != nil { - return x.CostCurrentMonthlyUsd +func (x *AzureKubeletConfiguration) GetImageGcHighThresholdPercent() int32 { + if x != nil && x.ImageGcHighThresholdPercent != nil { + return *x.ImageGcHighThresholdPercent } return 0 } -func (x *PvcStorageRecommendation) GetCostRecommendedMonthlyUsd() float64 { - if x != nil { - return x.CostRecommendedMonthlyUsd +func (x *AzureKubeletConfiguration) GetImageGcLowThresholdPercent() int32 { + if x != nil && x.ImageGcLowThresholdPercent != nil { + return *x.ImageGcLowThresholdPercent } return 0 } -func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { - if x != nil { - return x.CostDeltaMonthlyUsd +func (x *AzureKubeletConfiguration) GetTopologyManagerPolicy() string { + if x != nil && x.TopologyManagerPolicy != nil { + return *x.TopologyManagerPolicy } - return 0 + return "" } -func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { +func (x *AzureKubeletConfiguration) GetAllowedUnsafeSysctls() []string { if x != nil { - return x.Status + return x.AllowedUnsafeSysctls } - return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED + return nil } -func (x *PvcStorageRecommendation) GetReasoning() string { - if x != nil && x.Reasoning != nil { - return *x.Reasoning +func (x *AzureKubeletConfiguration) GetContainerLogMaxSize() string { + if x != nil && x.ContainerLogMaxSize != nil { + return *x.ContainerLogMaxSize } return "" } -func (x *PvcStorageRecommendation) GetError() string { - if x != nil && x.Error != nil { - return *x.Error +func (x *AzureKubeletConfiguration) GetContainerLogMaxFiles() int32 { + if x != nil && x.ContainerLogMaxFiles != nil { + return *x.ContainerLogMaxFiles } - return "" + return 0 } -func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp +func (x *AzureKubeletConfiguration) GetPodPidsLimit() int64 { + if x != nil && x.PodPidsLimit != nil { + return *x.PodPidsLimit } - return nil + return 0 } -func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { - if x != nil { - return x.AppliedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt - } - return nil -} - -func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { - if x != nil { - return x.OperationType - } - return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED -} - -func (x *PvcStorageRecommendation) GetWorkloadKind() string { - if x != nil && x.WorkloadKind != nil { - return *x.WorkloadKind - } - return "" -} - -func (x *PvcStorageRecommendation) GetWorkloadName() string { - if x != nil && x.WorkloadName != nil { - return *x.WorkloadName - } - return "" -} - -func (x *PvcStorageRecommendation) GetWorkloadUid() string { - if x != nil && x.WorkloadUid != nil { - return *x.WorkloadUid - } - return "" -} - -type GetPvcStorageRecommendationRequest struct { +type OCIImageSelectorTerm 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"` + 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 *GetPvcStorageRecommendationRequest) Reset() { - *x = GetPvcStorageRecommendationRequest{} +func (x *OCIImageSelectorTerm) Reset() { + *x = OCIImageSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[301] + mi := &file_api_v1_recommendation_proto_msgTypes[322] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPvcStorageRecommendationRequest) String() string { +func (x *OCIImageSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCIImageSelectorTerm) ProtoMessage() {} -func (x *GetPvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[301] +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 { @@ -23837,43 +27455,58 @@ 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{301} +// Deprecated: Use OCIImageSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCIImageSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{322} } -func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { +func (x *OCIImageSelectorTerm) GetId() string { if x != nil { - return x.RecommendationId + return x.Id } return "" } -type GetPvcStorageRecommendationResponse struct { +func (x *OCIImageSelectorTerm) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *OCIImageSelectorTerm) GetCompartmentId() string { + if x != nil { + return x.CompartmentId + } + return "" +} + +type OCISubnetSelectorTerm struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,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 *GetPvcStorageRecommendationResponse) Reset() { - *x = GetPvcStorageRecommendationResponse{} +func (x *OCISubnetSelectorTerm) Reset() { + *x = OCISubnetSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[302] + mi := &file_api_v1_recommendation_proto_msgTypes[323] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetPvcStorageRecommendationResponse) String() string { +func (x *OCISubnetSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} +func (*OCISubnetSelectorTerm) ProtoMessage() {} -func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[302] +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 { @@ -23884,45 +27517,51 @@ func (x *GetPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. -func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{302} +// Deprecated: Use OCISubnetSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISubnetSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{323} } -func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *OCISubnetSelectorTerm) GetId() string { if x != nil { - return x.Recommendation + return x.Id } - return nil + return "" } -type ListPvcStorageRecommendationsRequest 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 - 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"` + 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 *ListPvcStorageRecommendationsRequest) Reset() { - *x = ListPvcStorageRecommendationsRequest{} +func (x *OCISecurityGroupSelectorTerm) Reset() { + *x = OCISecurityGroupSelectorTerm{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[303] + mi := &file_api_v1_recommendation_proto_msgTypes[324] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsRequest) String() string { +func (x *OCISecurityGroupSelectorTerm) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} +func (*OCISecurityGroupSelectorTerm) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[303] +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 { @@ -23933,58 +27572,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{303} +// Deprecated: Use OCISecurityGroupSelectorTerm.ProtoReflect.Descriptor instead. +func (*OCISecurityGroupSelectorTerm) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{324} } -func (x *ListPvcStorageRecommendationsRequest) GetTeamId() string { +func (x *OCISecurityGroupSelectorTerm) GetId() string { if x != nil { - return x.TeamId - } - return "" -} - -func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId + return x.Id } return "" } -func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { +func (x *OCISecurityGroupSelectorTerm) GetName() string { if x != nil { - return x.Pagination + return x.Name } - return nil + return "" } -type ListPvcStorageRecommendationsResponse struct { +type OCIBootConfig 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"` + 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 *ListPvcStorageRecommendationsResponse) Reset() { - *x = ListPvcStorageRecommendationsResponse{} +func (x *OCIBootConfig) Reset() { + *x = OCIBootConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[304] + mi := &file_api_v1_recommendation_proto_msgTypes[325] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPvcStorageRecommendationsResponse) String() string { +func (x *OCIBootConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} +func (*OCIBootConfig) ProtoMessage() {} -func (x *ListPvcStorageRecommendationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[304] +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 { @@ -23995,53 +27627,54 @@ 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{304} +// Deprecated: Use OCIBootConfig.ProtoReflect.Descriptor instead. +func (*OCIBootConfig) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} } -func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { +func (x *OCIBootConfig) GetBootVolumeSizeInGbs() int64 { if x != nil { - return x.Recommendations + return x.BootVolumeSizeInGbs } - return nil + return 0 } -func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { +func (x *OCIBootConfig) GetBootVolumeVpusPerGb() int64 { if x != nil { - return x.Pagination + return x.BootVolumeVpusPerGb } - return nil + return 0 } -type GeneratePvcStorageRecommendationRequest struct { +type OCILaunchOptions 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"` + 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 *GeneratePvcStorageRecommendationRequest) Reset() { - *x = GeneratePvcStorageRecommendationRequest{} +func (x *OCILaunchOptions) Reset() { + *x = OCILaunchOptions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[305] + mi := &file_api_v1_recommendation_proto_msgTypes[326] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationRequest) String() string { +func (x *OCILaunchOptions) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCILaunchOptions) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[305] +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 { @@ -24052,67 +27685,72 @@ 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{305} +// Deprecated: Use OCILaunchOptions.ProtoReflect.Descriptor instead. +func (*OCILaunchOptions) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{326} } -func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { - if x != nil { - return x.TeamId +func (x *OCILaunchOptions) GetBootVolumeType() string { + if x != nil && x.BootVolumeType != nil { + return *x.BootVolumeType } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *OCILaunchOptions) GetFirmware() string { + if x != nil && x.Firmware != nil { + return *x.Firmware } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { - if x != nil { - return x.PvcUid +func (x *OCILaunchOptions) GetNetworkType() string { + if x != nil && x.NetworkType != nil { + return *x.NetworkType } return "" } -func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId +func (x *OCILaunchOptions) GetRemoteDataVolumeType() string { + if x != nil && x.RemoteDataVolumeType != nil { + return *x.RemoteDataVolumeType } return "" } -type GeneratePvcStorageRecommendationResponse struct { +func (x *OCILaunchOptions) GetIsConsistentVolumeNamingEnabled() bool { + if x != nil && x.IsConsistentVolumeNamingEnabled != nil { + return *x.IsConsistentVolumeNamingEnabled + } + return false +} + +type OCIVolumeAttributes 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"` + 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 *GeneratePvcStorageRecommendationResponse) Reset() { - *x = GeneratePvcStorageRecommendationResponse{} +func (x *OCIVolumeAttributes) Reset() { + *x = OCIVolumeAttributes{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[306] + mi := &file_api_v1_recommendation_proto_msgTypes[327] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GeneratePvcStorageRecommendationResponse) String() string { +func (x *OCIVolumeAttributes) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} +func (*OCIVolumeAttributes) ProtoMessage() {} -func (x *GeneratePvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[306] +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 { @@ -24123,53 +27761,63 @@ 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{306} +// Deprecated: Use OCIVolumeAttributes.ProtoReflect.Descriptor instead. +func (*OCIVolumeAttributes) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{327} } -func (x *GeneratePvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *OCIVolumeAttributes) GetSizeInGbs() int64 { if x != nil { - return x.Recommendation + return x.SizeInGbs } - return nil + return 0 } -func (x *GeneratePvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *OCIVolumeAttributes) GetVpusPerGb() int64 { + if x != nil { + return x.VpusPerGb } - return "" + return 0 } -type PreviewPvcStorageRecommendationRequest struct { +type OCINodeClassSpec 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"` + 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 *PreviewPvcStorageRecommendationRequest) Reset() { - *x = PreviewPvcStorageRecommendationRequest{} +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 *PreviewPvcStorageRecommendationRequest) String() string { +func (x *OCINodeClassSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} +func (*OCINodeClassSpec) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationRequest) 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 { @@ -24180,65 +27828,136 @@ 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{307} +// Deprecated: Use OCINodeClassSpec.ProtoReflect.Descriptor instead. +func (*OCINodeClassSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{328} } -func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { +func (x *OCINodeClassSpec) GetVcnId() string { if x != nil { - return x.TeamId + return x.VcnId } return "" } -func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { +func (x *OCINodeClassSpec) GetImageSelector() []*OCIImageSelectorTerm { if x != nil { - return x.ClusterId + return x.ImageSelector } - return "" + return nil } -func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { +func (x *OCINodeClassSpec) GetSubnetSelector() []*OCISubnetSelectorTerm { if x != nil { - return x.PvcUid + return x.SubnetSelector + } + return nil +} + +func (x *OCINodeClassSpec) GetSecurityGroupSelector() []*OCISecurityGroupSelectorTerm { + if x != nil { + return x.SecurityGroupSelector + } + return nil +} + +func (x *OCINodeClassSpec) GetUserData() string { + if x != nil && x.UserData != nil { + return *x.UserData } return "" } -func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { +func (x *OCINodeClassSpec) GetPreInstallScript() string { + if x != nil && x.PreInstallScript != nil { + return *x.PreInstallScript + } + return "" +} + +func (x *OCINodeClassSpec) GetMetaData() map[string]string { if x != nil { - return x.PolicyId + return x.MetaData + } + return nil +} + +func (x *OCINodeClassSpec) GetImageFamily() string { + if x != nil { + return x.ImageFamily } return "" } -type PreviewPvcStorageRecommendationResponse struct { +func (x *OCINodeClassSpec) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +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 - 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"` + // 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 *PreviewPvcStorageRecommendationResponse) Reset() { - *x = PreviewPvcStorageRecommendationResponse{} +func (x *KarpenterSettingsRecommendation) Reset() { + *x = KarpenterSettingsRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[308] + mi := &file_api_v1_recommendation_proto_msgTypes[329] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewPvcStorageRecommendationResponse) String() string { +func (x *KarpenterSettingsRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} +func (*KarpenterSettingsRecommendation) ProtoMessage() {} -func (x *PreviewPvcStorageRecommendationResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[308] +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 { @@ -24249,64 +27968,51 @@ 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{308} +// Deprecated: Use KarpenterSettingsRecommendation.ProtoReflect.Descriptor instead. +func (*KarpenterSettingsRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{329} } -func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { +func (x *KarpenterSettingsRecommendation) GetContents() []byte { if x != nil { - return x.Recommendation + return x.Contents } return nil } -func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { - if x != nil && x.SkipReason != nil { - return *x.SkipReason +func (x *KarpenterSettingsRecommendation) GetRecommendationId() string { + if x != nil { + return x.RecommendationId } return "" } -type WorkloadRuleOOMEvent struct { +type RawKarpenterSpec 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"` + 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 *WorkloadRuleOOMEvent) Reset() { - *x = WorkloadRuleOOMEvent{} +func (x *RawKarpenterSpec) Reset() { + *x = RawKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[309] + mi := &file_api_v1_recommendation_proto_msgTypes[330] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleOOMEvent) String() string { +func (x *RawKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleOOMEvent) ProtoMessage() {} +func (*RawKarpenterSpec) ProtoMessage() {} -func (x *WorkloadRuleOOMEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[309] +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 { @@ -24317,144 +28023,125 @@ 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{309} -} - -func (x *WorkloadRuleOOMEvent) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use RawKarpenterSpec.ProtoReflect.Descriptor instead. +func (*RawKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{330} } -func (x *WorkloadRuleOOMEvent) GetRuleId() string { +func (x *RawKarpenterSpec) GetNodepoolYaml() string { if x != nil { - return x.RuleId + return x.NodepoolYaml } return "" } -func (x *WorkloadRuleOOMEvent) GetClusterId() string { +func (x *RawKarpenterSpec) GetNodeclassYaml() string { if x != nil { - return x.ClusterId + return x.NodeclassYaml } return "" } -func (x *WorkloadRuleOOMEvent) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} +// 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 -func (x *WorkloadRuleOOMEvent) GetWorkloadName() string { - if x != nil { - return x.WorkloadName - } - return "" + 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 *WorkloadRuleOOMEvent) GetContainerName() string { - if x != nil { - return x.ContainerName +func (x *SnapshotRecommendation) Reset() { + *x = SnapshotRecommendation{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[331] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil +func (x *SnapshotRecommendation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { - if x != nil { - return x.RuleGeneration - } - return 0 -} +func (*SnapshotRecommendation) ProtoMessage() {} -func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { - if x != nil { - return x.MemoryRequestAt +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { - if x != nil { - return x.MemoryLimitAt - } - return 0 +// Deprecated: Use SnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*SnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} } -func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { +func (x *SnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.MemoryUsageAt + return x.CompiledResourcesYaml } - return 0 + return nil } -func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { +func (x *SnapshotRecommendation) GetSnapshotCfgId() string { if x != nil { - return x.EmergencyReaction - } - return false -} - -func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { - if x != nil && x.NewMemoryAfter != nil { - return *x.NewMemoryAfter - } - return 0 -} - -func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { - if x != nil && x.RestartCount != nil { - return *x.RestartCount + return x.SnapshotCfgId } - return 0 + return "" } -func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *SnapshotRecommendation) GetContentHash() string { if x != nil { - return x.CreatedAt + return x.ContentHash } - return nil + return "" } -type ListWorkloadRuleOOMEventsRequest 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 - 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"` + 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 *ListWorkloadRuleOOMEventsRequest) Reset() { - *x = ListWorkloadRuleOOMEventsRequest{} +func (x *ForensicSnapshotRecommendation) Reset() { + *x = ForensicSnapshotRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[310] + mi := &file_api_v1_recommendation_proto_msgTypes[332] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsRequest) String() string { +func (x *ForensicSnapshotRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} +func (*ForensicSnapshotRecommendation) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[310] +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 { @@ -24465,65 +28152,59 @@ 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{310} +// Deprecated: Use ForensicSnapshotRecommendation.ProtoReflect.Descriptor instead. +func (*ForensicSnapshotRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{332} } -func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { +func (x *ForensicSnapshotRecommendation) GetCompiledResourcesYaml() []byte { if x != nil { - return x.RuleId - } - return "" -} - -func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { - if x != nil && x.Generation != nil { - return *x.Generation + return x.CompiledResourcesYaml } - return 0 + return nil } -func (x *ListWorkloadRuleOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit +func (x *ForensicSnapshotRecommendation) GetForensicCfgId() string { + if x != nil { + return x.ForensicCfgId } - return 0 + return "" } -func (x *ListWorkloadRuleOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset +func (x *ForensicSnapshotRecommendation) GetContentHash() string { + if x != nil { + return x.ContentHash } - return 0 + return "" } -type ListWorkloadRuleOOMEventsResponse struct { +// 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 - Events []*WorkloadRuleOOMEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` - Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Resources []*SnapshotCRStatus `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` } -func (x *ListWorkloadRuleOOMEventsResponse) Reset() { - *x = ListWorkloadRuleOOMEventsResponse{} +func (x *SnapshotCRStatusReport) Reset() { + *x = SnapshotCRStatusReport{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[311] + mi := &file_api_v1_recommendation_proto_msgTypes[333] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleOOMEventsResponse) String() string { +func (x *SnapshotCRStatusReport) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} +func (*SnapshotCRStatusReport) ProtoMessage() {} -func (x *ListWorkloadRuleOOMEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[311] +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 { @@ -24534,54 +28215,51 @@ 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{311} +// Deprecated: Use SnapshotCRStatusReport.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatusReport) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} } -func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *SnapshotCRStatusReport) GetResources() []*SnapshotCRStatus { if x != nil { - return x.Events + return x.Resources } return nil } -func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { - if x != nil { - return x.Total - } - return 0 -} - -type ListWorkloadOOMEventsRequest 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 - 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"` + 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 *ListWorkloadOOMEventsRequest) Reset() { - *x = ListWorkloadOOMEventsRequest{} +func (x *SnapshotCRStatus) Reset() { + *x = SnapshotCRStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[312] + mi := &file_api_v1_recommendation_proto_msgTypes[334] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOOMEventsRequest) String() string { +func (x *SnapshotCRStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} +func (*SnapshotCRStatus) ProtoMessage() {} -func (x *ListWorkloadOOMEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[312] +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 { @@ -24592,140 +28270,99 @@ 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{312} +// Deprecated: Use SnapshotCRStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} } -func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { +func (x *SnapshotCRStatus) GetKind() string { if x != nil { - return x.ClusterId + return x.Kind } return "" } -func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { +func (x *SnapshotCRStatus) GetName() string { if x != nil { - return x.Namespace + return x.Name } return "" } -func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { +func (x *SnapshotCRStatus) GetNamespace() string { if x != nil { - return x.WorkloadName + return x.Namespace } return "" } -func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { - if x != nil && x.Limit != nil { - return *x.Limit - } - return 0 -} - -func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { - if x != nil && x.Offset != nil { - return *x.Offset - } - return 0 -} - -type ListWorkloadOOMEventsResponse 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"` -} - -func (x *ListWorkloadOOMEventsResponse) Reset() { - *x = ListWorkloadOOMEventsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[313] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ListWorkloadOOMEventsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} - -func (x *ListWorkloadOOMEventsResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *SnapshotCRStatus) GetUid() string { + if x != nil { + return x.Uid } - return mi.MessageOf(x) -} - -// Deprecated: Use ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{313} + return "" } -func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { +func (x *SnapshotCRStatus) GetAnnotations() map[string]string { if x != nil { - return x.Events + return x.Annotations } return nil } -func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { +func (x *SnapshotCRStatus) GetStatusJson() []byte { if x != nil { - return x.Total + return x.StatusJson } - return 0 + return nil } -type WorkloadRuleCPUThrottleEvent struct { +// 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"` - 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 *WorkloadRuleCPUThrottleEvent) Reset() { - *x = WorkloadRuleCPUThrottleEvent{} + 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[314] + mi := &file_api_v1_recommendation_proto_msgTypes[335] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadRuleCPUThrottleEvent) String() string { +func (x *SnapshotCRRuntimeStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} +func (*SnapshotCRRuntimeStatus) ProtoMessage() {} -func (x *WorkloadRuleCPUThrottleEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[314] +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 { @@ -24736,144 +28373,136 @@ 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{314} +// Deprecated: Use SnapshotCRRuntimeStatus.ProtoReflect.Descriptor instead. +func (*SnapshotCRRuntimeStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{335} } -func (x *WorkloadRuleCPUThrottleEvent) GetId() string { +func (x *SnapshotCRRuntimeStatus) GetClusterId() string { if x != nil { - return x.Id + return x.ClusterId } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleId() string { +func (x *SnapshotCRRuntimeStatus) GetKind() string { if x != nil { - return x.RuleId + return x.Kind } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetClusterId() string { +func (x *SnapshotCRRuntimeStatus) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { +func (x *SnapshotCRRuntimeStatus) 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 { +func (x *SnapshotCRRuntimeStatus) GetPhase() string { if x != nil { - return x.ContainerName + return x.Phase } return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetTimestamp() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetSnapshotCount() int32 { if x != nil { - return x.Timestamp + return x.SnapshotCount } - return nil + return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { +func (x *SnapshotCRRuntimeStatus) GetAttemptCount() int32 { if x != nil { - return x.RuleGeneration + return x.AttemptCount } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuRequestAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetFailureCount() int32 { if x != nil { - return x.CpuRequestAt + return x.FailureCount } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuLimitAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetCheckpointsCreated() int32 { if x != nil { - return x.CpuLimitAt + return x.CheckpointsCreated } return 0 } -func (x *WorkloadRuleCPUThrottleEvent) GetCpuUsageAt() int64 { +func (x *SnapshotCRRuntimeStatus) GetErrorMessage() string { if x != nil { - return x.CpuUsageAt + return x.ErrorMessage } - return 0 + return "" } -func (x *WorkloadRuleCPUThrottleEvent) GetThrottledFraction() float64 { +func (x *SnapshotCRRuntimeStatus) GetLastActivityTime() *timestamppb.Timestamp { if x != nil { - return x.ThrottledFraction + return x.LastActivityTime } - return 0 + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetEmergencyReaction() bool { +func (x *SnapshotCRRuntimeStatus) GetStartTime() *timestamppb.Timestamp { if x != nil { - return x.EmergencyReaction + return x.StartTime } - return false + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetNewCpuAfter() int64 { - if x != nil && x.NewCpuAfter != nil { - return *x.NewCpuAfter +func (x *SnapshotCRRuntimeStatus) GetCompletionTime() *timestamppb.Timestamp { + if x != nil { + return x.CompletionTime } - return 0 + return nil } -func (x *WorkloadRuleCPUThrottleEvent) GetCreatedAt() *timestamppb.Timestamp { +func (x *SnapshotCRRuntimeStatus) GetObservedAt() *timestamppb.Timestamp { if x != nil { - return x.CreatedAt + return x.ObservedAt } return nil } -type ListWorkloadRuleCPUThrottleEventsRequest 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 *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsRequest{} +func (x *SnapshotPolicyTargetStatus) Reset() { + *x = SnapshotPolicyTargetStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[315] + mi := &file_api_v1_recommendation_proto_msgTypes[336] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { +func (x *SnapshotPolicyTargetStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} +func (*SnapshotPolicyTargetStatus) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[315] +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 { @@ -24884,65 +28513,51 @@ 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{315} +// Deprecated: Use SnapshotPolicyTargetStatus.ProtoReflect.Descriptor instead. +func (*SnapshotPolicyTargetStatus) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{336} } -func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { +func (x *SnapshotPolicyTargetStatus) GetResources() []*SnapshotCRRuntimeStatus { 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.Resources } - return 0 + return nil } -type ListWorkloadRuleCPUThrottleEventsResponse 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 []*WorkloadRuleCPUThrottleEvent `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 *ListWorkloadRuleCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadRuleCPUThrottleEventsResponse{} +func (x *SnapshotPrereqs) Reset() { + *x = SnapshotPrereqs{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[316] + mi := &file_api_v1_recommendation_proto_msgTypes[337] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) String() string { +func (x *SnapshotPrereqs) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRuleCPUThrottleEventsResponse) ProtoMessage() {} +func (*SnapshotPrereqs) ProtoMessage() {} -func (x *ListWorkloadRuleCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[316] +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 { @@ -24953,54 +28568,61 @@ 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{316} +// Deprecated: Use SnapshotPrereqs.ProtoReflect.Descriptor instead. +func (*SnapshotPrereqs) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{337} } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *SnapshotPrereqs) GetKubernetesVersion() string { if x != nil { - return x.Events + return x.KubernetesVersion } - return nil + return "" } -func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { +func (x *SnapshotPrereqs) GetKubernetesVersionSupported() bool { if x != nil { - return x.Total + return x.KubernetesVersionSupported } - return 0 + return false } -type ListWorkloadCPUThrottleEventsRequest 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 *ListWorkloadCPUThrottleEventsRequest) Reset() { - *x = ListWorkloadCPUThrottleEventsRequest{} +func (x *NodeRecommendation) Reset() { + *x = NodeRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[317] + mi := &file_api_v1_recommendation_proto_msgTypes[338] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsRequest) String() string { +func (x *NodeRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} +func (*NodeRecommendation) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[317] +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 { @@ -25011,72 +28633,72 @@ 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{317} +// Deprecated: Use NodeRecommendation.ProtoReflect.Descriptor instead. +func (*NodeRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{338} } -func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { +func (x *NodeRecommendation) GetAws() *AWSKarpenterSpec { if x != nil { - return x.ClusterId + return x.Aws } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { +func (x *NodeRecommendation) GetAks() *AKSKarpenterSpec { if x != nil { - return x.Namespace + return x.Aks } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) GetWorkloadName() string { +func (x *NodeRecommendation) GetGcp() *GCPKarpenterSpec { if x != nil { - return x.WorkloadName + return x.Gcp } - return "" + return nil } -func (x *ListWorkloadCPUThrottleEventsRequest) 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 *ListWorkloadCPUThrottleEventsRequest) 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 ListWorkloadCPUThrottleEventsResponse struct { +type AWSKarpenterSpec 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"` + Ec2Nc []*EC2NodeClass `protobuf:"bytes,6,rep,name=ec2nc,proto3" json:"ec2nc,omitempty"` } -func (x *ListWorkloadCPUThrottleEventsResponse) Reset() { - *x = ListWorkloadCPUThrottleEventsResponse{} +func (x *AWSKarpenterSpec) Reset() { + *x = AWSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[318] + mi := &file_api_v1_recommendation_proto_msgTypes[339] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadCPUThrottleEventsResponse) String() string { +func (x *AWSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadCPUThrottleEventsResponse) ProtoMessage() {} +func (*AWSKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadCPUThrottleEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[318] +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 { @@ -25087,72 +28709,51 @@ 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{318} +// Deprecated: Use AWSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AWSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{339} } -func (x *ListWorkloadCPUThrottleEventsResponse) GetEvents() []*WorkloadRuleCPUThrottleEvent { +func (x *AWSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.Events + return x.Np } return nil } -func (x *ListWorkloadCPUThrottleEventsResponse) GetTotal() int64 { +func (x *AWSKarpenterSpec) GetEc2Nc() []*EC2NodeClass { if x != nil { - return x.Total + return x.Ec2Nc } - return 0 + return nil } -type WorkloadOptimizationPolicyProto 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"` - 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"` + 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 *WorkloadOptimizationPolicyProto) Reset() { - *x = WorkloadOptimizationPolicyProto{} +func (x *AKSKarpenterSpec) Reset() { + *x = AKSKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[319] + mi := &file_api_v1_recommendation_proto_msgTypes[340] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadOptimizationPolicyProto) String() string { +func (x *AKSKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} +func (*AKSKarpenterSpec) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[319] +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 { @@ -25163,185 +28764,144 @@ 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{319} -} - -func (x *WorkloadOptimizationPolicyProto) GetId() string { - if x != nil { - return x.Id - } - return "" +// Deprecated: Use AKSKarpenterSpec.ProtoReflect.Descriptor instead. +func (*AKSKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{340} } -func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { +func (x *AKSKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.TeamId + return x.Np } - return "" + return nil } -func (x *WorkloadOptimizationPolicyProto) GetName() string { +func (x *AKSKarpenterSpec) GetAksnc() []*AKSNodeClass { if x != nil { - return x.Name + return x.Aksnc } - return "" + return nil } -func (x *WorkloadOptimizationPolicyProto) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description - } - return "" -} +type NodePool struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadOptimizationPolicyProto) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false + 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 *WorkloadOptimizationPolicyProto) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +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 nil } -func (x *WorkloadOptimizationPolicyProto) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector - } - return nil +func (x *NodePool) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetCreatedAt() *timestamppb.Timestamp { - if x != nil { - return x.CreatedAt - } - return nil -} +func (*NodePool) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) GetUpdatedAt() *timestamppb.Timestamp { - if x != nil { - return x.UpdatedAt +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 *WorkloadOptimizationPolicyProto) GetClusterNames() map[string]string { - if x != nil { - return x.ClusterNames - } - return nil +// Deprecated: Use NodePool.ProtoReflect.Descriptor instead. +func (*NodePool) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{341} } -func (x *WorkloadOptimizationPolicyProto) GetActionTriggers() []ActionTrigger { +func (x *NodePool) GetContents() []byte { if x != nil { - return x.ActionTriggers + return x.Contents } return nil } -func (x *WorkloadOptimizationPolicyProto) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule - } - return "" -} +type EC2NodeClass struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *WorkloadOptimizationPolicyProto) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes - } - return 0 + 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 *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers +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 nil } -func (x *WorkloadOptimizationPolicyProto) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins - } - return nil +func (x *EC2NodeClass) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *WorkloadOptimizationPolicyProto) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule - } - return "" -} +func (*EC2NodeClass) ProtoMessage() {} -func (x *WorkloadOptimizationPolicyProto) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled +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 *WorkloadOptimizationPolicyProto) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling - } - return false +// Deprecated: Use EC2NodeClass.ProtoReflect.Descriptor instead. +func (*EC2NodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{342} } -func (x *WorkloadOptimizationPolicyProto) GetHpaEnabled() bool { +func (x *EC2NodeClass) GetContents() []byte { if x != nil { - return x.HpaEnabled + return x.Contents } - return false + return nil } -type CreateWorkloadOptimizationPolicyRequest struct { +type AKSNodeClass 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"` + 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 *CreateWorkloadOptimizationPolicyRequest) Reset() { - *x = CreateWorkloadOptimizationPolicyRequest{} +func (x *AKSNodeClass) Reset() { + *x = AKSNodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[320] + mi := &file_api_v1_recommendation_proto_msgTypes[343] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyRequest) String() string { +func (x *AKSNodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*AKSNodeClass) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[320] +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 { @@ -25352,141 +28912,98 @@ 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{320} -} - -func (x *CreateWorkloadOptimizationPolicyRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use AKSNodeClass.ProtoReflect.Descriptor instead. +func (*AKSNodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} } -func (x *CreateWorkloadOptimizationPolicyRequest) GetName() string { +func (x *AKSNodeClass) GetContents() []byte { if x != nil { - return x.Name + return x.Contents } - return "" + return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDescription() string { - if x != nil && x.Description != nil { - return *x.Description - } - return "" -} +type GCPKarpenterSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *CreateWorkloadOptimizationPolicyRequest) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false + 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 *CreateWorkloadOptimizationPolicyRequest) GetClusterIds() []string { - if x != nil { - return x.ClusterIds +func (x *GCPKarpenterSpec) Reset() { + *x = GCPKarpenterSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[344] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetNamespaceSelector() []string { - if x != nil { - return x.NamespaceSelector - } - return nil +func (x *GCPKarpenterSpec) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateWorkloadOptimizationPolicyRequest) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers - } - return nil -} +func (*GCPKarpenterSpec) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyRequest) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *CreateWorkloadOptimizationPolicyRequest) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes - } - return 0 +// Deprecated: Use GCPKarpenterSpec.ProtoReflect.Descriptor instead. +func (*GCPKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} } -func (x *CreateWorkloadOptimizationPolicyRequest) GetDetectionTriggers() []WorkloadDetectionTrigger { +func (x *GCPKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.DetectionTriggers + return x.Np } return nil } -func (x *CreateWorkloadOptimizationPolicyRequest) GetSchedulerPlugins() []string { +func (x *GCPKarpenterSpec) GetNodeClasses() []*GCENodeClass { if x != nil { - return x.SchedulerPlugins + return x.NodeClasses } 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) GetHpaEnabled() bool { - if x != nil { - return x.HpaEnabled - } - return false -} - -type CreateWorkloadOptimizationPolicyResponse struct { +type GCENodeClass struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,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 *CreateWorkloadOptimizationPolicyResponse) Reset() { - *x = CreateWorkloadOptimizationPolicyResponse{} +func (x *GCENodeClass) Reset() { + *x = GCENodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[321] + mi := &file_api_v1_recommendation_proto_msgTypes[345] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateWorkloadOptimizationPolicyResponse) String() string { +func (x *GCENodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*GCENodeClass) ProtoMessage() {} -func (x *CreateWorkloadOptimizationPolicyResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[321] +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 { @@ -25497,43 +29014,44 @@ 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{321} +// Deprecated: Use GCENodeClass.ProtoReflect.Descriptor instead. +func (*GCENodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} } -func (x *CreateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *GCENodeClass) GetContents() []byte { if x != nil { - return x.Policy + return x.Contents } return nil } -type ListWorkloadOptimizationPoliciesRequest struct { +type OCIKarpenterSpec 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"` + 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 *ListWorkloadOptimizationPoliciesRequest) Reset() { - *x = ListWorkloadOptimizationPoliciesRequest{} +func (x *OCIKarpenterSpec) Reset() { + *x = OCIKarpenterSpec{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[322] + mi := &file_api_v1_recommendation_proto_msgTypes[346] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesRequest) String() string { +func (x *OCIKarpenterSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesRequest) ProtoMessage() {} +func (*OCIKarpenterSpec) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[322] +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 { @@ -25544,43 +29062,50 @@ 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{322} +// Deprecated: Use OCIKarpenterSpec.ProtoReflect.Descriptor instead. +func (*OCIKarpenterSpec) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{346} } -func (x *ListWorkloadOptimizationPoliciesRequest) GetTeamId() string { +func (x *OCIKarpenterSpec) GetNp() []*NodePool { if x != nil { - return x.TeamId + return x.Np } - return "" + return nil } -type ListWorkloadOptimizationPoliciesResponse struct { +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 - Policies []*WorkloadOptimizationPolicyProto `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,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 *ListWorkloadOptimizationPoliciesResponse) Reset() { - *x = ListWorkloadOptimizationPoliciesResponse{} +func (x *OCINodeClass) Reset() { + *x = OCINodeClass{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[323] + mi := &file_api_v1_recommendation_proto_msgTypes[347] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListWorkloadOptimizationPoliciesResponse) String() string { +func (x *OCINodeClass) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadOptimizationPoliciesResponse) ProtoMessage() {} +func (*OCINodeClass) ProtoMessage() {} -func (x *ListWorkloadOptimizationPoliciesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[323] +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 { @@ -25591,44 +29116,65 @@ 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{323} +// Deprecated: Use OCINodeClass.ProtoReflect.Descriptor instead. +func (*OCINodeClass) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{347} } -func (x *ListWorkloadOptimizationPoliciesResponse) GetPolicies() []*WorkloadOptimizationPolicyProto { +func (x *OCINodeClass) GetContents() []byte { if x != nil { - return x.Policies + return x.Contents } return nil } -type GetWorkloadOptimizationPolicyRequest struct { +// StorageRecommendationPolicy represents a policy for PVC/storage optimization +type StorageRecommendationPolicy 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"` + 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 *GetWorkloadOptimizationPolicyRequest) Reset() { - *x = GetWorkloadOptimizationPolicyRequest{} +func (x *StorageRecommendationPolicy) Reset() { + *x = StorageRecommendationPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[324] + mi := &file_api_v1_recommendation_proto_msgTypes[348] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadOptimizationPolicyRequest) String() string { +func (x *StorageRecommendationPolicy) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*StorageRecommendationPolicy) ProtoMessage() {} -func (x *GetWorkloadOptimizationPolicyRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[324] +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 { @@ -25639,114 +29185,190 @@ 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{324} +// Deprecated: Use StorageRecommendationPolicy.ProtoReflect.Descriptor instead. +func (*StorageRecommendationPolicy) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{348} } -func (x *GetWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *StorageRecommendationPolicy) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *GetWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *StorageRecommendationPolicy) GetTeamId() string { if x != nil { - return x.PolicyId + return x.TeamId } return "" } -type GetWorkloadOptimizationPolicyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *StorageRecommendationPolicy) GetName() string { + if x != nil { + return x.Name + } + return "" +} - Policy *WorkloadOptimizationPolicyProto `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +func (x *StorageRecommendationPolicy) GetDescription() string { + if x != nil { + return x.Description + } + return "" } -func (x *GetWorkloadOptimizationPolicyResponse) Reset() { - *x = GetWorkloadOptimizationPolicyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[325] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *StorageRecommendationPolicy) GetActionTrigger() ActionTrigger { + if x != nil { + return x.ActionTrigger } + return ActionTrigger_ACTION_TRIGGER_UNSPECIFIED } -func (x *GetWorkloadOptimizationPolicyResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *StorageRecommendationPolicy) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil } -func (*GetWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (x *StorageRecommendationPolicy) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} -func (x *GetWorkloadOptimizationPolicyResponse) 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 +func (x *StorageRecommendationPolicy) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use GetWorkloadOptimizationPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadOptimizationPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{325} +func (x *StorageRecommendationPolicy) GetTargetUtilizationPercent() float32 { + if x != nil && x.TargetUtilizationPercent != nil { + return *x.TargetUtilizationPercent + } + return 0 } -func (x *GetWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *StorageRecommendationPolicy) GetWarnDaysToFull() int32 { + if x != nil && x.WarnDaysToFull != nil { + return *x.WarnDaysToFull + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMaxExpansionPerAction() float32 { + if x != nil && x.MaxExpansionPerAction != nil { + return *x.MaxExpansionPerAction + } + return 0 +} + +func (x *StorageRecommendationPolicy) GetMinDataPoints() int32 { + if x != nil && x.MinDataPoints != nil { + return *x.MinDataPoints + } + return 0 +} + +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.Policy + return x.IsDefaultPolicy + } + return false +} + +func (x *StorageRecommendationPolicy) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt } return nil } -type UpdateWorkloadOptimizationPolicyRequest struct { +func (x *StorageRecommendationPolicy) GetUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.UpdatedAt + } + return nil +} + +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"` - 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"` + 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 *UpdateWorkloadOptimizationPolicyRequest) Reset() { - *x = UpdateWorkloadOptimizationPolicyRequest{} +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 *UpdateWorkloadOptimizationPolicyRequest) String() string { +func (x *CreateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyRequest) 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 { @@ -25757,148 +29379,141 @@ 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{326} +// Deprecated: Use CreateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{349} } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetTeamId() string { +func (x *CreateStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *CreateStorageRecommendationPolicyRequest) GetName() string { if x != nil { - return x.PolicyId - } - return "" -} - -func (x *UpdateWorkloadOptimizationPolicyRequest) GetName() string { - if x != nil && x.Name != nil { - return *x.Name + return x.Name } return "" } -func (x *UpdateWorkloadOptimizationPolicyRequest) 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 *UpdateWorkloadOptimizationPolicyRequest) GetEnabled() bool { - if x != nil && x.Enabled != nil { - return *x.Enabled +func (x *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) 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 *CreateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds } - return false + return 0 } -type UpdateWorkloadOptimizationPolicyResponse 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 *UpdateWorkloadOptimizationPolicyResponse) Reset() { - *x = UpdateWorkloadOptimizationPolicyResponse{} +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 *UpdateWorkloadOptimizationPolicyResponse) String() string { +func (x *CreateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*CreateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *UpdateWorkloadOptimizationPolicyResponse) 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 { @@ -25909,45 +29524,43 @@ 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{327} +// Deprecated: Use CreateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*CreateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{350} } -func (x *UpdateWorkloadOptimizationPolicyResponse) GetPolicy() *WorkloadOptimizationPolicyProto { +func (x *CreateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { return x.Policy } return nil } -type DeleteWorkloadOptimizationPolicyRequest 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"` - 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"` } -func (x *DeleteWorkloadOptimizationPolicyRequest) Reset() { - *x = DeleteWorkloadOptimizationPolicyRequest{} +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 *DeleteWorkloadOptimizationPolicyRequest) String() string { +func (x *GetStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyRequest) ProtoMessage() {} +func (*GetStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyRequest) 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 { @@ -25958,55 +29571,43 @@ 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{328} -} - -func (x *DeleteWorkloadOptimizationPolicyRequest) 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 *DeleteWorkloadOptimizationPolicyRequest) GetPolicyId() string { +func (x *GetStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { return x.PolicyId } return "" } -func (x *DeleteWorkloadOptimizationPolicyRequest) GetDeleteRules() bool { - if x != nil { - return x.DeleteRules - } - return false -} - -type DeleteWorkloadOptimizationPolicyResponse struct { +type GetStorageRecommendationPolicyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` } -func (x *DeleteWorkloadOptimizationPolicyResponse) Reset() { - *x = DeleteWorkloadOptimizationPolicyResponse{} +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 *DeleteWorkloadOptimizationPolicyResponse) String() string { +func (x *GetStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadOptimizationPolicyResponse) ProtoMessage() {} +func (*GetStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *DeleteWorkloadOptimizationPolicyResponse) 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 { @@ -26017,37 +29618,43 @@ 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{329} +// Deprecated: Use GetStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*GetStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} } -type GetWorkloadRulesByPolicyRequest struct { +func (x *GetStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { + if x != nil { + return x.Policy + } + return nil +} + +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 *GetWorkloadRulesByPolicyRequest) Reset() { - *x = GetWorkloadRulesByPolicyRequest{} +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 *GetWorkloadRulesByPolicyRequest) String() string { +func (x *ListStorageRecommendationPoliciesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRulesByPolicyRequest) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesRequest) ProtoMessage() {} -func (x *GetWorkloadRulesByPolicyRequest) 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 { @@ -26058,52 +29665,43 @@ 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{330} +// Deprecated: Use ListStorageRecommendationPoliciesRequest.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{353} } -func (x *GetWorkloadRulesByPolicyRequest) GetTeamId() string { +func (x *ListStorageRecommendationPoliciesRequest) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *GetWorkloadRulesByPolicyRequest) GetPolicyId() string { - if x != nil { - return x.PolicyId - } - return "" -} - -type GetWorkloadRulesByPolicyResponse struct { +type ListStorageRecommendationPoliciesResponse 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"` + Policies []*StorageRecommendationPolicy `protobuf:"bytes,1,rep,name=policies,proto3" json:"policies,omitempty"` } -func (x *GetWorkloadRulesByPolicyResponse) Reset() { - *x = GetWorkloadRulesByPolicyResponse{} +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 *GetWorkloadRulesByPolicyResponse) String() string { +func (x *ListStorageRecommendationPoliciesResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRulesByPolicyResponse) ProtoMessage() {} +func (*ListStorageRecommendationPoliciesResponse) ProtoMessage() {} -func (x *GetWorkloadRulesByPolicyResponse) 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 { @@ -26114,58 +29712,58 @@ func (x *GetWorkloadRulesByPolicyResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRulesByPolicyResponse.ProtoReflect.Descriptor instead. -func (*GetWorkloadRulesByPolicyResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{331} -} - -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 +// Deprecated: Use ListStorageRecommendationPoliciesResponse.ProtoReflect.Descriptor instead. +func (*ListStorageRecommendationPoliciesResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} } -func (x *GetWorkloadRulesByPolicyResponse) GetClusterNames() map[string]string { +func (x *ListStorageRecommendationPoliciesResponse) GetPolicies() []*StorageRecommendationPolicy { if x != nil { - return x.ClusterNames + return x.Policies } return nil } -type ListWorkloadRulesRequest 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"` - ClusterId *string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3,oneof" json:"cluster_id,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 *ListWorkloadRulesRequest) Reset() { - *x = ListWorkloadRulesRequest{} +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 *ListWorkloadRulesRequest) String() string { +func (x *UpdateStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRulesRequest) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *ListWorkloadRulesRequest) 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 { @@ -26176,52 +29774,148 @@ 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{332} +// Deprecated: Use UpdateStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{355} } -func (x *ListWorkloadRulesRequest) GetTeamId() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *ListWorkloadRulesRequest) GetClusterId() string { - if x != nil && x.ClusterId != nil { - return *x.ClusterId +func (x *UpdateStorageRecommendationPolicyRequest) GetTeamId() string { + if x != nil { + return x.TeamId } 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 *UpdateStorageRecommendationPolicyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" } -func (x *ListWorkloadRulesResponse) Reset() { - *x = ListWorkloadRulesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[333] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *UpdateStorageRecommendationPolicyRequest) GetDescription() string { + if x != nil { + return x.Description } + return "" } -func (x *ListWorkloadRulesResponse) String() string { +func (x *UpdateStorageRecommendationPolicyRequest) GetActionTriggers() []ActionTrigger { + if x != nil { + return x.ActionTriggers + } + return nil +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCronSchedule() string { + if x != nil && x.CronSchedule != nil { + return *x.CronSchedule + } + return "" +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetLookbackPeriodSeconds() int32 { + if x != nil && x.LookbackPeriodSeconds != nil { + return *x.LookbackPeriodSeconds + } + 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 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCriticalDaysToFull() int32 { + if x != nil && x.CriticalDaysToFull != nil { + return *x.CriticalDaysToFull + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetHeadroomDays() int32 { + if x != nil && x.HeadroomDays != nil { + return *x.HeadroomDays + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMinResizeIncrementGib() int32 { + if x != nil && x.MinResizeIncrementGib != nil { + return *x.MinResizeIncrementGib + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetMaxMonthlyCostUsd() float32 { + if x != nil && x.MaxMonthlyCostUsd != nil { + return *x.MaxMonthlyCostUsd + } + return 0 +} + +func (x *UpdateStorageRecommendationPolicyRequest) GetCooldownWindowSeconds() int32 { + if x != nil && x.CooldownWindowSeconds != nil { + return *x.CooldownWindowSeconds + } + return 0 +} + +type UpdateStorageRecommendationPolicyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Policy *StorageRecommendationPolicy `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"` +} + +func (x *UpdateStorageRecommendationPolicyResponse) Reset() { + *x = UpdateStorageRecommendationPolicyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[356] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListWorkloadRulesResponse) ProtoMessage() {} +func (*UpdateStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *ListWorkloadRulesResponse) 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 { @@ -26232,58 +29926,44 @@ func (x *ListWorkloadRulesResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListWorkloadRulesResponse.ProtoReflect.Descriptor instead. -func (*ListWorkloadRulesResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{333} -} - -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 +// Deprecated: Use UpdateStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*UpdateStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{356} } -func (x *ListWorkloadRulesResponse) GetPolicyNames() map[string]string { +func (x *UpdateStorageRecommendationPolicyResponse) GetPolicy() *StorageRecommendationPolicy { if x != nil { - return x.PolicyNames + return x.Policy } return nil } -type GetWorkloadRuleByIDRequest 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"` - RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,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"` } -func (x *GetWorkloadRuleByIDRequest) Reset() { - *x = GetWorkloadRuleByIDRequest{} +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 *GetWorkloadRuleByIDRequest) String() string { +func (x *DeleteStorageRecommendationPolicyRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByIDRequest) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyRequest) ProtoMessage() {} -func (x *GetWorkloadRuleByIDRequest) 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 { @@ -26294,52 +29974,50 @@ func (x *GetWorkloadRuleByIDRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWorkloadRuleByIDRequest.ProtoReflect.Descriptor instead. -func (*GetWorkloadRuleByIDRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{334} +// Deprecated: Use DeleteStorageRecommendationPolicyRequest.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{357} } -func (x *GetWorkloadRuleByIDRequest) GetTeamId() string { +func (x *DeleteStorageRecommendationPolicyRequest) GetPolicyId() string { if x != nil { - return x.TeamId + return x.PolicyId } return "" } -func (x *GetWorkloadRuleByIDRequest) GetRuleId() string { +func (x *DeleteStorageRecommendationPolicyRequest) GetTeamId() string { if x != nil { - return x.RuleId + return x.TeamId } return "" } -type GetWorkloadRuleByIDResponse struct { +type DeleteStorageRecommendationPolicyResponse 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) + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` } -func (x *GetWorkloadRuleByIDResponse) Reset() { - *x = GetWorkloadRuleByIDResponse{} +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 *GetWorkloadRuleByIDResponse) String() string { +func (x *DeleteStorageRecommendationPolicyResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByIDResponse) ProtoMessage() {} +func (*DeleteStorageRecommendationPolicyResponse) ProtoMessage() {} -func (x *GetWorkloadRuleByIDResponse) 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 { @@ -26350,62 +30028,55 @@ 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{335} -} - -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 "" +// Deprecated: Use DeleteStorageRecommendationPolicyResponse.ProtoReflect.Descriptor instead. +func (*DeleteStorageRecommendationPolicyResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{358} } -func (x *GetWorkloadRuleByIDResponse) GetPolicyName() string { +func (x *DeleteStorageRecommendationPolicyResponse) GetSuccess() bool { if x != nil { - return x.PolicyName + return x.Success } - return "" + return false } -// GetWorkloadRuleByWorkloadRequest looks up a single rule by workload coordinates. -type GetWorkloadRuleByWorkloadRequest struct { +// 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"` - 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"` + 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 *GetWorkloadRuleByWorkloadRequest) Reset() { - *x = GetWorkloadRuleByWorkloadRequest{} +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 *GetWorkloadRuleByWorkloadRequest) String() string { +func (x *StoragePolicyTarget) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadRequest) ProtoMessage() {} +func (*StoragePolicyTarget) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadRequest) 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 { @@ -26416,77 +30087,120 @@ 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{336} +// Deprecated: Use StoragePolicyTarget.ProtoReflect.Descriptor instead. +func (*StoragePolicyTarget) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{359} } -func (x *GetWorkloadRuleByWorkloadRequest) GetTeamId() string { +func (x *StoragePolicyTarget) GetTargetId() string { if x != nil { - return x.TeamId + return x.TargetId } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetClusterId() string { +func (x *StoragePolicyTarget) GetName() string { if x != nil { - return x.ClusterId + return x.Name } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetNamespace() string { +func (x *StoragePolicyTarget) GetDescription() string { if x != nil { - return x.Namespace + return x.Description } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetKind() string { +func (x *StoragePolicyTarget) GetTeamId() string { if x != nil { - return x.Kind + return x.TeamId } return "" } -func (x *GetWorkloadRuleByWorkloadRequest) GetWorkloadName() string { +func (x *StoragePolicyTarget) GetClusterIds() []string { if x != nil { - return x.WorkloadName + return x.ClusterIds + } + return nil +} + +func (x *StoragePolicyTarget) GetPolicyId() string { + if x != nil { + return x.PolicyId } 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 { +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 { 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 + 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 *GetWorkloadRuleByWorkloadResponse) Reset() { - *x = GetWorkloadRuleByWorkloadResponse{} +func (x *CreateStoragePolicyTargetRequest) Reset() { + *x = CreateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[337] + mi := &file_api_v1_recommendation_proto_msgTypes[360] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadRuleByWorkloadResponse) String() string { +func (x *CreateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadRuleByWorkloadResponse) ProtoMessage() {} +func (*CreateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *GetWorkloadRuleByWorkloadResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[337] +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 { @@ -26497,68 +30211,92 @@ 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{337} +// Deprecated: Use CreateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{360} } -func (x *GetWorkloadRuleByWorkloadResponse) GetRule() *WorkloadRule { +func (x *CreateStoragePolicyTargetRequest) GetName() string { if x != nil { - return x.Rule + return x.Name } - return nil + return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetClusterName() string { +func (x *CreateStoragePolicyTargetRequest) GetDescription() string { if x != nil { - return x.ClusterName + return x.Description } return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetPolicyName() string { +func (x *CreateStoragePolicyTargetRequest) GetTeamId() string { if x != nil { - return x.PolicyName + return x.TeamId } return "" } -func (x *GetWorkloadRuleByWorkloadResponse) GetFound() bool { +func (x *CreateStoragePolicyTargetRequest) GetClusterIds() []string { if x != nil { - return x.Found + return x.ClusterIds + } + return nil +} + +func (x *CreateStoragePolicyTargetRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +func (x *CreateStoragePolicyTargetRequest) GetEnabled() bool { + if x != nil { + return x.Enabled } 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 { +func (x *CreateStoragePolicyTargetRequest) GetNamespaceSelector() *LabelSelector { + if x != nil { + return x.NamespaceSelector + } + return nil +} + +func (x *CreateStoragePolicyTargetRequest) GetStorageClasses() []string { + if x != nil { + return x.StorageClasses + } + return nil +} + +type CreateStoragePolicyTargetResponse 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 *CreateStoragePolicyTargetResponse) Reset() { + *x = CreateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[338] + mi := &file_api_v1_recommendation_proto_msgTypes[361] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleRequest) String() string { +func (x *CreateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleRequest) ProtoMessage() {} +func (*CreateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[338] +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 { @@ -26569,50 +30307,44 @@ 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{338} -} - -func (x *GetWorkloadByWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use CreateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*CreateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{361} } -func (x *GetWorkloadByWorkloadRuleRequest) GetRuleId() string { +func (x *CreateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.RuleId + return x.Target } - return "" + return nil } -type GetWorkloadByWorkloadRuleResponse struct { +type ListStoragePolicyTargetsRequest 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 + 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 *GetWorkloadByWorkloadRuleResponse) Reset() { - *x = GetWorkloadByWorkloadRuleResponse{} +func (x *ListStoragePolicyTargetsRequest) Reset() { + *x = ListStoragePolicyTargetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[339] + mi := &file_api_v1_recommendation_proto_msgTypes[362] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadByWorkloadRuleResponse) String() string { +func (x *ListStoragePolicyTargetsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadByWorkloadRuleResponse) ProtoMessage() {} +func (*ListStoragePolicyTargetsRequest) ProtoMessage() {} -func (x *GetWorkloadByWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[339] +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 { @@ -26623,44 +30355,50 @@ 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{339} +// Deprecated: Use ListStoragePolicyTargetsRequest.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{362} } -func (x *GetWorkloadByWorkloadRuleResponse) GetWorkloadUid() string { +func (x *ListStoragePolicyTargetsRequest) GetTeamId() string { if x != nil { - return x.WorkloadUid + return x.TeamId } return "" } -type DeleteWorkloadRuleRequest struct { +func (x *ListStoragePolicyTargetsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId + } + return "" +} + +type ListStoragePolicyTargetsResponse 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"` + Targets []*StoragePolicyTarget `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty"` } -func (x *DeleteWorkloadRuleRequest) Reset() { - *x = DeleteWorkloadRuleRequest{} +func (x *ListStoragePolicyTargetsResponse) Reset() { + *x = ListStoragePolicyTargetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[340] + mi := &file_api_v1_recommendation_proto_msgTypes[363] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleRequest) String() string { +func (x *ListStoragePolicyTargetsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleRequest) ProtoMessage() {} +func (*ListStoragePolicyTargetsResponse) ProtoMessage() {} -func (x *DeleteWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[340] +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 { @@ -26671,48 +30409,43 @@ 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{340} -} - -func (x *DeleteWorkloadRuleRequest) GetTeamId() string { - if x != nil { - return x.TeamId - } - return "" +// Deprecated: Use ListStoragePolicyTargetsResponse.ProtoReflect.Descriptor instead. +func (*ListStoragePolicyTargetsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{363} } -func (x *DeleteWorkloadRuleRequest) GetRuleId() string { +func (x *ListStoragePolicyTargetsResponse) GetTargets() []*StoragePolicyTarget { if x != nil { - return x.RuleId + return x.Targets } - return "" + return nil } -type DeleteWorkloadRuleResponse struct { +type UpdateStoragePolicyTargetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *DeleteWorkloadRuleResponse) Reset() { - *x = DeleteWorkloadRuleResponse{} +func (x *UpdateStoragePolicyTargetRequest) Reset() { + *x = UpdateStoragePolicyTargetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[341] + mi := &file_api_v1_recommendation_proto_msgTypes[364] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteWorkloadRuleResponse) String() string { +func (x *UpdateStoragePolicyTargetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteWorkloadRuleResponse) ProtoMessage() {} +func (*UpdateStoragePolicyTargetRequest) ProtoMessage() {} -func (x *DeleteWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[341] +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 { @@ -26723,55 +30456,43 @@ 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{341} +// Deprecated: Use UpdateStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{364} } -// 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 *UpdateStoragePolicyTargetRequest) GetTarget() *StoragePolicyTarget { + if x != nil { + return x.Target + } + return nil +} + +type UpdateStoragePolicyTargetResponse 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"` + Target *StoragePolicyTarget `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"` } -func (x *ManualRuleFields) Reset() { - *x = ManualRuleFields{} +func (x *UpdateStoragePolicyTargetResponse) Reset() { + *x = UpdateStoragePolicyTargetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[342] + mi := &file_api_v1_recommendation_proto_msgTypes[365] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ManualRuleFields) String() string { +func (x *UpdateStoragePolicyTargetResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ManualRuleFields) ProtoMessage() {} +func (*UpdateStoragePolicyTargetResponse) ProtoMessage() {} -func (x *ManualRuleFields) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[342] +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 { @@ -26782,153 +30503,174 @@ 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{342} +// Deprecated: Use UpdateStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*UpdateStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{365} } -func (x *ManualRuleFields) GetCpuRule() *ResourceRuleConfig { +func (x *UpdateStoragePolicyTargetResponse) GetTarget() *StoragePolicyTarget { if x != nil { - return x.CpuRule + return x.Target } return nil } -func (x *ManualRuleFields) GetMemoryRule() *ResourceRuleConfig { - if x != nil { - return x.MemoryRule - } - return nil -} +type DeleteStoragePolicyTargetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *ManualRuleFields) GetGpuRule() *ResourceRuleConfig { - if x != nil { - return x.GpuRule - } - return nil + 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 *ManualRuleFields) GetHpaRule() *HPARuleConfig { - if x != nil { - return x.HpaRule +func (x *DeleteStoragePolicyTargetRequest) Reset() { + *x = DeleteStoragePolicyTargetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[366] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ManualRuleFields) GetEmergencyResponse() *EmergencyResponseConfig { - if x != nil { - return x.EmergencyResponse - } - return nil +func (x *DeleteStoragePolicyTargetRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ManualRuleFields) GetActionTriggers() []ActionTrigger { - if x != nil { - return x.ActionTriggers +func (*DeleteStoragePolicyTargetRequest) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *ManualRuleFields) GetStartupPeriodSeconds() int64 { - if x != nil && x.StartupPeriodSeconds != nil { - return *x.StartupPeriodSeconds - } - return 0 +// Deprecated: Use DeleteStoragePolicyTargetRequest.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{366} } -func (x *ManualRuleFields) GetCronSchedule() string { - if x != nil && x.CronSchedule != nil { - return *x.CronSchedule +func (x *DeleteStoragePolicyTargetRequest) GetTargetId() string { + if x != nil { + return x.TargetId } return "" } -func (x *ManualRuleFields) GetCooldownMinutes() int32 { - if x != nil && x.CooldownMinutes != nil { - return *x.CooldownMinutes +func (x *DeleteStoragePolicyTargetRequest) GetTeamId() string { + if x != nil { + return x.TeamId } - return 0 + return "" } -func (x *ManualRuleFields) GetDetectionTriggers() []WorkloadDetectionTrigger { - if x != nil { - return x.DetectionTriggers - } - return nil +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 *ManualRuleFields) GetSchedulerPlugins() []string { - if x != nil { - return x.SchedulerPlugins +func (x *DeleteStoragePolicyTargetResponse) Reset() { + *x = DeleteStoragePolicyTargetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[367] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *ManualRuleFields) GetDefragmentationSchedule() string { - if x != nil && x.DefragmentationSchedule != nil { - return *x.DefragmentationSchedule - } - return "" +func (x *DeleteStoragePolicyTargetResponse) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ManualRuleFields) GetLiveMigrationEnabled() bool { - if x != nil { - return x.LiveMigrationEnabled +func (*DeleteStoragePolicyTargetResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *ManualRuleFields) GetUseInPlaceVerticalScaling() bool { - if x != nil { - return x.UseInPlaceVerticalScaling - } - return false +// Deprecated: Use DeleteStoragePolicyTargetResponse.ProtoReflect.Descriptor instead. +func (*DeleteStoragePolicyTargetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{367} } -func (x *ManualRuleFields) GetContainers() []*ContainerResourceRuleConfig { +func (x *DeleteStoragePolicyTargetResponse) GetSuccess() bool { if x != nil { - return x.Containers + return x.Success } - return nil + return false } -type UpsertManualWorkloadRuleRequest struct { +// PvcStorageRecommendation represents a specific recommendation for a PVC +type PvcStorageRecommendation 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"` + 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 *UpsertManualWorkloadRuleRequest) Reset() { - *x = UpsertManualWorkloadRuleRequest{} +func (x *PvcStorageRecommendation) Reset() { + *x = PvcStorageRecommendation{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[343] + mi := &file_api_v1_recommendation_proto_msgTypes[368] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UpsertManualWorkloadRuleRequest) String() string { +func (x *PvcStorageRecommendation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertManualWorkloadRuleRequest) ProtoMessage() {} +func (*PvcStorageRecommendation) ProtoMessage() {} -func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[343] +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 { @@ -26939,254 +30681,239 @@ func (x *UpsertManualWorkloadRuleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertManualWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{343} +// Deprecated: Use PvcStorageRecommendation.ProtoReflect.Descriptor instead. +func (*PvcStorageRecommendation) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{368} } -func (x *UpsertManualWorkloadRuleRequest) GetTeamId() string { +func (x *PvcStorageRecommendation) GetRecommendationId() string { if x != nil { - return x.TeamId + return x.RecommendationId } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetClusterId() string { +func (x *PvcStorageRecommendation) GetPvcUid() string { if x != nil { - return x.ClusterId + return x.PvcUid } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetNamespace() string { +func (x *PvcStorageRecommendation) GetPvcName() string { if x != nil { - return x.Namespace + return x.PvcName } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetKind() string { +func (x *PvcStorageRecommendation) GetNamespace() string { if x != nil { - return x.Kind + return x.Namespace } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetName() string { +func (x *PvcStorageRecommendation) GetClusterId() string { if x != nil { - return x.Name + return x.ClusterId } return "" } -func (x *UpsertManualWorkloadRuleRequest) GetAutoGenerate() bool { +func (x *PvcStorageRecommendation) GetTeamId() string { if x != nil { - return x.AutoGenerate + return x.TeamId } - return false + return "" } -func (x *UpsertManualWorkloadRuleRequest) GetFields() *ManualRuleFields { +func (x *PvcStorageRecommendation) GetCurrentCapacityBytes() int64 { if x != nil { - return x.Fields + return x.CurrentCapacityBytes } - return nil + return 0 } -func (x *UpsertManualWorkloadRuleRequest) GetSource() WorkloadRuleSource { +func (x *PvcStorageRecommendation) GetRecommendedCapacityBytes() int64 { if x != nil { - return x.Source + return x.RecommendedCapacityBytes } - return WorkloadRuleSource_WORKLOAD_RULE_SOURCE_UNSPECIFIED + return 0 } -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 *PvcStorageRecommendation) GetUsedBytesAtTime() int64 { + if x != nil { + return x.UsedBytesAtTime + } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) Reset() { - *x = UpsertManualWorkloadRuleResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[344] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *PvcStorageRecommendation) GetUtilizationPct() float64 { + if x != nil { + return x.UtilizationPct } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *PvcStorageRecommendation) GetGrowthRateBytesPerDay() float64 { + if x != nil { + return x.GrowthRateBytesPerDay + } + return 0 } -func (*UpsertManualWorkloadRuleResponse) ProtoMessage() {} - -func (x *UpsertManualWorkloadRuleResponse) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *PvcStorageRecommendation) GetDaysToFull() float64 { + if x != nil { + return x.DaysToFull } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use UpsertManualWorkloadRuleResponse.ProtoReflect.Descriptor instead. -func (*UpsertManualWorkloadRuleResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{344} +func (x *PvcStorageRecommendation) GetConfidenceScore() float64 { + if x != nil { + return x.ConfidenceScore + } + return 0 } -func (x *UpsertManualWorkloadRuleResponse) GetRule() *WorkloadRule { +func (x *PvcStorageRecommendation) GetPolicyId() string { if x != nil { - return x.Rule + return x.PolicyId } - return nil + return "" } -// 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 +func (x *PvcStorageRecommendation) GetPolicyTargetId() string { + if x != nil && x.PolicyTargetId != nil { + return *x.PolicyTargetId + } + return "" +} - 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"` +func (x *PvcStorageRecommendation) GetCostCurrentMonthlyUsd() float64 { + if x != nil { + return x.CostCurrentMonthlyUsd + } + return 0 } -func (x *PreviewWorkloadRuleRequest) Reset() { - *x = PreviewWorkloadRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[345] - 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 *PreviewWorkloadRuleRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *PvcStorageRecommendation) GetCostDeltaMonthlyUsd() float64 { + if x != nil { + return x.CostDeltaMonthlyUsd + } + return 0 } -func (*PreviewWorkloadRuleRequest) ProtoMessage() {} +func (x *PvcStorageRecommendation) GetStatus() RecommendationStatus { + if x != nil { + return x.Status + } + return RecommendationStatus_RECOMMENDATION_STATUS_UNSPECIFIED +} -func (x *PreviewWorkloadRuleRequest) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *PvcStorageRecommendation) GetReasoning() string { + if x != nil && x.Reasoning != nil { + return *x.Reasoning } - return mi.MessageOf(x) + return "" } -// Deprecated: Use PreviewWorkloadRuleRequest.ProtoReflect.Descriptor instead. -func (*PreviewWorkloadRuleRequest) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{345} +func (x *PvcStorageRecommendation) GetError() string { + if x != nil && x.Error != nil { + return *x.Error + } + return "" } -func (x *PreviewWorkloadRuleRequest) GetTeamId() string { +func (x *PvcStorageRecommendation) GetTimestamp() *timestamppb.Timestamp { if x != nil { - return x.TeamId + return x.Timestamp } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetClusterId() string { +func (x *PvcStorageRecommendation) GetAppliedAt() *timestamppb.Timestamp { if x != nil { - return x.ClusterId + return x.AppliedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetNamespace() string { +func (x *PvcStorageRecommendation) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.Namespace + return x.CreatedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetKind() string { +func (x *PvcStorageRecommendation) GetUpdatedAt() *timestamppb.Timestamp { if x != nil { - return x.Kind + return x.UpdatedAt } - return "" + return nil } -func (x *PreviewWorkloadRuleRequest) GetName() string { +func (x *PvcStorageRecommendation) GetOperationType() PvcOperationType { if x != nil { - return x.Name + return x.OperationType + } + return PvcOperationType_PVC_OPERATION_TYPE_UNSPECIFIED +} + +func (x *PvcStorageRecommendation) GetWorkloadKind() string { + if x != nil && x.WorkloadKind != nil { + return *x.WorkloadKind } return "" } -func (x *PreviewWorkloadRuleRequest) GetWorkloadUid() string { - if x != nil { - return x.WorkloadUid +func (x *PvcStorageRecommendation) GetWorkloadName() string { + if x != nil && x.WorkloadName != nil { + return *x.WorkloadName } return "" } -func (x *PreviewWorkloadRuleRequest) GetFields() *ManualRuleFields { - if x != nil { - return x.Fields +func (x *PvcStorageRecommendation) GetWorkloadUid() string { + if x != nil && x.WorkloadUid != nil { + return *x.WorkloadUid } - return nil + return "" } -type PreviewWorkloadRuleResponse struct { +type GetPvcStorageRecommendationRequest 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"` + RecommendationId string `protobuf:"bytes,1,opt,name=recommendation_id,json=recommendationId,proto3" json:"recommendation_id,omitempty"` } -func (x *PreviewWorkloadRuleResponse) Reset() { - *x = PreviewWorkloadRuleResponse{} +func (x *GetPvcStorageRecommendationRequest) Reset() { + *x = GetPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[346] + mi := &file_api_v1_recommendation_proto_msgTypes[369] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PreviewWorkloadRuleResponse) String() string { +func (x *GetPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PreviewWorkloadRuleResponse) ProtoMessage() {} +func (*GetPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *PreviewWorkloadRuleResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[346] +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 { @@ -27197,68 +30924,92 @@ 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{346} +// Deprecated: Use GetPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{369} } -func (x *PreviewWorkloadRuleResponse) GetMaterializedRule() *WorkloadRule { +func (x *GetPvcStorageRecommendationRequest) GetRecommendationId() string { if x != nil { - return x.MaterializedRule + return x.RecommendationId } - return nil + return "" } -func (x *PreviewWorkloadRuleResponse) GetEngineProjection() *WorkloadRule { - if x != nil { - return x.EngineProjection - } - return nil +type GetPvcStorageRecommendationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Recommendation *PvcStorageRecommendation `protobuf:"bytes,1,opt,name=recommendation,proto3" json:"recommendation,omitempty"` } -func (x *PreviewWorkloadRuleResponse) GetProfile() *WorkloadProfileResult { - if x != nil { - return x.Profile - } - return nil +func (x *GetPvcStorageRecommendationResponse) Reset() { + *x = GetPvcStorageRecommendationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[370] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (x *PreviewWorkloadRuleResponse) GetEngineProjectionUnavailableReason() string { +func (x *GetPvcStorageRecommendationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetPvcStorageRecommendationResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GetPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{370} +} + +func (x *GetPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.EngineProjectionUnavailableReason + return x.Recommendation } - return "" + return nil } -type GetWorkloadContainerNamesRequest struct { +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" 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"` + 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 *GetWorkloadContainerNamesRequest) Reset() { - *x = GetWorkloadContainerNamesRequest{} +func (x *ListPvcStorageRecommendationsRequest) Reset() { + *x = ListPvcStorageRecommendationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[347] + mi := &file_api_v1_recommendation_proto_msgTypes[371] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesRequest) String() string { +func (x *ListPvcStorageRecommendationsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesRequest) ProtoMessage() {} +func (*ListPvcStorageRecommendationsRequest) ProtoMessage() {} -func (x *GetWorkloadContainerNamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[347] +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 { @@ -27269,71 +31020,58 @@ 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{347} +// Deprecated: Use ListPvcStorageRecommendationsRequest.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{371} } -func (x *GetWorkloadContainerNamesRequest) GetTeamId() string { +func (x *ListPvcStorageRecommendationsRequest) 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 +func (x *ListPvcStorageRecommendationsRequest) GetClusterId() string { + if x != nil && x.ClusterId != nil { + return *x.ClusterId } return "" } -func (x *GetWorkloadContainerNamesRequest) GetName() string { +func (x *ListPvcStorageRecommendationsRequest) GetPagination() *Pagination { if x != nil { - return x.Name + return x.Pagination } - return "" + return nil } -type GetWorkloadContainerNamesResponse struct { +type ListPvcStorageRecommendationsResponse 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"` + 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 *GetWorkloadContainerNamesResponse) Reset() { - *x = GetWorkloadContainerNamesResponse{} +func (x *ListPvcStorageRecommendationsResponse) Reset() { + *x = ListPvcStorageRecommendationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[348] + mi := &file_api_v1_recommendation_proto_msgTypes[372] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetWorkloadContainerNamesResponse) String() string { +func (x *ListPvcStorageRecommendationsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWorkloadContainerNamesResponse) ProtoMessage() {} +func (*ListPvcStorageRecommendationsResponse) ProtoMessage() {} -func (x *GetWorkloadContainerNamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[348] +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 { @@ -27344,45 +31082,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{348} +// Deprecated: Use ListPvcStorageRecommendationsResponse.ProtoReflect.Descriptor instead. +func (*ListPvcStorageRecommendationsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{372} } -func (x *GetWorkloadContainerNamesResponse) GetContainerNames() []string { +func (x *ListPvcStorageRecommendationsResponse) GetRecommendations() []*PvcStorageRecommendation { if x != nil { - return x.ContainerNames + return x.Recommendations } return nil } -type BatchAutoOptimizeWorkload struct { +func (x *ListPvcStorageRecommendationsResponse) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +type GeneratePvcStorageRecommendationRequest 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 *GeneratePvcStorageRecommendationRequest) Reset() { + *x = GeneratePvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[349] + mi := &file_api_v1_recommendation_proto_msgTypes[373] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkload) String() string { +func (x *GeneratePvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkload) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationRequest) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkload) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[349] +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 { @@ -27393,59 +31139,67 @@ 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{349} +// Deprecated: Use GeneratePvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{373} } -func (x *BatchAutoOptimizeWorkload) GetNamespace() string { +func (x *GeneratePvcStorageRecommendationRequest) GetTeamId() string { if x != nil { - return x.Namespace + return x.TeamId } return "" } -func (x *BatchAutoOptimizeWorkload) GetKind() string { +func (x *GeneratePvcStorageRecommendationRequest) GetClusterId() string { if x != nil { - return x.Kind + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkload) GetName() string { +func (x *GeneratePvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Name + return x.PvcUid } return "" } -type BatchAutoOptimizeWorkloadsRequest struct { +func (x *GeneratePvcStorageRecommendationRequest) GetPolicyId() string { + if x != nil { + return x.PolicyId + } + return "" +} + +type GeneratePvcStorageRecommendationResponse 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"` + // 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 *BatchAutoOptimizeWorkloadsRequest) Reset() { - *x = BatchAutoOptimizeWorkloadsRequest{} +func (x *GeneratePvcStorageRecommendationResponse) Reset() { + *x = GeneratePvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[350] + mi := &file_api_v1_recommendation_proto_msgTypes[374] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadsRequest) String() string { +func (x *GeneratePvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadsRequest) ProtoMessage() {} +func (*GeneratePvcStorageRecommendationResponse) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[350] +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 { @@ -27456,62 +31210,53 @@ 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{350} +// Deprecated: Use GeneratePvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*GeneratePvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{374} } -func (x *BatchAutoOptimizeWorkloadsRequest) GetTeamId() string { +func (x *GeneratePvcStorageRecommendationResponse) 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 *GeneratePvcStorageRecommendationResponse) 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 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"` - 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"` + 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 *BatchAutoOptimizeWorkloadResult) Reset() { - *x = BatchAutoOptimizeWorkloadResult{} +func (x *PreviewPvcStorageRecommendationRequest) Reset() { + *x = PreviewPvcStorageRecommendationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[351] + mi := &file_api_v1_recommendation_proto_msgTypes[375] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadResult) String() string { +func (x *PreviewPvcStorageRecommendationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadResult) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationRequest) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadResult) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[351] +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 { @@ -27522,78 +31267,65 @@ 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{351} +// Deprecated: Use PreviewPvcStorageRecommendationRequest.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{375} } -func (x *BatchAutoOptimizeWorkloadResult) GetNamespace() string { +func (x *PreviewPvcStorageRecommendationRequest) GetTeamId() string { if x != nil { - return x.Namespace + return x.TeamId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetKind() string { +func (x *PreviewPvcStorageRecommendationRequest) GetClusterId() string { if x != nil { - return x.Kind + return x.ClusterId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetName() string { +func (x *PreviewPvcStorageRecommendationRequest) GetPvcUid() string { if x != nil { - return x.Name + return x.PvcUid } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetSuccess() bool { - if x != nil { - return x.Success - } - return false -} - -func (x *BatchAutoOptimizeWorkloadResult) GetError() string { +func (x *PreviewPvcStorageRecommendationRequest) GetPolicyId() string { if x != nil { - return x.Error + return x.PolicyId } return "" } -func (x *BatchAutoOptimizeWorkloadResult) GetRule() *WorkloadRule { - if x != nil { - return x.Rule - } - return nil -} - -type BatchAutoOptimizeWorkloadsResponse struct { +type PreviewPvcStorageRecommendationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Results []*BatchAutoOptimizeWorkloadResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,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 *BatchAutoOptimizeWorkloadsResponse) Reset() { - *x = BatchAutoOptimizeWorkloadsResponse{} +func (x *PreviewPvcStorageRecommendationResponse) Reset() { + *x = PreviewPvcStorageRecommendationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[352] + mi := &file_api_v1_recommendation_proto_msgTypes[376] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *BatchAutoOptimizeWorkloadsResponse) String() string { +func (x *PreviewPvcStorageRecommendationResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*BatchAutoOptimizeWorkloadsResponse) ProtoMessage() {} +func (*PreviewPvcStorageRecommendationResponse) ProtoMessage() {} -func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[352] +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 { @@ -27604,55 +31336,64 @@ func (x *BatchAutoOptimizeWorkloadsResponse) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use BatchAutoOptimizeWorkloadsResponse.ProtoReflect.Descriptor instead. -func (*BatchAutoOptimizeWorkloadsResponse) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{352} +// Deprecated: Use PreviewPvcStorageRecommendationResponse.ProtoReflect.Descriptor instead. +func (*PreviewPvcStorageRecommendationResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{376} } -func (x *BatchAutoOptimizeWorkloadsResponse) GetResults() []*BatchAutoOptimizeWorkloadResult { +func (x *PreviewPvcStorageRecommendationResponse) GetRecommendation() *PvcStorageRecommendation { if x != nil { - return x.Results + return x.Recommendation } 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 { +func (x *PreviewPvcStorageRecommendationResponse) GetSkipReason() string { + if x != nil && x.SkipReason != nil { + return *x.SkipReason + } + return "" +} + +type WorkloadRuleOOMEvent 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"` + 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 *WorkloadProfileManifest) Reset() { - *x = WorkloadProfileManifest{} +func (x *WorkloadRuleOOMEvent) Reset() { + *x = WorkloadRuleOOMEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[353] + mi := &file_api_v1_recommendation_proto_msgTypes[377] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *WorkloadProfileManifest) String() string { +func (x *WorkloadRuleOOMEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*WorkloadProfileManifest) ProtoMessage() {} +func (*WorkloadRuleOOMEvent) ProtoMessage() {} -func (x *WorkloadProfileManifest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[353] +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 { @@ -27663,136 +31404,144 @@ 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{353} +// Deprecated: Use WorkloadRuleOOMEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleOOMEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{377} } -func (x *WorkloadProfileManifest) GetWindow() ProfileWindow { +func (x *WorkloadRuleOOMEvent) GetId() string { if x != nil { - return x.Window + return x.Id } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED + return "" } -func (x *WorkloadProfileManifest) GetKeys() []*ProfileKey { +func (x *WorkloadRuleOOMEvent) GetRuleId() string { if x != nil { - return x.Keys + return x.RuleId } - return nil + return "" } -func (x *WorkloadProfileManifest) GetIssuedAt() *timestamppb.Timestamp { +func (x *WorkloadRuleOOMEvent) GetClusterId() string { if x != nil { - return x.IssuedAt + return x.ClusterId } - return nil + return "" } -func (x *WorkloadProfileManifest) GetEmitId() string { +func (x *WorkloadRuleOOMEvent) GetNamespace() string { if x != nil { - return x.EmitId + return x.Namespace } 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 *WorkloadRuleOOMEvent) GetWorkloadName() string { + if x != nil { + return x.WorkloadName + } + return "" } -func (x *BatchWorkloadProfiles) Reset() { - *x = BatchWorkloadProfiles{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[354] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *WorkloadRuleOOMEvent) GetContainerName() string { + if x != nil { + return x.ContainerName } + return "" } -func (x *BatchWorkloadProfiles) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *WorkloadRuleOOMEvent) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil } -func (*BatchWorkloadProfiles) ProtoMessage() {} +func (x *WorkloadRuleOOMEvent) GetRuleGeneration() int64 { + if x != nil { + return x.RuleGeneration + } + return 0 +} -func (x *BatchWorkloadProfiles) 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 { - ms.StoreMessageInfo(mi) - } - return ms +func (x *WorkloadRuleOOMEvent) GetMemoryRequestAt() int64 { + if x != nil { + return x.MemoryRequestAt } - return mi.MessageOf(x) + return 0 } -// Deprecated: Use BatchWorkloadProfiles.ProtoReflect.Descriptor instead. -func (*BatchWorkloadProfiles) Descriptor() ([]byte, []int) { - return file_api_v1_recommendation_proto_rawDescGZIP(), []int{354} +func (x *WorkloadRuleOOMEvent) GetMemoryLimitAt() int64 { + if x != nil { + return x.MemoryLimitAt + } + return 0 } -func (x *BatchWorkloadProfiles) GetWindow() ProfileWindow { +func (x *WorkloadRuleOOMEvent) GetMemoryUsageAt() int64 { if x != nil { - return x.Window + return x.MemoryUsageAt } - return ProfileWindow_PROFILE_WINDOW_UNSPECIFIED + return 0 } -func (x *BatchWorkloadProfiles) GetProfiles() []*WorkloadProfileSnapshot { +func (x *WorkloadRuleOOMEvent) GetEmergencyReaction() bool { if x != nil { - return x.Profiles + return x.EmergencyReaction } - return nil + return false } -func (x *BatchWorkloadProfiles) GetEmitId() string { +func (x *WorkloadRuleOOMEvent) GetNewMemoryAfter() int64 { + if x != nil && x.NewMemoryAfter != nil { + return *x.NewMemoryAfter + } + return 0 +} + +func (x *WorkloadRuleOOMEvent) GetRestartCount() int32 { + if x != nil && x.RestartCount != nil { + return *x.RestartCount + } + return 0 +} + +func (x *WorkloadRuleOOMEvent) GetCreatedAt() *timestamppb.Timestamp { if x != nil { - return x.EmitId + return x.CreatedAt } - return "" + return nil } -type NodeConfigApplyEvent struct { +type ListWorkloadRuleOOMEventsRequest 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"` + 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 *NodeConfigApplyEvent) Reset() { - *x = NodeConfigApplyEvent{} +func (x *ListWorkloadRuleOOMEventsRequest) Reset() { + *x = ListWorkloadRuleOOMEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[355] + mi := &file_api_v1_recommendation_proto_msgTypes[378] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NodeConfigApplyEvent) String() string { +func (x *ListWorkloadRuleOOMEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NodeConfigApplyEvent) ProtoMessage() {} +func (*ListWorkloadRuleOOMEventsRequest) ProtoMessage() {} -func (x *NodeConfigApplyEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[355] +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 { @@ -27803,73 +31552,267 @@ 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{355} +// Deprecated: Use ListWorkloadRuleOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{378} } -func (x *NodeConfigApplyEvent) GetConfigId() string { +func (x *ListWorkloadRuleOOMEventsRequest) GetRuleId() string { if x != nil { - return x.ConfigId + return x.RuleId } return "" } -func (x *NodeConfigApplyEvent) GetClusterId() string { - if x != nil { - return x.ClusterId +func (x *ListWorkloadRuleOOMEventsRequest) GetGeneration() int64 { + if x != nil && x.Generation != nil { + return *x.Generation } - return "" + return 0 } -func (x *NodeConfigApplyEvent) GetStatus() string { - if x != nil { - return x.Status - } +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 0 +} + +type ListWorkloadRuleOOMEventsResponse 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"` +} + +func (x *ListWorkloadRuleOOMEventsResponse) Reset() { + *x = ListWorkloadRuleOOMEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[379] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadRuleOOMEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadRuleOOMEventsResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadRuleOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{379} +} + +func (x *ListWorkloadRuleOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { + if x != nil { + return x.Events + } + return nil +} + +func (x *ListWorkloadRuleOOMEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type ListWorkloadOOMEventsRequest 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"` +} + +func (x *ListWorkloadOOMEventsRequest) Reset() { + *x = ListWorkloadOOMEventsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[380] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOOMEventsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOOMEventsRequest) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadOOMEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{380} +} + +func (x *ListWorkloadOOMEventsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } return "" } -func (x *NodeConfigApplyEvent) GetError() string { +func (x *ListWorkloadOOMEventsRequest) GetNamespace() string { if x != nil { - return x.Error + return x.Namespace } return "" } -func (x *NodeConfigApplyEvent) GetAppliedAt() *timestamppb.Timestamp { +func (x *ListWorkloadOOMEventsRequest) GetWorkloadName() string { if x != nil { - return x.AppliedAt + return x.WorkloadName + } + return "" +} + +func (x *ListWorkloadOOMEventsRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ListWorkloadOOMEventsRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +type ListWorkloadOOMEventsResponse 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"` +} + +func (x *ListWorkloadOOMEventsResponse) Reset() { + *x = ListWorkloadOOMEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[381] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadOOMEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadOOMEventsResponse) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadOOMEventsResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadOOMEventsResponse) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{381} +} + +func (x *ListWorkloadOOMEventsResponse) GetEvents() []*WorkloadRuleOOMEvent { + if x != nil { + return x.Events } return nil } -type GetNodeRecommendationStatusRequest struct { +func (x *ListWorkloadOOMEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type WorkloadRuleCPUThrottleEvent 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"` + 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 *GetNodeRecommendationStatusRequest) Reset() { - *x = GetNodeRecommendationStatusRequest{} +func (x *WorkloadRuleCPUThrottleEvent) Reset() { + *x = WorkloadRuleCPUThrottleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[356] + mi := &file_api_v1_recommendation_proto_msgTypes[382] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusRequest) String() string { +func (x *WorkloadRuleCPUThrottleEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusRequest) ProtoMessage() {} +func (*WorkloadRuleCPUThrottleEvent) ProtoMessage() {} -func (x *GetNodeRecommendationStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[356] +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 { @@ -27880,58 +31823,144 @@ 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{356} +// Deprecated: Use WorkloadRuleCPUThrottleEvent.ProtoReflect.Descriptor instead. +func (*WorkloadRuleCPUThrottleEvent) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{382} } -func (x *GetNodeRecommendationStatusRequest) GetTeamId() string { +func (x *WorkloadRuleCPUThrottleEvent) GetId() string { if x != nil { - return x.TeamId + return x.Id } return "" } -func (x *GetNodeRecommendationStatusRequest) GetClusterId() string { +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 *GetNodeRecommendationStatusRequest) GetHistoryLimit() int32 { +func (x *WorkloadRuleCPUThrottleEvent) GetNamespace() string { if x != nil { - return x.HistoryLimit + 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 *WorkloadRuleCPUThrottleEvent) GetRuleGeneration() int64 { + if x != nil { + return x.RuleGeneration } return 0 } -type GetNodeRecommendationStatusResponse struct { +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 +} + +type ListWorkloadRuleCPUThrottleEventsRequest 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"` + 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 *GetNodeRecommendationStatusResponse) Reset() { - *x = GetNodeRecommendationStatusResponse{} +func (x *ListWorkloadRuleCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadRuleCPUThrottleEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_recommendation_proto_msgTypes[357] + mi := &file_api_v1_recommendation_proto_msgTypes[383] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetNodeRecommendationStatusResponse) String() string { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNodeRecommendationStatusResponse) ProtoMessage() {} +func (*ListWorkloadRuleCPUThrottleEventsRequest) ProtoMessage() {} -func (x *GetNodeRecommendationStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_recommendation_proto_msgTypes[357] +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 { @@ -27942,353 +31971,13378 @@ 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{357} +// Deprecated: Use ListWorkloadRuleCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadRuleCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{383} } -func (x *GetNodeRecommendationStatusResponse) GetCurrentConfig() *NodeRecommendationConfig { +func (x *ListWorkloadRuleCPUThrottleEventsRequest) GetRuleId() string { if x != nil { - return x.CurrentConfig + return x.RuleId } - return nil + return "" } -func (x *GetNodeRecommendationStatusResponse) GetHistory() []*NodeConfigApplyEvent { +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.History + return x.Events } return nil } -var File_api_v1_recommendation_proto protoreflect.FileDescriptor +func (x *ListWorkloadRuleCPUThrottleEventsResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} -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, - 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, 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, 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, - 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, 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, - 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, - 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, +type ListWorkloadCPUThrottleEventsRequest 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"` +} + +func (x *ListWorkloadCPUThrottleEventsRequest) Reset() { + *x = ListWorkloadCPUThrottleEventsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[385] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListWorkloadCPUThrottleEventsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadCPUThrottleEventsRequest) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadCPUThrottleEventsRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadCPUThrottleEventsRequest) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{385} +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *ListWorkloadCPUThrottleEventsRequest) GetNamespace() string { + if x != nil { + 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 *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.Events + } + return nil +} + +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 + + 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 *StringSetSelector) Reset() { + *x = StringSetSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[387] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringSetSelector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringSetSelector) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StringSetSelector.ProtoReflect.Descriptor instead. +func (*StringSetSelector) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{387} +} + +func (x *StringSetSelector) GetIn() []string { + if x != nil { + return x.In + } + return nil +} + +func (x *StringSetSelector) GetNotIn() []string { + if x != nil { + return x.NotIn + } + return nil +} + +type WorkloadOptimizationPolicyProto 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"` + 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 *WorkloadOptimizationPolicyProto) Reset() { + *x = WorkloadOptimizationPolicyProto{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[388] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkloadOptimizationPolicyProto) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadOptimizationPolicyProto) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkloadOptimizationPolicyProto.ProtoReflect.Descriptor instead. +func (*WorkloadOptimizationPolicyProto) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{388} +} + +func (x *WorkloadOptimizationPolicyProto) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *WorkloadOptimizationPolicyProto) GetName() string { + if x != nil { + 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 *WorkloadOptimizationPolicyProto) GetDetectionTriggers() []WorkloadDetectionTrigger { + if x != nil { + 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 *WorkloadOptimizationPolicyProto) GetCpuRule() *ResourceRuleConfig { + if x != nil { + 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 *WorkloadOptimizationPolicyProto) GetEmergencyResponse() *EmergencyResponseConfig { + if x != nil { + return x.EmergencyResponse + } + return nil +} + +// 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 + + 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 *GenericOptimizationSettings) Reset() { + *x = GenericOptimizationSettings{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_recommendation_proto_msgTypes[389] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericOptimizationSettings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericOptimizationSettings) ProtoMessage() {} + +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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericOptimizationSettings.ProtoReflect.Descriptor instead. +func (*GenericOptimizationSettings) Descriptor() ([]byte, []int) { + return file_api_v1_recommendation_proto_rawDescGZIP(), []int{389} +} + +func (x *GenericOptimizationSettings) GetCpuRule() *ResourceRuleConfig { + if x != nil { + return x.CpuRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetMemoryRule() *ResourceRuleConfig { + if x != nil { + return x.MemoryRule + } + return nil +} + +func (x *GenericOptimizationSettings) GetGpuRule() *ResourceRuleConfig { + if x != nil { + return x.GpuRule + } + return nil +} + +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, 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, 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, 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, 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, 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, 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, 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, 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, @@ -28297,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, @@ -28358,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, - 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, + 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, 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, + 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, 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, + 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, @@ -29050,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, @@ -29088,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, 0xe8, 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, @@ -29568,3555 +46726,4434 @@ 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, 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, - 0xc1, 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, + 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, 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, 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, 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, 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, + 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, 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, 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, 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, 0xa6, 0x04, 0x0a, - 0x1d, 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, 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, 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, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 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, + 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, 0xa6, 0x04, 0x0a, 0x1d, 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, 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, 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, + 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, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x49, 0x64, + 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x16, 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, 0x19, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 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, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 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, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x16, - 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, 0x19, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 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, 0x19, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 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, 0x08, 0x0a, 0x06, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x76, 0x0a, 0x23, 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, 0x12, 0x4f, 0x0a, 0x0f, - 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6c, 0x0a, - 0x1e, 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, 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, 0x22, 0x94, 0x01, 0x0a, 0x22, - 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, 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, 0x36, 0x0a, 0x08, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 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, 0x22, 0x74, 0x0a, 0x23, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x76, 0x0a, 0x23, 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, 0x12, 0x4f, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x2b, 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, 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, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 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, 0x22, 0x7d, 0x0a, 0x2c, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x20, 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, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 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, 0x6c, 0x0a, 0x1e, 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, 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, 0x22, 0x94, 0x01, 0x0a, 0x22, 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, 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, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x03, 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, 0x22, 0x74, + 0x0a, 0x23, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x21, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9d, 0x01, 0x0a, 0x2b, 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, 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, 0x36, 0x0a, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 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, 0x22, 0x7d, 0x0a, 0x2c, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x20, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x26, 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, 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, 0x36, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 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, 0x22, 0x90, 0x01, 0x0a, 0x27, 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, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 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, + 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x72, 0x0a, 0x21, 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, 0x4d, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 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, 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, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7f, 0x0a, 0x26, 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, 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, 0x36, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 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, 0x22, 0x90, 0x01, 0x0a, 0x27, 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, 0x52, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 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, + 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, 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, 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, + 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, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x15, 0x6c, 0x6f, + 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, 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, + 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, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, 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, 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, + 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, 0x67, 0x70, 0x75, 0x5f, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x08, + 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, 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, + 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, 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, 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, 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, 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, + 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, 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, + 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, 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, 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, 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, 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, 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, + 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, - 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, + 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, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, 0xd2, 0x01, 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, 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, 0x85, 0x02, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x4e, + 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, 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, 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, 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, 0x22, - 0x52, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 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, 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, 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, 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, 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, + 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, + 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, - 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, 0xd4, 0x01, 0x0a, 0x1f, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x6f, 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, 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, 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, + 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, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 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, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, - 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, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 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, + 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, 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, 0x73, 0x74, 0x12, 0x17, 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, + 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, 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, 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, + 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, 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, + 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, - 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, 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, + 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, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 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, 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, 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, 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, - 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, 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, + 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, - 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, + 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, 0x42, 0x26, 0x0a, 0x24, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 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, + 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, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 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, + 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, 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, 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, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, @@ -33128,1638 +51165,4331 @@ var file_api_v1_recommendation_proto_rawDesc = []byte{ 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, + 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, 0xcb, 0x08, 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, 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, - 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, + 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, 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, 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, + 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, 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, + 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, 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, 0x42, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 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, 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, 0xc4, - 0x07, 0x0a, 0x27, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 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, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 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, 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, 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, + 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, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 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, 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, + 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, + 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, 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, + 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, 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, 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, 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, - 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, - 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, 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, 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, + 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, 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, + 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, 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, + 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, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, + 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, + 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, - 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, + 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, 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, + 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, 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, + 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, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x29, 0x12, 0x21, 0x0a, + 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, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x2a, - 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, 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, 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, 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, + 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, 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, 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, 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, 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, - 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 0xaa, 0x69, 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, + 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, + 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, 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, 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, + 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, + 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, 0x55, 0x70, 0x64, 0x61, + 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, 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, 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, + 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, 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, + 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, 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, 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, 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, + 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, 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, - 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, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, + 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, + 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, - 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, + 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, 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, 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 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, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 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, 0x76, 0x0a, 0x1b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x57, 0x6f, 0x72, + 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, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x67, 0x67, + 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, + 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x72, 0x0a, 0x18, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, 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, 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, 0x12, 0x2c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, + 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, 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, + 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, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 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, - 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, 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, + 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, 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, + 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, 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, 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, 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, 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, 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, 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, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 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, 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, 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, + 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, + 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, 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, 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, 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, + 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 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, 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, + 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, 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, 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, + 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, - 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, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, + 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, 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, 0x12, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, + 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, 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, + 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, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 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, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, + 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, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 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, 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, + 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, 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, + 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, 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, - 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, + 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, 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, + 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, 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, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 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, 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, 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, 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, + 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, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 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, 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, 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, + 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, 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, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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 ( @@ -34774,1157 +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, 16) -var file_api_v1_recommendation_proto_msgTypes = make([]protoimpl.MessageInfo, 390) +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 - (TargetFilterType)(0), // 5: api.v1.TargetFilterType - (InstanceStorePolicy)(0), // 6: api.v1.InstanceStorePolicy - (ActionTrigger)(0), // 7: api.v1.ActionTrigger - (WorkloadDetectionTrigger)(0), // 8: api.v1.WorkloadDetectionTrigger - (NodeGroupDetectionTrigger)(0), // 9: api.v1.NodeGroupDetectionTrigger - (NodeGroupActionsAllowed)(0), // 10: api.v1.NodeGroupActionsAllowed - (RecommendationMode)(0), // 11: api.v1.RecommendationMode - (RecommendationType)(0), // 12: api.v1.RecommendationType - (HPAMetricType)(0), // 13: api.v1.HPAMetricType - (PvcOperationType)(0), // 14: api.v1.PvcOperationType - (WorkloadRuleSource)(0), // 15: api.v1.WorkloadRuleSource - (*GetRecommendationsRequest)(nil), // 16: api.v1.GetRecommendationsRequest - (*GetRecommendationsResponse)(nil), // 17: api.v1.GetRecommendationsResponse - (*GetRecommendationsForWorkloadRequest)(nil), // 18: api.v1.GetRecommendationsForWorkloadRequest - (*GetRecommendationsForWorkloadResponse)(nil), // 19: api.v1.GetRecommendationsForWorkloadResponse - (*GetNodeGroupStatsRequest)(nil), // 20: api.v1.GetNodeGroupStatsRequest - (*GetNodeGroupStatsResponse)(nil), // 21: api.v1.GetNodeGroupStatsResponse - (*GetOptimalInstanceTypeForNodeGroupRequest)(nil), // 22: api.v1.GetOptimalInstanceTypeForNodeGroupRequest - (*GetOptimalInstanceTypeForNodeGroupResponse)(nil), // 23: api.v1.GetOptimalInstanceTypeForNodeGroupResponse - (*GetLatestNodeGroupRecommendationRequest)(nil), // 24: api.v1.GetLatestNodeGroupRecommendationRequest - (*GetLatestNodeGroupRecommendationResponse)(nil), // 25: api.v1.GetLatestNodeGroupRecommendationResponse - (*GetLatestWorkloadRecommendationRequest)(nil), // 26: api.v1.GetLatestWorkloadRecommendationRequest - (*GetLatestWorkloadRecommendationResponse)(nil), // 27: api.v1.GetLatestWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationRequest)(nil), // 28: api.v1.GetPreviewWorkloadRecommendationRequest - (*GetPreviewWorkloadRecommendationResponse)(nil), // 29: api.v1.GetPreviewWorkloadRecommendationResponse - (*GetPreviewWorkloadRecommendationsRequest)(nil), // 30: api.v1.GetPreviewWorkloadRecommendationsRequest - (*WorkloadIdentifier)(nil), // 31: api.v1.WorkloadIdentifier - (*GetPreviewWorkloadRecommendationsResponse)(nil), // 32: api.v1.GetPreviewWorkloadRecommendationsResponse - (*CreateClusterRecommendationPolicyRequest)(nil), // 33: api.v1.CreateClusterRecommendationPolicyRequest - (*CreateClusterRecommendationPolicyResponse)(nil), // 34: api.v1.CreateClusterRecommendationPolicyResponse - (*GetClusterRecommendationPolicyRequest)(nil), // 35: api.v1.GetClusterRecommendationPolicyRequest - (*GetClusterRecommendationPolicyResponse)(nil), // 36: api.v1.GetClusterRecommendationPolicyResponse - (*ListClusterRecommendationPoliciesRequest)(nil), // 37: api.v1.ListClusterRecommendationPoliciesRequest - (*ListClusterRecommendationPoliciesResponse)(nil), // 38: api.v1.ListClusterRecommendationPoliciesResponse - (*UpdateClusterRecommendationPolicyRequest)(nil), // 39: api.v1.UpdateClusterRecommendationPolicyRequest - (*UpdateClusterRecommendationPolicyResponse)(nil), // 40: api.v1.UpdateClusterRecommendationPolicyResponse - (*DeleteClusterRecommendationPolicyRequest)(nil), // 41: api.v1.DeleteClusterRecommendationPolicyRequest - (*DeleteClusterRecommendationPolicyResponse)(nil), // 42: api.v1.DeleteClusterRecommendationPolicyResponse - (*AttachClusterRecommendationPolicyRequest)(nil), // 43: api.v1.AttachClusterRecommendationPolicyRequest - (*AttachClusterRecommendationPolicyResponse)(nil), // 44: api.v1.AttachClusterRecommendationPolicyResponse - (*GetWorkloadsWithAttachedPolicyTargetsRequest)(nil), // 45: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - (*GetWorkloadsWithAttachedPolicyTargetsResponse)(nil), // 46: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - (*TargetIdList)(nil), // 47: api.v1.TargetIdList - (*CreateNodeGroupRecommendationPolicyRequest)(nil), // 48: api.v1.CreateNodeGroupRecommendationPolicyRequest - (*CreateNodeGroupRecommendationPolicyResponse)(nil), // 49: api.v1.CreateNodeGroupRecommendationPolicyResponse - (*GetNodeGroupRecommendationPolicyRequest)(nil), // 50: api.v1.GetNodeGroupRecommendationPolicyRequest - (*GetNodeGroupRecommendationPolicyResponse)(nil), // 51: api.v1.GetNodeGroupRecommendationPolicyResponse - (*ListNodeGroupRecommendationPoliciesRequest)(nil), // 52: api.v1.ListNodeGroupRecommendationPoliciesRequest - (*ListNodeGroupRecommendationPoliciesResponse)(nil), // 53: api.v1.ListNodeGroupRecommendationPoliciesResponse - (*UpdateNodeGroupRecommendationPolicyRequest)(nil), // 54: api.v1.UpdateNodeGroupRecommendationPolicyRequest - (*UpdateNodeGroupRecommendationPolicyResponse)(nil), // 55: api.v1.UpdateNodeGroupRecommendationPolicyResponse - (*DeleteNodeGroupRecommendationPolicyRequest)(nil), // 56: api.v1.DeleteNodeGroupRecommendationPolicyRequest - (*DeleteNodeGroupRecommendationPolicyResponse)(nil), // 57: api.v1.DeleteNodeGroupRecommendationPolicyResponse - (*AttachNodeGroupRecommendationPolicyRequest)(nil), // 58: api.v1.AttachNodeGroupRecommendationPolicyRequest - (*AttachNodeGroupRecommendationPolicyResponse)(nil), // 59: api.v1.AttachNodeGroupRecommendationPolicyResponse - (*CreateWorkloadRecommendationPolicyRequest)(nil), // 60: api.v1.CreateWorkloadRecommendationPolicyRequest - (*CreateWorkloadRecommendationPolicyResponse)(nil), // 61: api.v1.CreateWorkloadRecommendationPolicyResponse - (*GetWorkloadRecommendationPolicyRequest)(nil), // 62: api.v1.GetWorkloadRecommendationPolicyRequest - (*GetWorkloadRecommendationPolicyResponse)(nil), // 63: api.v1.GetWorkloadRecommendationPolicyResponse - (*ListWorkloadRecommendationPoliciesRequest)(nil), // 64: api.v1.ListWorkloadRecommendationPoliciesRequest - (*ListWorkloadRecommendationPoliciesResponse)(nil), // 65: api.v1.ListWorkloadRecommendationPoliciesResponse - (*UpdateWorkloadRecommendationPolicyRequest)(nil), // 66: api.v1.UpdateWorkloadRecommendationPolicyRequest - (*UpdateWorkloadRecommendationPolicyResponse)(nil), // 67: api.v1.UpdateWorkloadRecommendationPolicyResponse - (*DeleteWorkloadRecommendationPolicyRequest)(nil), // 68: api.v1.DeleteWorkloadRecommendationPolicyRequest - (*DeleteWorkloadRecommendationPolicyResponse)(nil), // 69: api.v1.DeleteWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPolicyRequest)(nil), // 70: api.v1.AttachWorkloadRecommendationPolicyRequest - (*AttachWorkloadRecommendationPolicyResponse)(nil), // 71: api.v1.AttachWorkloadRecommendationPolicyResponse - (*AttachWorkloadRecommendationPoliciesRequest)(nil), // 72: api.v1.AttachWorkloadRecommendationPoliciesRequest - (*AttachWorkloadRecommendationPoliciesResponse)(nil), // 73: api.v1.AttachWorkloadRecommendationPoliciesResponse - (*WorkloadPolicyAttachment)(nil), // 74: api.v1.WorkloadPolicyAttachment - (*WorkloadPolicyTarget)(nil), // 75: api.v1.WorkloadPolicyTarget - (*CreateWorkloadPolicyTargetRequest)(nil), // 76: api.v1.CreateWorkloadPolicyTargetRequest - (*CreateWorkloadPolicyTargetResponse)(nil), // 77: api.v1.CreateWorkloadPolicyTargetResponse - (*GetWorkloadPolicyTargetRequest)(nil), // 78: api.v1.GetWorkloadPolicyTargetRequest - (*GetWorkloadPolicyTargetResponse)(nil), // 79: api.v1.GetWorkloadPolicyTargetResponse - (*ListWorkloadPolicyTargetsRequest)(nil), // 80: api.v1.ListWorkloadPolicyTargetsRequest - (*ListWorkloadPolicyTargetsResponse)(nil), // 81: api.v1.ListWorkloadPolicyTargetsResponse - (*UpdateWorkloadPolicyTargetRequest)(nil), // 82: api.v1.UpdateWorkloadPolicyTargetRequest - (*UpdateWorkloadPolicyTargetResponse)(nil), // 83: api.v1.UpdateWorkloadPolicyTargetResponse - (*DeleteWorkloadPolicyTargetRequest)(nil), // 84: api.v1.DeleteWorkloadPolicyTargetRequest - (*ToggleWorkloadPolicyTargetsRequest)(nil), // 85: api.v1.ToggleWorkloadPolicyTargetsRequest - (*ToggleWorkloadPolicyTargetsResponse)(nil), // 86: api.v1.ToggleWorkloadPolicyTargetsResponse - (*DeleteWorkloadPolicyTargetResponse)(nil), // 87: api.v1.DeleteWorkloadPolicyTargetResponse - (*RemoveClusterOptimizationsRequest)(nil), // 88: api.v1.RemoveClusterOptimizationsRequest - (*RemoveClusterOptimizationsResponse)(nil), // 89: api.v1.RemoveClusterOptimizationsResponse - (*PreviewWorkloadPolicyTargetMatchesRequest)(nil), // 90: api.v1.PreviewWorkloadPolicyTargetMatchesRequest - (*PreviewWorkloadPolicyTargetMatchesResponse)(nil), // 91: api.v1.PreviewWorkloadPolicyTargetMatchesResponse - (*GetPreviewWorkloadPolicyTargetRecommendationsRequest)(nil), // 92: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - (*GetPreviewWorkloadPolicyTargetRecommendationsResponse)(nil), // 93: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - (*WorkloadPercentileSummary)(nil), // 94: api.v1.WorkloadPercentileSummary - (*NodeGroupPolicyTarget)(nil), // 95: api.v1.NodeGroupPolicyTarget - (*CreateNodeGroupPolicyTargetRequest)(nil), // 96: api.v1.CreateNodeGroupPolicyTargetRequest - (*CreateNodeGroupPolicyTargetResponse)(nil), // 97: api.v1.CreateNodeGroupPolicyTargetResponse - (*GetNodeGroupPolicyTargetRequest)(nil), // 98: api.v1.GetNodeGroupPolicyTargetRequest - (*GetNodeGroupPolicyTargetResponse)(nil), // 99: api.v1.GetNodeGroupPolicyTargetResponse - (*ListNodeGroupPolicyTargetsRequest)(nil), // 100: api.v1.ListNodeGroupPolicyTargetsRequest - (*ListNodeGroupPolicyTargetsResponse)(nil), // 101: api.v1.ListNodeGroupPolicyTargetsResponse - (*UpdateNodeGroupPolicyTargetRequest)(nil), // 102: api.v1.UpdateNodeGroupPolicyTargetRequest - (*UpdateNodeGroupPolicyTargetResponse)(nil), // 103: api.v1.UpdateNodeGroupPolicyTargetResponse - (*DeleteNodeGroupPolicyTargetRequest)(nil), // 104: api.v1.DeleteNodeGroupPolicyTargetRequest - (*ToggleNodeGroupPolicyTargetsRequest)(nil), // 105: api.v1.ToggleNodeGroupPolicyTargetsRequest - (*ToggleNodeGroupPolicyTargetsResponse)(nil), // 106: api.v1.ToggleNodeGroupPolicyTargetsResponse - (*DeleteNodeGroupPolicyTargetResponse)(nil), // 107: api.v1.DeleteNodeGroupPolicyTargetResponse - (*PreviewNodeGroupPolicyTargetMatchesRequest)(nil), // 108: api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - (*PreviewNodeGroupPolicyTargetMatchesResponse)(nil), // 109: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - (*GetPreviewNodeGroupPolicyTargetRecommendationsRequest)(nil), // 110: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - (*GetPreviewNodeGroupPolicyTargetRecommendationsResponse)(nil), // 111: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - (*BalanceGetRecommendationsRequest)(nil), // 112: api.v1.BalanceGetRecommendationsRequest - (*BalanceGetRecommendationsResponse)(nil), // 113: api.v1.BalanceGetRecommendationsResponse - (*BatchNodeGroupRecommendations)(nil), // 114: api.v1.BatchNodeGroupRecommendations - (*BatchWorkloadRecommendations)(nil), // 115: api.v1.BatchWorkloadRecommendations - (*WorkloadRule)(nil), // 116: api.v1.WorkloadRule - (*ResourceRuleConfig)(nil), // 117: api.v1.ResourceRuleConfig - (*HPAMetricTrigger)(nil), // 118: api.v1.HPAMetricTrigger - (*HPAFallback)(nil), // 119: api.v1.HPAFallback - (*ContainerResourceConfig)(nil), // 120: api.v1.ContainerResourceConfig - (*ContainerResourceRuleConfig)(nil), // 121: api.v1.ContainerResourceRuleConfig - (*HPARuleConfig)(nil), // 122: api.v1.HPARuleConfig - (*EmergencyResponseConfig)(nil), // 123: api.v1.EmergencyResponseConfig - (*PercentileValues)(nil), // 124: api.v1.PercentileValues - (*ResourcePercentiles)(nil), // 125: api.v1.ResourcePercentiles - (*BurstinessRatios)(nil), // 126: api.v1.BurstinessRatios - (*WorkloadClassification)(nil), // 127: api.v1.WorkloadClassification - (*BatchWorkloadRules)(nil), // 128: api.v1.BatchWorkloadRules - (*WorkloadWithActiveRecommendations)(nil), // 129: api.v1.WorkloadWithActiveRecommendations - (*GenericResourceRecommendation)(nil), // 130: api.v1.GenericResourceRecommendation - (*BatchGenericResourceRecommendations)(nil), // 131: api.v1.BatchGenericResourceRecommendations - (*BatchPvcStorageRecommendations)(nil), // 132: api.v1.BatchPvcStorageRecommendations - (*GeneratePodDisruptionBudgetRequest)(nil), // 133: api.v1.GeneratePodDisruptionBudgetRequest - (*GeneratePodDisruptionBudgetResponse)(nil), // 134: api.v1.GeneratePodDisruptionBudgetResponse - (*GenerateAndCreatePodDisruptionBudgetRequest)(nil), // 135: api.v1.GenerateAndCreatePodDisruptionBudgetRequest - (*GenerateAndCreatePodDisruptionBudgetResponse)(nil), // 136: api.v1.GenerateAndCreatePodDisruptionBudgetResponse - (*CreatePodDisruptionBudgetRequest)(nil), // 137: api.v1.CreatePodDisruptionBudgetRequest - (*CreatePodDisruptionBudgetResponse)(nil), // 138: api.v1.CreatePodDisruptionBudgetResponse - (*GetPDBRecommendationForWorkloadRequest)(nil), // 139: api.v1.GetPDBRecommendationForWorkloadRequest - (*GetPDBRecommendationForWorkloadResponse)(nil), // 140: api.v1.GetPDBRecommendationForWorkloadResponse - (*ReconcileWorkload)(nil), // 141: api.v1.ReconcileWorkload - (*ReconcileResponse)(nil), // 142: api.v1.ReconcileResponse - (*OperatorHealth)(nil), // 143: api.v1.OperatorHealth - (*AgentHealth)(nil), // 144: api.v1.AgentHealth - (*AgentHealthMeta)(nil), // 145: api.v1.AgentHealthMeta - (*HealthReport)(nil), // 146: api.v1.HealthReport - (*NodeStats)(nil), // 147: api.v1.NodeStats - (*NodeMetric)(nil), // 148: api.v1.NodeMetric - (*ContainerStats)(nil), // 149: api.v1.ContainerStats - (*ContainerMetric)(nil), // 150: api.v1.ContainerMetric - (*ContainerSummarizedMetric)(nil), // 151: api.v1.ContainerSummarizedMetric - (*Metric)(nil), // 152: api.v1.Metric - (*ContainerRecommendation)(nil), // 153: api.v1.ContainerRecommendation - (*KedaScaledObjectRecommendation)(nil), // 154: api.v1.KedaScaledObjectRecommendation - (*ResourceRecommendation)(nil), // 155: api.v1.ResourceRecommendation - (*Toleration)(nil), // 156: api.v1.Toleration - (*ClusterRecommendationPolicy)(nil), // 157: api.v1.ClusterRecommendationPolicy - (*NodeGroupRecommendationPolicy)(nil), // 158: api.v1.NodeGroupRecommendationPolicy - (*VerticalScalingOptimizationTarget)(nil), // 159: api.v1.VerticalScalingOptimizationTarget - (*HorizontalScalingOptimizationTarget)(nil), // 160: api.v1.HorizontalScalingOptimizationTarget - (*WorkloadRecommendationPolicy)(nil), // 161: api.v1.WorkloadRecommendationPolicy - (*GetPolicyRecommendedDefaultsRequest)(nil), // 162: api.v1.GetPolicyRecommendedDefaultsRequest - (*GetPolicyRecommendedDefaultsResponse)(nil), // 163: api.v1.GetPolicyRecommendedDefaultsResponse - (*BalanceRegisterRequest)(nil), // 164: api.v1.BalanceRegisterRequest - (*BalanceFeatures)(nil), // 165: api.v1.BalanceFeatures - (*BalanceApplyRecommendationResponse)(nil), // 166: api.v1.BalanceApplyRecommendationResponse - (*LiveMigrationResult)(nil), // 167: api.v1.LiveMigrationResult - (*NodeGroupReference)(nil), // 168: api.v1.NodeGroupReference - (*NodeGroupRecommendation)(nil), // 169: api.v1.NodeGroupRecommendation - (*CostImpact)(nil), // 170: api.v1.CostImpact - (*WorkloadRecommendation)(nil), // 171: api.v1.WorkloadRecommendation - (*GetAttachedNodeGroupPoliciesRequest)(nil), // 172: api.v1.GetAttachedNodeGroupPoliciesRequest - (*GetAttachedNodeGroupPoliciesResponse)(nil), // 173: api.v1.GetAttachedNodeGroupPoliciesResponse - (*GetAttachedWorkloadPoliciesRequest)(nil), // 174: api.v1.GetAttachedWorkloadPoliciesRequest - (*GetAttachedWorkloadPoliciesResponse)(nil), // 175: api.v1.GetAttachedWorkloadPoliciesResponse - (*WorkloadRecommendationPolicyGroup)(nil), // 176: api.v1.WorkloadRecommendationPolicyGroup - (*WorkloadPolicyTargetGroup)(nil), // 177: api.v1.WorkloadPolicyTargetGroup - (*WorkloadIdentifiers)(nil), // 178: api.v1.WorkloadIdentifiers - (*WorkloadPolicies)(nil), // 179: api.v1.WorkloadPolicies - (*ListAttachedWorkloadPoliciesRequest)(nil), // 180: api.v1.ListAttachedWorkloadPoliciesRequest - (*ListAttachedWorkloadPoliciesResponse)(nil), // 181: api.v1.ListAttachedWorkloadPoliciesResponse - (*ListAttachedNodeGroupPoliciesRequest)(nil), // 182: api.v1.ListAttachedNodeGroupPoliciesRequest - (*ListAttachedNodeGroupPoliciesResponse)(nil), // 183: api.v1.ListAttachedNodeGroupPoliciesResponse - (*NodeGroupItem)(nil), // 184: api.v1.NodeGroupItem - (*RecommendationAppliedRequest)(nil), // 185: api.v1.RecommendationAppliedRequest - (*RecommendationAppliedResponse)(nil), // 186: api.v1.RecommendationAppliedResponse - (*ApplyRecommendationRequest)(nil), // 187: api.v1.ApplyRecommendationRequest - (*ApplyRecommendationResponse)(nil), // 188: api.v1.ApplyRecommendationResponse - (*RecommendationEventsRequest)(nil), // 189: api.v1.RecommendationEventsRequest - (*RecommendationEventsResponse)(nil), // 190: api.v1.RecommendationEventsResponse - (*RetrieveSavingsForWorkloadRequest)(nil), // 191: api.v1.RetrieveSavingsForWorkloadRequest - (*RetrieveSavingsForWorkloadResponse)(nil), // 192: api.v1.RetrieveSavingsForWorkloadResponse - (*CreateNodePoliciesRequest)(nil), // 193: api.v1.CreateNodePoliciesRequest - (*CreateNodePoliciesResponse)(nil), // 194: api.v1.CreateNodePoliciesResponse - (*SuggestedNodePolicyRequest)(nil), // 195: api.v1.SuggestedNodePolicyRequest - (*SuggestedNodePolicyResponse)(nil), // 196: api.v1.SuggestedNodePolicyResponse - (*GenerateNodePoliciesFromKarpenterRequest)(nil), // 197: api.v1.GenerateNodePoliciesFromKarpenterRequest - (*GenerateNodePoliciesFromKarpenterResponse)(nil), // 198: api.v1.GenerateNodePoliciesFromKarpenterResponse - (*GenerateNodePoliciesFromNodeGroupsRequest)(nil), // 199: api.v1.GenerateNodePoliciesFromNodeGroupsRequest - (*GenerateNodePoliciesFromNodeGroupsResponse)(nil), // 200: api.v1.GenerateNodePoliciesFromNodeGroupsResponse - (*GetNodeAnnotationReadinessRequest)(nil), // 201: api.v1.GetNodeAnnotationReadinessRequest - (*GetNodeAnnotationReadinessResponse)(nil), // 202: api.v1.GetNodeAnnotationReadinessResponse - (*GetMigrationStateRequest)(nil), // 203: api.v1.GetMigrationStateRequest - (*GetMigrationStateResponse)(nil), // 204: api.v1.GetMigrationStateResponse - (*UpdateMigrationStateRequest)(nil), // 205: api.v1.UpdateMigrationStateRequest - (*UpdateMigrationStateResponse)(nil), // 206: api.v1.UpdateMigrationStateResponse - (*ReportNodePoolValidationRequest)(nil), // 207: api.v1.ReportNodePoolValidationRequest - (*ReportNodePoolValidationResponse)(nil), // 208: api.v1.ReportNodePoolValidationResponse - (*GetNodePoolValidationsRequest)(nil), // 209: api.v1.GetNodePoolValidationsRequest - (*NodePoolValidationReport)(nil), // 210: api.v1.NodePoolValidationReport - (*GetNodePoolValidationsResponse)(nil), // 211: api.v1.GetNodePoolValidationsResponse - (*WorkloadCompatibilityWarning)(nil), // 212: api.v1.WorkloadCompatibilityWarning - (*ListNodePoliciesRequest)(nil), // 213: api.v1.ListNodePoliciesRequest - (*ListNodePoliciesResponse)(nil), // 214: api.v1.ListNodePoliciesResponse - (*UpdateNodePolicyRequest)(nil), // 215: api.v1.UpdateNodePolicyRequest - (*UpdateNodePolicyResponse)(nil), // 216: api.v1.UpdateNodePolicyResponse - (*DeleteNodePolicyRequest)(nil), // 217: api.v1.DeleteNodePolicyRequest - (*DeleteNodePolicyResponse)(nil), // 218: api.v1.DeleteNodePolicyResponse - (*NodePolicy)(nil), // 219: api.v1.NodePolicy - (*PreviewNodeRecommendationConfigRequest)(nil), // 220: api.v1.PreviewNodeRecommendationConfigRequest - (*PreviewNodeRecommendationConfigResponse)(nil), // 221: api.v1.PreviewNodeRecommendationConfigResponse - (*NodeRecommendationConfig)(nil), // 222: api.v1.NodeRecommendationConfig - (*SuggestedKarpenterConfigRequest)(nil), // 223: api.v1.SuggestedKarpenterConfigRequest - (*SuggestedKarpenterConfigResponse)(nil), // 224: api.v1.SuggestedKarpenterConfigResponse - (*GetAvailableKindsByTargetingFiltersRequest)(nil), // 225: api.v1.GetAvailableKindsByTargetingFiltersRequest - (*SearchResourcesByTargetingFiltersRequest)(nil), // 226: api.v1.SearchResourcesByTargetingFiltersRequest - (*TargetFilters)(nil), // 227: api.v1.TargetFilters - (*GetAvailableKindsByTargetingFiltersResponse)(nil), // 228: api.v1.GetAvailableKindsByTargetingFiltersResponse - (*SearchResourcesByTargetingFiltersResponse)(nil), // 229: api.v1.SearchResourcesByTargetingFiltersResponse - (*NamespaceSearchResult)(nil), // 230: api.v1.NamespaceSearchResult - (*WorkloadSearchResult)(nil), // 231: api.v1.WorkloadSearchResult - (*NodeGroupSearchResult)(nil), // 232: api.v1.NodeGroupSearchResult - (*LabelSearchResult)(nil), // 233: api.v1.LabelSearchResult - (*CreateNodePolicyTargetsRequest)(nil), // 234: api.v1.CreateNodePolicyTargetsRequest - (*CreateNodePolicyTargetsResponse)(nil), // 235: api.v1.CreateNodePolicyTargetsResponse - (*ListNodePolicyTargetsRequest)(nil), // 236: api.v1.ListNodePolicyTargetsRequest - (*ListNodePolicyTargetsResponse)(nil), // 237: api.v1.ListNodePolicyTargetsResponse - (*UpdateNodePolicyTargetRequest)(nil), // 238: api.v1.UpdateNodePolicyTargetRequest - (*UpdateNodePolicyTargetResponse)(nil), // 239: api.v1.UpdateNodePolicyTargetResponse - (*NodePolicyTarget)(nil), // 240: api.v1.NodePolicyTarget - (*NodePolicyCondition)(nil), // 241: api.v1.NodePolicyCondition - (*NodePolicyTargetStatus)(nil), // 242: api.v1.NodePolicyTargetStatus - (*ZonalShiftConfig)(nil), // 243: api.v1.ZonalShiftConfig - (*Taint)(nil), // 244: api.v1.Taint - (*DisruptionBudget)(nil), // 245: api.v1.DisruptionBudget - (*DisruptionPolicy)(nil), // 246: api.v1.DisruptionPolicy - (*ResourceLimits)(nil), // 247: api.v1.ResourceLimits - (*AWSNodeClassSpec)(nil), // 248: api.v1.AWSNodeClassSpec - (*GetInstanceFamiliesRequest)(nil), // 249: api.v1.GetInstanceFamiliesRequest - (*GetInstanceFamiliesResponse)(nil), // 250: api.v1.GetInstanceFamiliesResponse - (*GetInstanceSizesRequest)(nil), // 251: api.v1.GetInstanceSizesRequest - (*GetInstanceSizesResponse)(nil), // 252: api.v1.GetInstanceSizesResponse - (*InstanceFamily)(nil), // 253: api.v1.InstanceFamily - (*InstanceSize)(nil), // 254: api.v1.InstanceSize - (*InstanceCategory)(nil), // 255: api.v1.InstanceCategory - (*InstanceCPU)(nil), // 256: api.v1.InstanceCPU - (*InstanceTypeName)(nil), // 257: api.v1.InstanceTypeName - (*GetInstanceCategoriesRequest)(nil), // 258: api.v1.GetInstanceCategoriesRequest - (*GetInstanceCategoriesResponse)(nil), // 259: api.v1.GetInstanceCategoriesResponse - (*GetInstanceCPUsRequest)(nil), // 260: api.v1.GetInstanceCPUsRequest - (*GetInstanceCPUsResponse)(nil), // 261: api.v1.GetInstanceCPUsResponse - (*GetInstanceTypeNamesRequest)(nil), // 262: api.v1.GetInstanceTypeNamesRequest - (*GetInstanceTypeNamesResponse)(nil), // 263: api.v1.GetInstanceTypeNamesResponse - (*SubnetSelectorTerm)(nil), // 264: api.v1.SubnetSelectorTerm - (*SecurityGroupSelectorTerm)(nil), // 265: api.v1.SecurityGroupSelectorTerm - (*CapacityReservationSelectorTerm)(nil), // 266: api.v1.CapacityReservationSelectorTerm - (*AMISelectorTerm)(nil), // 267: api.v1.AMISelectorTerm - (*KubeletConfiguration)(nil), // 268: api.v1.KubeletConfiguration - (*BlockDeviceMapping)(nil), // 269: api.v1.BlockDeviceMapping - (*BlockDevice)(nil), // 270: api.v1.BlockDevice - (*MetadataOptions)(nil), // 271: api.v1.MetadataOptions - (*GCPNodeClassSpec)(nil), // 272: api.v1.GCPNodeClassSpec - (*GCPImageSelectorTerm)(nil), // 273: api.v1.GCPImageSelectorTerm - (*GCPDisk)(nil), // 274: api.v1.GCPDisk - (*AzureNodeClassSpec)(nil), // 275: api.v1.AzureNodeClassSpec - (*AzureKubeletConfiguration)(nil), // 276: api.v1.AzureKubeletConfiguration - (*OCIImageSelectorTerm)(nil), // 277: api.v1.OCIImageSelectorTerm - (*OCISubnetSelectorTerm)(nil), // 278: api.v1.OCISubnetSelectorTerm - (*OCISecurityGroupSelectorTerm)(nil), // 279: api.v1.OCISecurityGroupSelectorTerm - (*OCIBootConfig)(nil), // 280: api.v1.OCIBootConfig - (*OCILaunchOptions)(nil), // 281: api.v1.OCILaunchOptions - (*OCIVolumeAttributes)(nil), // 282: api.v1.OCIVolumeAttributes - (*OCINodeClassSpec)(nil), // 283: api.v1.OCINodeClassSpec - (*KarpenterSettingsRecommendation)(nil), // 284: api.v1.KarpenterSettingsRecommendation - (*RawKarpenterSpec)(nil), // 285: api.v1.RawKarpenterSpec - (*NodeRecommendation)(nil), // 286: api.v1.NodeRecommendation - (*AWSKarpenterSpec)(nil), // 287: api.v1.AWSKarpenterSpec - (*AKSKarpenterSpec)(nil), // 288: api.v1.AKSKarpenterSpec - (*NodePool)(nil), // 289: api.v1.NodePool - (*EC2NodeClass)(nil), // 290: api.v1.EC2NodeClass - (*AKSNodeClass)(nil), // 291: api.v1.AKSNodeClass - (*GCPKarpenterSpec)(nil), // 292: api.v1.GCPKarpenterSpec - (*GCENodeClass)(nil), // 293: api.v1.GCENodeClass - (*OCIKarpenterSpec)(nil), // 294: api.v1.OCIKarpenterSpec - (*OCINodeClass)(nil), // 295: api.v1.OCINodeClass - (*StorageRecommendationPolicy)(nil), // 296: api.v1.StorageRecommendationPolicy - (*CreateStorageRecommendationPolicyRequest)(nil), // 297: api.v1.CreateStorageRecommendationPolicyRequest - (*CreateStorageRecommendationPolicyResponse)(nil), // 298: api.v1.CreateStorageRecommendationPolicyResponse - (*GetStorageRecommendationPolicyRequest)(nil), // 299: api.v1.GetStorageRecommendationPolicyRequest - (*GetStorageRecommendationPolicyResponse)(nil), // 300: api.v1.GetStorageRecommendationPolicyResponse - (*ListStorageRecommendationPoliciesRequest)(nil), // 301: api.v1.ListStorageRecommendationPoliciesRequest - (*ListStorageRecommendationPoliciesResponse)(nil), // 302: api.v1.ListStorageRecommendationPoliciesResponse - (*UpdateStorageRecommendationPolicyRequest)(nil), // 303: api.v1.UpdateStorageRecommendationPolicyRequest - (*UpdateStorageRecommendationPolicyResponse)(nil), // 304: api.v1.UpdateStorageRecommendationPolicyResponse - (*DeleteStorageRecommendationPolicyRequest)(nil), // 305: api.v1.DeleteStorageRecommendationPolicyRequest - (*DeleteStorageRecommendationPolicyResponse)(nil), // 306: api.v1.DeleteStorageRecommendationPolicyResponse - (*StoragePolicyTarget)(nil), // 307: api.v1.StoragePolicyTarget - (*CreateStoragePolicyTargetRequest)(nil), // 308: api.v1.CreateStoragePolicyTargetRequest - (*CreateStoragePolicyTargetResponse)(nil), // 309: api.v1.CreateStoragePolicyTargetResponse - (*ListStoragePolicyTargetsRequest)(nil), // 310: api.v1.ListStoragePolicyTargetsRequest - (*ListStoragePolicyTargetsResponse)(nil), // 311: api.v1.ListStoragePolicyTargetsResponse - (*UpdateStoragePolicyTargetRequest)(nil), // 312: api.v1.UpdateStoragePolicyTargetRequest - (*UpdateStoragePolicyTargetResponse)(nil), // 313: api.v1.UpdateStoragePolicyTargetResponse - (*DeleteStoragePolicyTargetRequest)(nil), // 314: api.v1.DeleteStoragePolicyTargetRequest - (*DeleteStoragePolicyTargetResponse)(nil), // 315: api.v1.DeleteStoragePolicyTargetResponse - (*PvcStorageRecommendation)(nil), // 316: api.v1.PvcStorageRecommendation - (*GetPvcStorageRecommendationRequest)(nil), // 317: api.v1.GetPvcStorageRecommendationRequest - (*GetPvcStorageRecommendationResponse)(nil), // 318: api.v1.GetPvcStorageRecommendationResponse - (*ListPvcStorageRecommendationsRequest)(nil), // 319: api.v1.ListPvcStorageRecommendationsRequest - (*ListPvcStorageRecommendationsResponse)(nil), // 320: api.v1.ListPvcStorageRecommendationsResponse - (*GeneratePvcStorageRecommendationRequest)(nil), // 321: api.v1.GeneratePvcStorageRecommendationRequest - (*GeneratePvcStorageRecommendationResponse)(nil), // 322: api.v1.GeneratePvcStorageRecommendationResponse - (*PreviewPvcStorageRecommendationRequest)(nil), // 323: api.v1.PreviewPvcStorageRecommendationRequest - (*PreviewPvcStorageRecommendationResponse)(nil), // 324: api.v1.PreviewPvcStorageRecommendationResponse - (*WorkloadRuleOOMEvent)(nil), // 325: api.v1.WorkloadRuleOOMEvent - (*ListWorkloadRuleOOMEventsRequest)(nil), // 326: api.v1.ListWorkloadRuleOOMEventsRequest - (*ListWorkloadRuleOOMEventsResponse)(nil), // 327: api.v1.ListWorkloadRuleOOMEventsResponse - (*ListWorkloadOOMEventsRequest)(nil), // 328: api.v1.ListWorkloadOOMEventsRequest - (*ListWorkloadOOMEventsResponse)(nil), // 329: api.v1.ListWorkloadOOMEventsResponse - (*WorkloadRuleCPUThrottleEvent)(nil), // 330: api.v1.WorkloadRuleCPUThrottleEvent - (*ListWorkloadRuleCPUThrottleEventsRequest)(nil), // 331: api.v1.ListWorkloadRuleCPUThrottleEventsRequest - (*ListWorkloadRuleCPUThrottleEventsResponse)(nil), // 332: api.v1.ListWorkloadRuleCPUThrottleEventsResponse - (*ListWorkloadCPUThrottleEventsRequest)(nil), // 333: api.v1.ListWorkloadCPUThrottleEventsRequest - (*ListWorkloadCPUThrottleEventsResponse)(nil), // 334: api.v1.ListWorkloadCPUThrottleEventsResponse - (*WorkloadOptimizationPolicyProto)(nil), // 335: api.v1.WorkloadOptimizationPolicyProto - (*CreateWorkloadOptimizationPolicyRequest)(nil), // 336: api.v1.CreateWorkloadOptimizationPolicyRequest - (*CreateWorkloadOptimizationPolicyResponse)(nil), // 337: api.v1.CreateWorkloadOptimizationPolicyResponse - (*ListWorkloadOptimizationPoliciesRequest)(nil), // 338: api.v1.ListWorkloadOptimizationPoliciesRequest - (*ListWorkloadOptimizationPoliciesResponse)(nil), // 339: api.v1.ListWorkloadOptimizationPoliciesResponse - (*GetWorkloadOptimizationPolicyRequest)(nil), // 340: api.v1.GetWorkloadOptimizationPolicyRequest - (*GetWorkloadOptimizationPolicyResponse)(nil), // 341: api.v1.GetWorkloadOptimizationPolicyResponse - (*UpdateWorkloadOptimizationPolicyRequest)(nil), // 342: api.v1.UpdateWorkloadOptimizationPolicyRequest - (*UpdateWorkloadOptimizationPolicyResponse)(nil), // 343: api.v1.UpdateWorkloadOptimizationPolicyResponse - (*DeleteWorkloadOptimizationPolicyRequest)(nil), // 344: api.v1.DeleteWorkloadOptimizationPolicyRequest - (*DeleteWorkloadOptimizationPolicyResponse)(nil), // 345: api.v1.DeleteWorkloadOptimizationPolicyResponse - (*GetWorkloadRulesByPolicyRequest)(nil), // 346: api.v1.GetWorkloadRulesByPolicyRequest - (*GetWorkloadRulesByPolicyResponse)(nil), // 347: api.v1.GetWorkloadRulesByPolicyResponse - (*ListWorkloadRulesRequest)(nil), // 348: api.v1.ListWorkloadRulesRequest - (*ListWorkloadRulesResponse)(nil), // 349: api.v1.ListWorkloadRulesResponse - (*GetWorkloadRuleByIDRequest)(nil), // 350: api.v1.GetWorkloadRuleByIDRequest - (*GetWorkloadRuleByIDResponse)(nil), // 351: api.v1.GetWorkloadRuleByIDResponse - (*GetWorkloadRuleByWorkloadRequest)(nil), // 352: api.v1.GetWorkloadRuleByWorkloadRequest - (*GetWorkloadRuleByWorkloadResponse)(nil), // 353: api.v1.GetWorkloadRuleByWorkloadResponse - (*GetWorkloadByWorkloadRuleRequest)(nil), // 354: api.v1.GetWorkloadByWorkloadRuleRequest - (*GetWorkloadByWorkloadRuleResponse)(nil), // 355: api.v1.GetWorkloadByWorkloadRuleResponse - (*DeleteWorkloadRuleRequest)(nil), // 356: api.v1.DeleteWorkloadRuleRequest - (*DeleteWorkloadRuleResponse)(nil), // 357: api.v1.DeleteWorkloadRuleResponse - (*ManualRuleFields)(nil), // 358: api.v1.ManualRuleFields - (*UpsertManualWorkloadRuleRequest)(nil), // 359: api.v1.UpsertManualWorkloadRuleRequest - (*UpsertManualWorkloadRuleResponse)(nil), // 360: api.v1.UpsertManualWorkloadRuleResponse - (*PreviewWorkloadRuleRequest)(nil), // 361: api.v1.PreviewWorkloadRuleRequest - (*PreviewWorkloadRuleResponse)(nil), // 362: api.v1.PreviewWorkloadRuleResponse - (*GetWorkloadContainerNamesRequest)(nil), // 363: api.v1.GetWorkloadContainerNamesRequest - (*GetWorkloadContainerNamesResponse)(nil), // 364: api.v1.GetWorkloadContainerNamesResponse - (*BatchAutoOptimizeWorkload)(nil), // 365: api.v1.BatchAutoOptimizeWorkload - (*BatchAutoOptimizeWorkloadsRequest)(nil), // 366: api.v1.BatchAutoOptimizeWorkloadsRequest - (*BatchAutoOptimizeWorkloadResult)(nil), // 367: api.v1.BatchAutoOptimizeWorkloadResult - (*BatchAutoOptimizeWorkloadsResponse)(nil), // 368: api.v1.BatchAutoOptimizeWorkloadsResponse - (*WorkloadProfileManifest)(nil), // 369: api.v1.WorkloadProfileManifest - (*BatchWorkloadProfiles)(nil), // 370: api.v1.BatchWorkloadProfiles - (*NodeConfigApplyEvent)(nil), // 371: api.v1.NodeConfigApplyEvent - (*GetNodeRecommendationStatusRequest)(nil), // 372: api.v1.GetNodeRecommendationStatusRequest - (*GetNodeRecommendationStatusResponse)(nil), // 373: api.v1.GetNodeRecommendationStatusResponse - nil, // 374: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - nil, // 375: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - nil, // 376: api.v1.HPAMetricTrigger.MetadataEntry - nil, // 377: api.v1.AgentHealth.NodeNameToAgentEntry - nil, // 378: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - nil, // 379: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - nil, // 380: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - nil, // 381: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - nil, // 382: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - nil, // 383: api.v1.NodePolicy.LabelsEntry - nil, // 384: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - nil, // 385: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - nil, // 386: api.v1.AWSNodeClassSpec.TagsEntry - nil, // 387: api.v1.SubnetSelectorTerm.TagsEntry - nil, // 388: api.v1.SecurityGroupSelectorTerm.TagsEntry - nil, // 389: api.v1.CapacityReservationSelectorTerm.TagsEntry - nil, // 390: api.v1.AMISelectorTerm.TagsEntry - nil, // 391: api.v1.KubeletConfiguration.SystemReservedEntry - nil, // 392: api.v1.KubeletConfiguration.KubeReservedEntry - nil, // 393: api.v1.KubeletConfiguration.EvictionHardEntry - nil, // 394: api.v1.KubeletConfiguration.EvictionSoftEntry - nil, // 395: api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - nil, // 396: api.v1.GCPNodeClassSpec.LabelsEntry - nil, // 397: api.v1.GCPNodeClassSpec.MetadataEntry - nil, // 398: api.v1.AzureNodeClassSpec.TagsEntry - nil, // 399: api.v1.OCINodeClassSpec.MetaDataEntry - nil, // 400: api.v1.OCINodeClassSpec.TagsEntry - nil, // 401: api.v1.OCINodeClassSpec.FreeFormTagsEntry - nil, // 402: api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - nil, // 403: api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - nil, // 404: api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - nil, // 405: api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - (*timestamppb.Timestamp)(nil), // 406: google.protobuf.Timestamp - (*WorkloadFilters)(nil), // 407: api.v1.WorkloadFilters - (*Pagination)(nil), // 408: api.v1.Pagination - (K8SObjectKind)(0), // 409: api.v1.K8sObjectKind - (*durationpb.Duration)(nil), // 410: google.protobuf.Duration - (*LabelSelector)(nil), // 411: api.v1.LabelSelector - (*RegexPattern)(nil), // 412: api.v1.RegexPattern - (*WorkloadItem)(nil), // 413: api.v1.WorkloadItem - (*MetricPercentiles)(nil), // 414: api.v1.MetricPercentiles - (*NodeGroup)(nil), // 415: api.v1.NodeGroup - (*HPABehavior)(nil), // 416: api.v1.HPABehavior - (*money.Money)(nil), // 417: google.type.Money - (*SavingsTimeSeries)(nil), // 418: api.v1.SavingsTimeSeries - (*GetWorkloadResponse)(nil), // 419: api.v1.GetWorkloadResponse - (*CloudProvider)(nil), // 420: api.v1.CloudProvider - (*WorkloadProfileResult)(nil), // 421: api.v1.WorkloadProfileResult - (ProfileWindow)(0), // 422: api.v1.ProfileWindow - (*ProfileKey)(nil), // 423: api.v1.ProfileKey - (*WorkloadProfileSnapshot)(nil), // 424: 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{ - 406, // 0: api.v1.GetRecommendationsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 1: api.v1.GetRecommendationsRequest.end_time:type_name -> google.protobuf.Timestamp - 407, // 2: api.v1.GetRecommendationsRequest.filters:type_name -> api.v1.WorkloadFilters - 408, // 3: api.v1.GetRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 171, // 4: api.v1.GetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 408, // 5: api.v1.GetRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 406, // 6: api.v1.GetRecommendationsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 7: api.v1.GetRecommendationsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 171, // 8: api.v1.GetRecommendationsForWorkloadResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 406, // 9: api.v1.GetNodeGroupStatsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 10: api.v1.GetNodeGroupStatsRequest.end_time:type_name -> google.protobuf.Timestamp - 147, // 11: api.v1.GetNodeGroupStatsResponse.node_stats:type_name -> api.v1.NodeStats - 406, // 12: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 13: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.end_time:type_name -> google.protobuf.Timestamp - 11, // 14: api.v1.GetOptimalInstanceTypeForNodeGroupRequest.mode:type_name -> api.v1.RecommendationMode - 409, // 15: api.v1.GetLatestWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 409, // 16: api.v1.GetLatestWorkloadRecommendationResponse.kind:type_name -> api.v1.K8sObjectKind - 153, // 17: api.v1.GetLatestWorkloadRecommendationResponse.container_recommendations:type_name -> api.v1.ContainerRecommendation - 156, // 18: api.v1.GetLatestWorkloadRecommendationResponse.current_tolerations:type_name -> api.v1.Toleration - 156, // 19: api.v1.GetLatestWorkloadRecommendationResponse.recommended_tolerations:type_name -> api.v1.Toleration - 409, // 20: api.v1.GetPreviewWorkloadRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 406, // 21: api.v1.GetPreviewWorkloadRecommendationRequest.timestamp:type_name -> google.protobuf.Timestamp - 410, // 22: api.v1.GetPreviewWorkloadRecommendationRequest.vpa_lookback:type_name -> google.protobuf.Duration - 410, // 23: api.v1.GetPreviewWorkloadRecommendationRequest.hpa_lookback:type_name -> google.protobuf.Duration - 171, // 24: api.v1.GetPreviewWorkloadRecommendationResponse.rec:type_name -> api.v1.WorkloadRecommendation - 31, // 25: api.v1.GetPreviewWorkloadRecommendationsRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 406, // 26: api.v1.GetPreviewWorkloadRecommendationsRequest.timestamp:type_name -> google.protobuf.Timestamp - 410, // 27: api.v1.GetPreviewWorkloadRecommendationsRequest.vpa_lookback:type_name -> google.protobuf.Duration - 410, // 28: api.v1.GetPreviewWorkloadRecommendationsRequest.hpa_lookback:type_name -> google.protobuf.Duration - 409, // 29: api.v1.WorkloadIdentifier.kind:type_name -> api.v1.K8sObjectKind - 29, // 30: api.v1.GetPreviewWorkloadRecommendationsResponse.recommendations:type_name -> api.v1.GetPreviewWorkloadRecommendationResponse - 11, // 31: api.v1.CreateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 32: api.v1.CreateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 157, // 33: api.v1.CreateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 157, // 34: api.v1.GetClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 157, // 35: api.v1.ListClusterRecommendationPoliciesResponse.policies:type_name -> api.v1.ClusterRecommendationPolicy - 11, // 36: api.v1.UpdateClusterRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 37: api.v1.UpdateClusterRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 157, // 38: api.v1.UpdateClusterRecommendationPolicyResponse.policy:type_name -> api.v1.ClusterRecommendationPolicy - 406, // 39: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 40: api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest.end_time:type_name -> google.protobuf.Timestamp - 31, // 41: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workloads:type_name -> api.v1.WorkloadIdentifier - 374, // 42: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.workload_target_map:type_name -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry - 9, // 43: api.v1.CreateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 44: api.v1.CreateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 45: api.v1.CreateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 46: api.v1.CreateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 47: api.v1.CreateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 158, // 48: api.v1.GetNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 158, // 49: api.v1.ListNodeGroupRecommendationPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 9, // 50: api.v1.UpdateNodeGroupRecommendationPolicyRequest.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 51: api.v1.UpdateNodeGroupRecommendationPolicyRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 52: api.v1.UpdateNodeGroupRecommendationPolicyRequest.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 53: api.v1.UpdateNodeGroupRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 158, // 54: api.v1.UpdateNodeGroupRecommendationPolicyResponse.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 161, // 55: api.v1.CreateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 56: api.v1.CreateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 57: api.v1.GetWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 58: api.v1.ListWorkloadRecommendationPoliciesResponse.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 59: api.v1.UpdateWorkloadRecommendationPolicyRequest.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 161, // 60: api.v1.UpdateWorkloadRecommendationPolicyResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 409, // 61: api.v1.AttachWorkloadRecommendationPolicyRequest.kind:type_name -> api.v1.K8sObjectKind - 31, // 62: api.v1.AttachWorkloadRecommendationPoliciesRequest.workloads:type_name -> api.v1.WorkloadIdentifier - 74, // 63: api.v1.AttachWorkloadRecommendationPoliciesResponse.attachments:type_name -> api.v1.WorkloadPolicyAttachment - 409, // 64: api.v1.WorkloadPolicyAttachment.kind:type_name -> api.v1.K8sObjectKind - 406, // 65: api.v1.WorkloadPolicyAttachment.created_at:type_name -> google.protobuf.Timestamp - 406, // 66: api.v1.WorkloadPolicyAttachment.updated_at:type_name -> google.protobuf.Timestamp - 411, // 67: api.v1.WorkloadPolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 68: api.v1.WorkloadPolicyTarget.workload_selector:type_name -> api.v1.LabelSelector - 409, // 69: api.v1.WorkloadPolicyTarget.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 70: api.v1.WorkloadPolicyTarget.name_pattern:type_name -> api.v1.RegexPattern - 411, // 71: api.v1.WorkloadPolicyTarget.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 72: api.v1.WorkloadPolicyTarget.namespace_pattern:type_name -> api.v1.RegexPattern - 406, // 73: api.v1.WorkloadPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 74: api.v1.WorkloadPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 411, // 75: api.v1.CreateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 76: api.v1.CreateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 77: api.v1.CreateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 78: api.v1.CreateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 79: api.v1.CreateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 80: api.v1.CreateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 75, // 81: api.v1.CreateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 75, // 82: api.v1.GetWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 75, // 83: api.v1.ListWorkloadPolicyTargetsResponse.targets:type_name -> api.v1.WorkloadPolicyTarget - 411, // 84: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 85: api.v1.UpdateWorkloadPolicyTargetRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 86: api.v1.UpdateWorkloadPolicyTargetRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 87: api.v1.UpdateWorkloadPolicyTargetRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 88: api.v1.UpdateWorkloadPolicyTargetRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 89: api.v1.UpdateWorkloadPolicyTargetRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 75, // 90: api.v1.UpdateWorkloadPolicyTargetResponse.target:type_name -> api.v1.WorkloadPolicyTarget - 411, // 91: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 92: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 93: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 94: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 95: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 96: api.v1.PreviewWorkloadPolicyTargetMatchesRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 413, // 97: api.v1.PreviewWorkloadPolicyTargetMatchesResponse.matched_workloads:type_name -> api.v1.WorkloadItem - 411, // 98: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_selector:type_name -> api.v1.LabelSelector - 411, // 99: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.workload_selector:type_name -> api.v1.LabelSelector - 409, // 100: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 101: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.name_pattern:type_name -> api.v1.RegexPattern - 411, // 102: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.annotation_selector:type_name -> api.v1.LabelSelector - 412, // 103: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest.namespace_pattern:type_name -> api.v1.RegexPattern - 171, // 104: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.WorkloadRecommendation - 413, // 105: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_items:type_name -> api.v1.WorkloadItem - 375, // 106: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.workload_percentiles:type_name -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry - 414, // 107: api.v1.WorkloadPercentileSummary.cpu_usage:type_name -> api.v1.MetricPercentiles - 414, // 108: api.v1.WorkloadPercentileSummary.memory_usage:type_name -> api.v1.MetricPercentiles - 414, // 109: api.v1.WorkloadPercentileSummary.gpu_usage:type_name -> api.v1.MetricPercentiles - 414, // 110: api.v1.WorkloadPercentileSummary.cpu_request:type_name -> api.v1.MetricPercentiles - 414, // 111: api.v1.WorkloadPercentileSummary.memory_request:type_name -> api.v1.MetricPercentiles - 406, // 112: api.v1.NodeGroupPolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 113: api.v1.NodeGroupPolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 95, // 114: api.v1.CreateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 115: api.v1.GetNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 116: api.v1.ListNodeGroupPolicyTargetsResponse.targets:type_name -> api.v1.NodeGroupPolicyTarget - 95, // 117: api.v1.UpdateNodeGroupPolicyTargetResponse.target:type_name -> api.v1.NodeGroupPolicyTarget - 415, // 118: api.v1.PreviewNodeGroupPolicyTargetMatchesResponse.matched_node_groups:type_name -> api.v1.NodeGroup - 169, // 119: api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse.recommendations:type_name -> api.v1.NodeGroupRecommendation - 164, // 120: api.v1.BalanceGetRecommendationsRequest.register:type_name -> api.v1.BalanceRegisterRequest - 166, // 121: api.v1.BalanceGetRecommendationsRequest.apply:type_name -> api.v1.BalanceApplyRecommendationResponse - 141, // 122: api.v1.BalanceGetRecommendationsRequest.workload_meta:type_name -> api.v1.ReconcileWorkload - 171, // 123: api.v1.BalanceGetRecommendationsRequest.in_cluster_recommendation:type_name -> api.v1.WorkloadRecommendation - 143, // 124: api.v1.BalanceGetRecommendationsRequest.operator_health:type_name -> api.v1.OperatorHealth - 144, // 125: api.v1.BalanceGetRecommendationsRequest.agent_health:type_name -> api.v1.AgentHealth - 169, // 126: api.v1.BalanceGetRecommendationsResponse.node_group_recommendation:type_name -> api.v1.NodeGroupRecommendation - 171, // 127: api.v1.BalanceGetRecommendationsResponse.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 286, // 128: api.v1.BalanceGetRecommendationsResponse.node_recommendation:type_name -> api.v1.NodeRecommendation - 114, // 129: api.v1.BalanceGetRecommendationsResponse.batch_node_group_recommendations:type_name -> api.v1.BatchNodeGroupRecommendations - 115, // 130: api.v1.BalanceGetRecommendationsResponse.batch_workload_recommendations:type_name -> api.v1.BatchWorkloadRecommendations - 129, // 131: api.v1.BalanceGetRecommendationsResponse.kind_to_namespace_to_workloads:type_name -> api.v1.WorkloadWithActiveRecommendations - 142, // 132: api.v1.BalanceGetRecommendationsResponse.workload_reconcile_response:type_name -> api.v1.ReconcileResponse - 369, // 133: api.v1.BalanceGetRecommendationsResponse.workload_profile_manifest:type_name -> api.v1.WorkloadProfileManifest - 370, // 134: api.v1.BalanceGetRecommendationsResponse.batch_workload_profiles:type_name -> api.v1.BatchWorkloadProfiles - 146, // 135: api.v1.BalanceGetRecommendationsResponse.health_update_requested:type_name -> api.v1.HealthReport - 131, // 136: api.v1.BalanceGetRecommendationsResponse.batch_generic_resource_recommendations:type_name -> api.v1.BatchGenericResourceRecommendations - 132, // 137: api.v1.BalanceGetRecommendationsResponse.batch_pvc_storage_recommendations:type_name -> api.v1.BatchPvcStorageRecommendations - 128, // 138: api.v1.BalanceGetRecommendationsResponse.batch_workload_rules:type_name -> api.v1.BatchWorkloadRules - 284, // 139: api.v1.BalanceGetRecommendationsResponse.karpenter_settings:type_name -> api.v1.KarpenterSettingsRecommendation - 169, // 140: api.v1.BatchNodeGroupRecommendations.recommendations:type_name -> api.v1.NodeGroupRecommendation - 171, // 141: api.v1.BatchWorkloadRecommendations.recommendations:type_name -> api.v1.WorkloadRecommendation - 117, // 142: api.v1.WorkloadRule.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 143: api.v1.WorkloadRule.memory_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 144: api.v1.WorkloadRule.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 122, // 145: api.v1.WorkloadRule.hpa_rule:type_name -> api.v1.HPARuleConfig - 7, // 146: api.v1.WorkloadRule.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 147: api.v1.WorkloadRule.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 123, // 148: api.v1.WorkloadRule.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 125, // 149: api.v1.WorkloadRule.percentiles:type_name -> api.v1.ResourcePercentiles - 127, // 150: api.v1.WorkloadRule.classification:type_name -> api.v1.WorkloadClassification - 406, // 151: api.v1.WorkloadRule.created_at:type_name -> google.protobuf.Timestamp - 406, // 152: api.v1.WorkloadRule.updated_at:type_name -> google.protobuf.Timestamp - 121, // 153: api.v1.WorkloadRule.containers:type_name -> api.v1.ContainerResourceRuleConfig - 376, // 154: api.v1.HPAMetricTrigger.metadata:type_name -> api.v1.HPAMetricTrigger.MetadataEntry - 120, // 155: api.v1.ContainerResourceRuleConfig.cpu_rule:type_name -> api.v1.ContainerResourceConfig - 120, // 156: api.v1.ContainerResourceRuleConfig.memory_rule:type_name -> api.v1.ContainerResourceConfig - 120, // 157: api.v1.ContainerResourceRuleConfig.gpu_rule:type_name -> api.v1.ContainerResourceConfig - 13, // 158: api.v1.HPARuleConfig.primary_metric:type_name -> api.v1.HPAMetricType - 118, // 159: api.v1.HPARuleConfig.metrics:type_name -> api.v1.HPAMetricTrigger - 416, // 160: api.v1.HPARuleConfig.behavior:type_name -> api.v1.HPABehavior - 119, // 161: api.v1.HPARuleConfig.fallback:type_name -> api.v1.HPAFallback - 124, // 162: api.v1.ResourcePercentiles.cpu:type_name -> api.v1.PercentileValues - 124, // 163: api.v1.ResourcePercentiles.memory:type_name -> api.v1.PercentileValues - 124, // 164: api.v1.ResourcePercentiles.network:type_name -> api.v1.PercentileValues - 124, // 165: api.v1.ResourcePercentiles.disk:type_name -> api.v1.PercentileValues - 126, // 166: api.v1.WorkloadClassification.burstiness:type_name -> api.v1.BurstinessRatios - 116, // 167: api.v1.BatchWorkloadRules.rules:type_name -> api.v1.WorkloadRule - 31, // 168: api.v1.WorkloadWithActiveRecommendations.workloads:type_name -> api.v1.WorkloadIdentifier - 406, // 169: api.v1.GenericResourceRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 4, // 170: api.v1.GenericResourceRecommendation.status:type_name -> api.v1.RecommendationStatus - 406, // 171: api.v1.GenericResourceRecommendation.created_at:type_name -> google.protobuf.Timestamp - 406, // 172: api.v1.GenericResourceRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 130, // 173: api.v1.BatchGenericResourceRecommendations.recommendations:type_name -> api.v1.GenericResourceRecommendation - 316, // 174: api.v1.BatchPvcStorageRecommendations.recommendations:type_name -> api.v1.PvcStorageRecommendation - 31, // 175: api.v1.GeneratePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 176: api.v1.GeneratePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 31, // 177: api.v1.GenerateAndCreatePodDisruptionBudgetRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 178: api.v1.GenerateAndCreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 130, // 179: api.v1.CreatePodDisruptionBudgetRequest.recommendation:type_name -> api.v1.GenericResourceRecommendation - 130, // 180: api.v1.CreatePodDisruptionBudgetResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 31, // 181: api.v1.GetPDBRecommendationForWorkloadRequest.workload:type_name -> api.v1.WorkloadIdentifier - 130, // 182: api.v1.GetPDBRecommendationForWorkloadResponse.recommendation:type_name -> api.v1.GenericResourceRecommendation - 409, // 183: api.v1.ReconcileWorkload.kind:type_name -> api.v1.K8sObjectKind - 0, // 184: api.v1.ReconcileResponse.status:type_name -> api.v1.ReconcileStatus - 171, // 185: api.v1.ReconcileResponse.updated_recommendation:type_name -> api.v1.WorkloadRecommendation - 377, // 186: api.v1.AgentHealth.node_name_to_agent:type_name -> api.v1.AgentHealth.NodeNameToAgentEntry - 148, // 187: api.v1.NodeStats.metrics:type_name -> api.v1.NodeMetric - 406, // 188: api.v1.NodeMetric.timestamp:type_name -> google.protobuf.Timestamp - 409, // 189: api.v1.ContainerStats.kind:type_name -> api.v1.K8sObjectKind - 150, // 190: api.v1.ContainerStats.metrics:type_name -> api.v1.ContainerMetric - 151, // 191: api.v1.ContainerStats.summarized_metrics:type_name -> api.v1.ContainerSummarizedMetric - 406, // 192: api.v1.ContainerMetric.timestamp:type_name -> google.protobuf.Timestamp - 406, // 193: api.v1.ContainerSummarizedMetric.timestamp:type_name -> google.protobuf.Timestamp - 152, // 194: api.v1.ContainerSummarizedMetric.cpu:type_name -> api.v1.Metric - 152, // 195: api.v1.ContainerSummarizedMetric.memory:type_name -> api.v1.Metric - 152, // 196: api.v1.ContainerSummarizedMetric.gpu:type_name -> api.v1.Metric - 152, // 197: api.v1.ContainerSummarizedMetric.gpu_vram:type_name -> api.v1.Metric - 155, // 198: api.v1.ContainerRecommendation.current_request:type_name -> api.v1.ResourceRecommendation - 155, // 199: api.v1.ContainerRecommendation.recommended_request:type_name -> api.v1.ResourceRecommendation - 155, // 200: api.v1.ContainerRecommendation.current_limit:type_name -> api.v1.ResourceRecommendation - 155, // 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 - 7, // 206: api.v1.ClusterRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 11, // 207: api.v1.ClusterRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 7, // 208: api.v1.ClusterRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 7, // 209: api.v1.NodeGroupRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 9, // 210: api.v1.NodeGroupRecommendationPolicy.detection_triggers:type_name -> api.v1.NodeGroupDetectionTrigger - 11, // 211: api.v1.NodeGroupRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 10, // 212: api.v1.NodeGroupRecommendationPolicy.actions:type_name -> api.v1.NodeGroupActionsAllowed - 7, // 213: api.v1.NodeGroupRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 13, // 214: api.v1.HorizontalScalingOptimizationTarget.primary_metric:type_name -> api.v1.HPAMetricType - 7, // 215: api.v1.WorkloadRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 8, // 216: api.v1.WorkloadRecommendationPolicy.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 11, // 217: api.v1.WorkloadRecommendationPolicy.recommendation_mode:type_name -> api.v1.RecommendationMode - 159, // 218: api.v1.WorkloadRecommendationPolicy.cpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 219: api.v1.WorkloadRecommendationPolicy.memory_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 220: api.v1.WorkloadRecommendationPolicy.gpu_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 159, // 221: api.v1.WorkloadRecommendationPolicy.gpu_vram_vertical_scaling:type_name -> api.v1.VerticalScalingOptimizationTarget - 160, // 222: api.v1.WorkloadRecommendationPolicy.horizontal_scaling:type_name -> api.v1.HorizontalScalingOptimizationTarget - 7, // 223: api.v1.WorkloadRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 123, // 224: api.v1.WorkloadRecommendationPolicy.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 406, // 225: api.v1.WorkloadRecommendationPolicy.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 226: api.v1.GetPolicyRecommendedDefaultsRequest.recommendation_mode:type_name -> api.v1.RecommendationMode - 161, // 227: api.v1.GetPolicyRecommendedDefaultsResponse.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 165, // 228: api.v1.BalanceRegisterRequest.features:type_name -> api.v1.BalanceFeatures - 12, // 229: api.v1.BalanceApplyRecommendationResponse.type:type_name -> api.v1.RecommendationType - 167, // 230: api.v1.BalanceApplyRecommendationResponse.live_migration_result:type_name -> api.v1.LiveMigrationResult - 406, // 231: api.v1.NodeGroupRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 158, // 232: api.v1.NodeGroupRecommendation.policy:type_name -> api.v1.NodeGroupRecommendationPolicy - 417, // 233: api.v1.CostImpact.current_cost_per_month:type_name -> google.type.Money - 417, // 234: api.v1.CostImpact.recommended_cost_per_month:type_name -> google.type.Money - 417, // 235: api.v1.CostImpact.current_cpu_cost_per_month:type_name -> google.type.Money - 417, // 236: api.v1.CostImpact.current_memory_cost_per_month:type_name -> google.type.Money - 417, // 237: api.v1.CostImpact.recommended_cpu_cost_per_month:type_name -> google.type.Money - 417, // 238: api.v1.CostImpact.recommended_memory_cost_per_month:type_name -> google.type.Money - 417, // 239: api.v1.CostImpact.current_gpu_cost_per_month:type_name -> google.type.Money - 417, // 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 - 409, // 242: api.v1.WorkloadRecommendation.kind:type_name -> api.v1.K8sObjectKind - 153, // 243: api.v1.WorkloadRecommendation.container_recommendations:type_name -> api.v1.ContainerRecommendation - 406, // 244: api.v1.WorkloadRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 154, // 245: api.v1.WorkloadRecommendation.keda_scaled_object_recommendation:type_name -> api.v1.KedaScaledObjectRecommendation - 411, // 246: api.v1.WorkloadRecommendation.label_selector:type_name -> api.v1.LabelSelector - 3, // 247: api.v1.WorkloadRecommendation.del_prop:type_name -> api.v1.LiveMigDeletionPropagation - 156, // 248: api.v1.WorkloadRecommendation.current_tolerations:type_name -> api.v1.Toleration - 156, // 249: api.v1.WorkloadRecommendation.recommended_tolerations:type_name -> api.v1.Toleration - 4, // 250: api.v1.WorkloadRecommendation.status:type_name -> api.v1.RecommendationStatus - 161, // 251: api.v1.WorkloadRecommendation.policy:type_name -> api.v1.WorkloadRecommendationPolicy - 75, // 252: api.v1.WorkloadRecommendation.policy_target:type_name -> api.v1.WorkloadPolicyTarget - 1, // 253: api.v1.WorkloadRecommendation.replica_count_action:type_name -> api.v1.ActionToTake - 167, // 254: api.v1.WorkloadRecommendation.live_migration_result:type_name -> api.v1.LiveMigrationResult - 170, // 255: api.v1.WorkloadRecommendation.cost_impact:type_name -> api.v1.CostImpact - 158, // 256: api.v1.GetAttachedNodeGroupPoliciesResponse.policies:type_name -> api.v1.NodeGroupRecommendationPolicy - 409, // 257: api.v1.GetAttachedWorkloadPoliciesRequest.kind:type_name -> api.v1.K8sObjectKind - 176, // 258: api.v1.GetAttachedWorkloadPoliciesResponse.relevant_policies:type_name -> api.v1.WorkloadRecommendationPolicyGroup - 378, // 259: api.v1.GetAttachedWorkloadPoliciesResponse.policy_id_to_matched_targets:type_name -> api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry - 161, // 260: api.v1.WorkloadRecommendationPolicyGroup.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 75, // 261: api.v1.WorkloadPolicyTargetGroup.targets:type_name -> api.v1.WorkloadPolicyTarget - 31, // 262: api.v1.WorkloadIdentifiers.workloads:type_name -> api.v1.WorkloadIdentifier - 31, // 263: api.v1.WorkloadPolicies.workload:type_name -> api.v1.WorkloadIdentifier - 161, // 264: api.v1.WorkloadPolicies.policies:type_name -> api.v1.WorkloadRecommendationPolicy - 379, // 265: api.v1.ListAttachedWorkloadPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry - 380, // 266: api.v1.ListAttachedWorkloadPoliciesResponse.workload_map:type_name -> api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry - 381, // 267: api.v1.ListAttachedNodeGroupPoliciesResponse.policy_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry - 382, // 268: api.v1.ListAttachedNodeGroupPoliciesResponse.node_group_map:type_name -> api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry - 409, // 269: api.v1.RecommendationAppliedRequest.kind:type_name -> api.v1.K8sObjectKind - 409, // 270: api.v1.ApplyRecommendationRequest.kind:type_name -> api.v1.K8sObjectKind - 171, // 271: api.v1.ApplyRecommendationRequest.workload_recommendation:type_name -> api.v1.WorkloadRecommendation - 406, // 272: api.v1.RetrieveSavingsForWorkloadRequest.start_time:type_name -> google.protobuf.Timestamp - 406, // 273: api.v1.RetrieveSavingsForWorkloadRequest.end_time:type_name -> google.protobuf.Timestamp - 418, // 274: api.v1.RetrieveSavingsForWorkloadResponse.savings:type_name -> api.v1.SavingsTimeSeries - 419, // 275: api.v1.RetrieveSavingsForWorkloadResponse.get_workload_resp:type_name -> api.v1.GetWorkloadResponse - 219, // 276: api.v1.CreateNodePoliciesRequest.policies:type_name -> api.v1.NodePolicy - 219, // 277: api.v1.CreateNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 219, // 278: api.v1.SuggestedNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 219, // 279: api.v1.GenerateNodePoliciesFromKarpenterResponse.policies:type_name -> api.v1.NodePolicy - 240, // 280: api.v1.GenerateNodePoliciesFromKarpenterResponse.targets:type_name -> api.v1.NodePolicyTarget - 219, // 281: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.policies:type_name -> api.v1.NodePolicy - 240, // 282: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.targets:type_name -> api.v1.NodePolicyTarget - 212, // 283: api.v1.GenerateNodePoliciesFromNodeGroupsResponse.warnings:type_name -> api.v1.WorkloadCompatibilityWarning - 406, // 284: api.v1.GetMigrationStateResponse.created_at:type_name -> google.protobuf.Timestamp - 406, // 285: api.v1.GetMigrationStateResponse.updated_at:type_name -> google.protobuf.Timestamp - 406, // 286: api.v1.NodePoolValidationReport.reported_at:type_name -> google.protobuf.Timestamp - 210, // 287: api.v1.GetNodePoolValidationsResponse.validations:type_name -> api.v1.NodePoolValidationReport - 219, // 288: api.v1.ListNodePoliciesResponse.policies:type_name -> api.v1.NodePolicy - 219, // 289: api.v1.UpdateNodePolicyRequest.policy:type_name -> api.v1.NodePolicy - 219, // 290: api.v1.UpdateNodePolicyResponse.policy:type_name -> api.v1.NodePolicy - 411, // 291: api.v1.NodePolicy.instance_categories:type_name -> api.v1.LabelSelector - 411, // 292: api.v1.NodePolicy.instance_families:type_name -> api.v1.LabelSelector - 411, // 293: api.v1.NodePolicy.instance_cpus:type_name -> api.v1.LabelSelector - 411, // 294: api.v1.NodePolicy.instance_hypervisors:type_name -> api.v1.LabelSelector - 411, // 295: api.v1.NodePolicy.instance_generations:type_name -> api.v1.LabelSelector - 411, // 296: api.v1.NodePolicy.instance_sizes:type_name -> api.v1.LabelSelector - 411, // 297: api.v1.NodePolicy.instance_types:type_name -> api.v1.LabelSelector - 411, // 298: api.v1.NodePolicy.instance_local_nvme:type_name -> api.v1.LabelSelector - 411, // 299: api.v1.NodePolicy.zones:type_name -> api.v1.LabelSelector - 411, // 300: api.v1.NodePolicy.architectures:type_name -> api.v1.LabelSelector - 411, // 301: api.v1.NodePolicy.capacity_types:type_name -> api.v1.LabelSelector - 411, // 302: api.v1.NodePolicy.operating_systems:type_name -> api.v1.LabelSelector - 383, // 303: api.v1.NodePolicy.labels:type_name -> api.v1.NodePolicy.LabelsEntry - 244, // 304: api.v1.NodePolicy.taints:type_name -> api.v1.Taint - 246, // 305: api.v1.NodePolicy.disruption:type_name -> api.v1.DisruptionPolicy - 247, // 306: api.v1.NodePolicy.limits:type_name -> api.v1.ResourceLimits - 244, // 307: api.v1.NodePolicy.startup_taints:type_name -> api.v1.Taint - 248, // 308: api.v1.NodePolicy.aws:type_name -> api.v1.AWSNodeClassSpec - 272, // 309: api.v1.NodePolicy.gcp:type_name -> api.v1.GCPNodeClassSpec - 275, // 310: api.v1.NodePolicy.azure:type_name -> api.v1.AzureNodeClassSpec - 283, // 311: api.v1.NodePolicy.oci:type_name -> api.v1.OCINodeClassSpec - 420, // 312: api.v1.NodePolicy.cloud_provider:type_name -> api.v1.CloudProvider - 243, // 313: api.v1.NodePolicy.zonal_shift:type_name -> api.v1.ZonalShiftConfig - 285, // 314: api.v1.NodePolicy.raw:type_name -> api.v1.RawKarpenterSpec - 406, // 315: api.v1.NodePolicy.created_at:type_name -> google.protobuf.Timestamp - 406, // 316: api.v1.NodePolicy.updated_at:type_name -> google.protobuf.Timestamp - 406, // 317: api.v1.NodePolicy.deleted_at:type_name -> google.protobuf.Timestamp - 219, // 318: api.v1.PreviewNodeRecommendationConfigRequest.policies:type_name -> api.v1.NodePolicy - 222, // 319: api.v1.PreviewNodeRecommendationConfigResponse.nrc:type_name -> api.v1.NodeRecommendationConfig - 4, // 320: api.v1.NodeRecommendationConfig.status:type_name -> api.v1.RecommendationStatus - 406, // 321: api.v1.NodeRecommendationConfig.created_at:type_name -> google.protobuf.Timestamp - 406, // 322: api.v1.NodeRecommendationConfig.updated_at:type_name -> google.protobuf.Timestamp - 406, // 323: api.v1.NodeRecommendationConfig.deleted_at:type_name -> google.protobuf.Timestamp - 384, // 324: api.v1.SuggestedKarpenterConfigResponse.ng_to_original:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry - 385, // 325: api.v1.SuggestedKarpenterConfigResponse.ng_to_suggested:type_name -> api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry - 227, // 326: api.v1.GetAvailableKindsByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 5, // 327: api.v1.SearchResourcesByTargetingFiltersRequest.target_filter_type:type_name -> api.v1.TargetFilterType - 227, // 328: api.v1.SearchResourcesByTargetingFiltersRequest.target_filters:type_name -> api.v1.TargetFilters - 409, // 329: api.v1.TargetFilters.kind_filter:type_name -> api.v1.K8sObjectKind - 412, // 330: api.v1.TargetFilters.name_pattern:type_name -> api.v1.RegexPattern - 412, // 331: api.v1.TargetFilters.namespace_pattern:type_name -> api.v1.RegexPattern - 409, // 332: api.v1.GetAvailableKindsByTargetingFiltersResponse.kinds:type_name -> api.v1.K8sObjectKind - 230, // 333: api.v1.SearchResourcesByTargetingFiltersResponse.namespaces:type_name -> api.v1.NamespaceSearchResult - 231, // 334: api.v1.SearchResourcesByTargetingFiltersResponse.workloads:type_name -> api.v1.WorkloadSearchResult - 232, // 335: api.v1.SearchResourcesByTargetingFiltersResponse.node_groups:type_name -> api.v1.NodeGroupSearchResult - 233, // 336: api.v1.SearchResourcesByTargetingFiltersResponse.labels:type_name -> api.v1.LabelSearchResult - 240, // 337: api.v1.CreateNodePolicyTargetsRequest.targets:type_name -> api.v1.NodePolicyTarget - 240, // 338: api.v1.CreateNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 240, // 339: api.v1.ListNodePolicyTargetsResponse.targets:type_name -> api.v1.NodePolicyTarget - 240, // 340: api.v1.UpdateNodePolicyTargetRequest.target:type_name -> api.v1.NodePolicyTarget - 240, // 341: api.v1.UpdateNodePolicyTargetResponse.target:type_name -> api.v1.NodePolicyTarget - 406, // 342: api.v1.NodePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 343: api.v1.NodePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 406, // 344: api.v1.NodePolicyTarget.deleted_at:type_name -> google.protobuf.Timestamp - 242, // 345: api.v1.NodePolicyTarget.status:type_name -> api.v1.NodePolicyTargetStatus - 406, // 346: api.v1.NodePolicyCondition.last_transition_time:type_name -> google.protobuf.Timestamp - 241, // 347: api.v1.NodePolicyTargetStatus.conditions:type_name -> api.v1.NodePolicyCondition - 245, // 348: api.v1.DisruptionPolicy.budgets:type_name -> api.v1.DisruptionBudget - 264, // 349: api.v1.AWSNodeClassSpec.subnet_selector_terms:type_name -> api.v1.SubnetSelectorTerm - 265, // 350: api.v1.AWSNodeClassSpec.security_group_selector_terms:type_name -> api.v1.SecurityGroupSelectorTerm - 266, // 351: api.v1.AWSNodeClassSpec.capacity_reservation_selector_terms:type_name -> api.v1.CapacityReservationSelectorTerm - 267, // 352: api.v1.AWSNodeClassSpec.ami_selector_terms:type_name -> api.v1.AMISelectorTerm - 386, // 353: api.v1.AWSNodeClassSpec.tags:type_name -> api.v1.AWSNodeClassSpec.TagsEntry - 268, // 354: api.v1.AWSNodeClassSpec.kubelet:type_name -> api.v1.KubeletConfiguration - 269, // 355: api.v1.AWSNodeClassSpec.block_device_mappings:type_name -> api.v1.BlockDeviceMapping - 6, // 356: api.v1.AWSNodeClassSpec.instance_store_policy:type_name -> api.v1.InstanceStorePolicy - 271, // 357: api.v1.AWSNodeClassSpec.metadata_options:type_name -> api.v1.MetadataOptions - 253, // 358: api.v1.GetInstanceFamiliesResponse.instance_families:type_name -> api.v1.InstanceFamily - 254, // 359: api.v1.GetInstanceSizesResponse.instance_sizes:type_name -> api.v1.InstanceSize - 255, // 360: api.v1.GetInstanceCategoriesResponse.instance_categories:type_name -> api.v1.InstanceCategory - 256, // 361: api.v1.GetInstanceCPUsResponse.instance_cpus:type_name -> api.v1.InstanceCPU - 257, // 362: api.v1.GetInstanceTypeNamesResponse.instance_types:type_name -> api.v1.InstanceTypeName - 387, // 363: api.v1.SubnetSelectorTerm.tags:type_name -> api.v1.SubnetSelectorTerm.TagsEntry - 388, // 364: api.v1.SecurityGroupSelectorTerm.tags:type_name -> api.v1.SecurityGroupSelectorTerm.TagsEntry - 389, // 365: api.v1.CapacityReservationSelectorTerm.tags:type_name -> api.v1.CapacityReservationSelectorTerm.TagsEntry - 390, // 366: api.v1.AMISelectorTerm.tags:type_name -> api.v1.AMISelectorTerm.TagsEntry - 391, // 367: api.v1.KubeletConfiguration.system_reserved:type_name -> api.v1.KubeletConfiguration.SystemReservedEntry - 392, // 368: api.v1.KubeletConfiguration.kube_reserved:type_name -> api.v1.KubeletConfiguration.KubeReservedEntry - 393, // 369: api.v1.KubeletConfiguration.eviction_hard:type_name -> api.v1.KubeletConfiguration.EvictionHardEntry - 394, // 370: api.v1.KubeletConfiguration.eviction_soft:type_name -> api.v1.KubeletConfiguration.EvictionSoftEntry - 395, // 371: api.v1.KubeletConfiguration.eviction_soft_grace_period:type_name -> api.v1.KubeletConfiguration.EvictionSoftGracePeriodEntry - 270, // 372: api.v1.BlockDeviceMapping.ebs:type_name -> api.v1.BlockDevice - 273, // 373: api.v1.GCPNodeClassSpec.image_selector_terms:type_name -> api.v1.GCPImageSelectorTerm - 268, // 374: api.v1.GCPNodeClassSpec.kubelet_configuration:type_name -> api.v1.KubeletConfiguration - 396, // 375: api.v1.GCPNodeClassSpec.labels:type_name -> api.v1.GCPNodeClassSpec.LabelsEntry - 397, // 376: api.v1.GCPNodeClassSpec.metadata:type_name -> api.v1.GCPNodeClassSpec.MetadataEntry - 274, // 377: api.v1.GCPNodeClassSpec.disks:type_name -> api.v1.GCPDisk - 398, // 378: api.v1.AzureNodeClassSpec.tags:type_name -> api.v1.AzureNodeClassSpec.TagsEntry - 276, // 379: api.v1.AzureNodeClassSpec.kubelet:type_name -> api.v1.AzureKubeletConfiguration - 277, // 380: api.v1.OCINodeClassSpec.image_selector:type_name -> api.v1.OCIImageSelectorTerm - 278, // 381: api.v1.OCINodeClassSpec.subnet_selector:type_name -> api.v1.OCISubnetSelectorTerm - 279, // 382: api.v1.OCINodeClassSpec.security_group_selector:type_name -> api.v1.OCISecurityGroupSelectorTerm - 399, // 383: api.v1.OCINodeClassSpec.meta_data:type_name -> api.v1.OCINodeClassSpec.MetaDataEntry - 400, // 384: api.v1.OCINodeClassSpec.tags:type_name -> api.v1.OCINodeClassSpec.TagsEntry - 401, // 385: api.v1.OCINodeClassSpec.free_form_tags:type_name -> api.v1.OCINodeClassSpec.FreeFormTagsEntry - 280, // 386: api.v1.OCINodeClassSpec.boot_config:type_name -> api.v1.OCIBootConfig - 281, // 387: api.v1.OCINodeClassSpec.launch_options:type_name -> api.v1.OCILaunchOptions - 282, // 388: api.v1.OCINodeClassSpec.block_devices:type_name -> api.v1.OCIVolumeAttributes - 287, // 389: api.v1.NodeRecommendation.aws:type_name -> api.v1.AWSKarpenterSpec - 288, // 390: api.v1.NodeRecommendation.aks:type_name -> api.v1.AKSKarpenterSpec - 292, // 391: api.v1.NodeRecommendation.gcp:type_name -> api.v1.GCPKarpenterSpec - 294, // 392: api.v1.NodeRecommendation.oci:type_name -> api.v1.OCIKarpenterSpec - 289, // 393: api.v1.AWSKarpenterSpec.np:type_name -> api.v1.NodePool - 290, // 394: api.v1.AWSKarpenterSpec.ec2nc:type_name -> api.v1.EC2NodeClass - 289, // 395: api.v1.AKSKarpenterSpec.np:type_name -> api.v1.NodePool - 291, // 396: api.v1.AKSKarpenterSpec.aksnc:type_name -> api.v1.AKSNodeClass - 289, // 397: api.v1.GCPKarpenterSpec.np:type_name -> api.v1.NodePool - 293, // 398: api.v1.GCPKarpenterSpec.node_classes:type_name -> api.v1.GCENodeClass - 289, // 399: api.v1.OCIKarpenterSpec.np:type_name -> api.v1.NodePool - 295, // 400: api.v1.OCIKarpenterSpec.node_classes:type_name -> api.v1.OCINodeClass - 7, // 401: api.v1.StorageRecommendationPolicy.action_trigger:type_name -> api.v1.ActionTrigger - 7, // 402: api.v1.StorageRecommendationPolicy.action_triggers:type_name -> api.v1.ActionTrigger - 406, // 403: api.v1.StorageRecommendationPolicy.created_at:type_name -> google.protobuf.Timestamp - 406, // 404: api.v1.StorageRecommendationPolicy.updated_at:type_name -> google.protobuf.Timestamp - 7, // 405: api.v1.CreateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 296, // 406: api.v1.CreateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 296, // 407: api.v1.GetStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 296, // 408: api.v1.ListStorageRecommendationPoliciesResponse.policies:type_name -> api.v1.StorageRecommendationPolicy - 7, // 409: api.v1.UpdateStorageRecommendationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 296, // 410: api.v1.UpdateStorageRecommendationPolicyResponse.policy:type_name -> api.v1.StorageRecommendationPolicy - 411, // 411: api.v1.StoragePolicyTarget.namespace_selector:type_name -> api.v1.LabelSelector - 406, // 412: api.v1.StoragePolicyTarget.created_at:type_name -> google.protobuf.Timestamp - 406, // 413: api.v1.StoragePolicyTarget.updated_at:type_name -> google.protobuf.Timestamp - 411, // 414: api.v1.CreateStoragePolicyTargetRequest.namespace_selector:type_name -> api.v1.LabelSelector - 307, // 415: api.v1.CreateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 307, // 416: api.v1.ListStoragePolicyTargetsResponse.targets:type_name -> api.v1.StoragePolicyTarget - 307, // 417: api.v1.UpdateStoragePolicyTargetRequest.target:type_name -> api.v1.StoragePolicyTarget - 307, // 418: api.v1.UpdateStoragePolicyTargetResponse.target:type_name -> api.v1.StoragePolicyTarget - 4, // 419: api.v1.PvcStorageRecommendation.status:type_name -> api.v1.RecommendationStatus - 406, // 420: api.v1.PvcStorageRecommendation.timestamp:type_name -> google.protobuf.Timestamp - 406, // 421: api.v1.PvcStorageRecommendation.applied_at:type_name -> google.protobuf.Timestamp - 406, // 422: api.v1.PvcStorageRecommendation.created_at:type_name -> google.protobuf.Timestamp - 406, // 423: api.v1.PvcStorageRecommendation.updated_at:type_name -> google.protobuf.Timestamp - 14, // 424: api.v1.PvcStorageRecommendation.operation_type:type_name -> api.v1.PvcOperationType - 316, // 425: api.v1.GetPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 408, // 426: api.v1.ListPvcStorageRecommendationsRequest.pagination:type_name -> api.v1.Pagination - 316, // 427: api.v1.ListPvcStorageRecommendationsResponse.recommendations:type_name -> api.v1.PvcStorageRecommendation - 408, // 428: api.v1.ListPvcStorageRecommendationsResponse.pagination:type_name -> api.v1.Pagination - 316, // 429: api.v1.GeneratePvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 316, // 430: api.v1.PreviewPvcStorageRecommendationResponse.recommendation:type_name -> api.v1.PvcStorageRecommendation - 406, // 431: api.v1.WorkloadRuleOOMEvent.timestamp:type_name -> google.protobuf.Timestamp - 406, // 432: api.v1.WorkloadRuleOOMEvent.created_at:type_name -> google.protobuf.Timestamp - 325, // 433: api.v1.ListWorkloadRuleOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 325, // 434: api.v1.ListWorkloadOOMEventsResponse.events:type_name -> api.v1.WorkloadRuleOOMEvent - 406, // 435: api.v1.WorkloadRuleCPUThrottleEvent.timestamp:type_name -> google.protobuf.Timestamp - 406, // 436: api.v1.WorkloadRuleCPUThrottleEvent.created_at:type_name -> google.protobuf.Timestamp - 330, // 437: api.v1.ListWorkloadRuleCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 330, // 438: api.v1.ListWorkloadCPUThrottleEventsResponse.events:type_name -> api.v1.WorkloadRuleCPUThrottleEvent - 406, // 439: api.v1.WorkloadOptimizationPolicyProto.created_at:type_name -> google.protobuf.Timestamp - 406, // 440: api.v1.WorkloadOptimizationPolicyProto.updated_at:type_name -> google.protobuf.Timestamp - 402, // 441: api.v1.WorkloadOptimizationPolicyProto.cluster_names:type_name -> api.v1.WorkloadOptimizationPolicyProto.ClusterNamesEntry - 7, // 442: api.v1.WorkloadOptimizationPolicyProto.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 443: api.v1.WorkloadOptimizationPolicyProto.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 7, // 444: api.v1.CreateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 445: api.v1.CreateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 335, // 446: api.v1.CreateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 335, // 447: api.v1.ListWorkloadOptimizationPoliciesResponse.policies:type_name -> api.v1.WorkloadOptimizationPolicyProto - 335, // 448: api.v1.GetWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 7, // 449: api.v1.UpdateWorkloadOptimizationPolicyRequest.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 450: api.v1.UpdateWorkloadOptimizationPolicyRequest.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 335, // 451: api.v1.UpdateWorkloadOptimizationPolicyResponse.policy:type_name -> api.v1.WorkloadOptimizationPolicyProto - 116, // 452: api.v1.GetWorkloadRulesByPolicyResponse.managed_rules:type_name -> api.v1.WorkloadRule - 116, // 453: api.v1.GetWorkloadRulesByPolicyResponse.excluded_rules:type_name -> api.v1.WorkloadRule - 403, // 454: api.v1.GetWorkloadRulesByPolicyResponse.cluster_names:type_name -> api.v1.GetWorkloadRulesByPolicyResponse.ClusterNamesEntry - 116, // 455: api.v1.ListWorkloadRulesResponse.rules:type_name -> api.v1.WorkloadRule - 404, // 456: api.v1.ListWorkloadRulesResponse.cluster_names:type_name -> api.v1.ListWorkloadRulesResponse.ClusterNamesEntry - 405, // 457: api.v1.ListWorkloadRulesResponse.policy_names:type_name -> api.v1.ListWorkloadRulesResponse.PolicyNamesEntry - 116, // 458: api.v1.GetWorkloadRuleByIDResponse.rule:type_name -> api.v1.WorkloadRule - 116, // 459: api.v1.GetWorkloadRuleByWorkloadResponse.rule:type_name -> api.v1.WorkloadRule - 117, // 460: api.v1.ManualRuleFields.cpu_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 461: api.v1.ManualRuleFields.memory_rule:type_name -> api.v1.ResourceRuleConfig - 117, // 462: api.v1.ManualRuleFields.gpu_rule:type_name -> api.v1.ResourceRuleConfig - 122, // 463: api.v1.ManualRuleFields.hpa_rule:type_name -> api.v1.HPARuleConfig - 123, // 464: api.v1.ManualRuleFields.emergency_response:type_name -> api.v1.EmergencyResponseConfig - 7, // 465: api.v1.ManualRuleFields.action_triggers:type_name -> api.v1.ActionTrigger - 8, // 466: api.v1.ManualRuleFields.detection_triggers:type_name -> api.v1.WorkloadDetectionTrigger - 121, // 467: api.v1.ManualRuleFields.containers:type_name -> api.v1.ContainerResourceRuleConfig - 358, // 468: api.v1.UpsertManualWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 15, // 469: api.v1.UpsertManualWorkloadRuleRequest.source:type_name -> api.v1.WorkloadRuleSource - 116, // 470: api.v1.UpsertManualWorkloadRuleResponse.rule:type_name -> api.v1.WorkloadRule - 358, // 471: api.v1.PreviewWorkloadRuleRequest.fields:type_name -> api.v1.ManualRuleFields - 116, // 472: api.v1.PreviewWorkloadRuleResponse.materialized_rule:type_name -> api.v1.WorkloadRule - 116, // 473: api.v1.PreviewWorkloadRuleResponse.engine_projection:type_name -> api.v1.WorkloadRule - 421, // 474: api.v1.PreviewWorkloadRuleResponse.profile:type_name -> api.v1.WorkloadProfileResult - 365, // 475: api.v1.BatchAutoOptimizeWorkloadsRequest.workloads:type_name -> api.v1.BatchAutoOptimizeWorkload - 116, // 476: api.v1.BatchAutoOptimizeWorkloadResult.rule:type_name -> api.v1.WorkloadRule - 367, // 477: api.v1.BatchAutoOptimizeWorkloadsResponse.results:type_name -> api.v1.BatchAutoOptimizeWorkloadResult - 422, // 478: api.v1.WorkloadProfileManifest.window:type_name -> api.v1.ProfileWindow - 423, // 479: api.v1.WorkloadProfileManifest.keys:type_name -> api.v1.ProfileKey - 406, // 480: api.v1.WorkloadProfileManifest.issued_at:type_name -> google.protobuf.Timestamp - 422, // 481: api.v1.BatchWorkloadProfiles.window:type_name -> api.v1.ProfileWindow - 424, // 482: api.v1.BatchWorkloadProfiles.profiles:type_name -> api.v1.WorkloadProfileSnapshot - 406, // 483: api.v1.NodeConfigApplyEvent.applied_at:type_name -> google.protobuf.Timestamp - 222, // 484: api.v1.GetNodeRecommendationStatusResponse.current_config:type_name -> api.v1.NodeRecommendationConfig - 371, // 485: api.v1.GetNodeRecommendationStatusResponse.history:type_name -> api.v1.NodeConfigApplyEvent - 47, // 486: api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse.WorkloadTargetMapEntry.value:type_name -> api.v1.TargetIdList - 94, // 487: api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse.WorkloadPercentilesEntry.value:type_name -> api.v1.WorkloadPercentileSummary - 145, // 488: api.v1.AgentHealth.NodeNameToAgentEntry.value:type_name -> api.v1.AgentHealthMeta - 177, // 489: api.v1.GetAttachedWorkloadPoliciesResponse.PolicyIdToMatchedTargetsEntry.value:type_name -> api.v1.WorkloadPolicyTargetGroup - 161, // 490: api.v1.ListAttachedWorkloadPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.WorkloadRecommendationPolicy - 413, // 491: api.v1.ListAttachedWorkloadPoliciesResponse.WorkloadMapEntry.value:type_name -> api.v1.WorkloadItem - 158, // 492: api.v1.ListAttachedNodeGroupPoliciesResponse.PolicyMapEntry.value:type_name -> api.v1.NodeGroupRecommendationPolicy - 184, // 493: api.v1.ListAttachedNodeGroupPoliciesResponse.NodeGroupMapEntry.value:type_name -> api.v1.NodeGroupItem - 222, // 494: api.v1.SuggestedKarpenterConfigResponse.NgToOriginalEntry.value:type_name -> api.v1.NodeRecommendationConfig - 222, // 495: api.v1.SuggestedKarpenterConfigResponse.NgToSuggestedEntry.value:type_name -> api.v1.NodeRecommendationConfig - 20, // 496: api.v1.K8sRecommendationService.GetNodeGroupStats:input_type -> api.v1.GetNodeGroupStatsRequest - 24, // 497: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:input_type -> api.v1.GetLatestNodeGroupRecommendationRequest - 26, // 498: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:input_type -> api.v1.GetLatestWorkloadRecommendationRequest - 28, // 499: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:input_type -> api.v1.GetPreviewWorkloadRecommendationRequest - 30, // 500: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:input_type -> api.v1.GetPreviewWorkloadRecommendationsRequest - 18, // 501: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:input_type -> api.v1.GetRecommendationsForWorkloadRequest - 16, // 502: api.v1.K8sRecommendationService.GetRecommendations:input_type -> api.v1.GetRecommendationsRequest - 48, // 503: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:input_type -> api.v1.CreateNodeGroupRecommendationPolicyRequest - 50, // 504: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:input_type -> api.v1.GetNodeGroupRecommendationPolicyRequest - 52, // 505: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:input_type -> api.v1.ListNodeGroupRecommendationPoliciesRequest - 54, // 506: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:input_type -> api.v1.UpdateNodeGroupRecommendationPolicyRequest - 56, // 507: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:input_type -> api.v1.DeleteNodeGroupRecommendationPolicyRequest - 58, // 508: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:input_type -> api.v1.AttachNodeGroupRecommendationPolicyRequest - 60, // 509: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:input_type -> api.v1.CreateWorkloadRecommendationPolicyRequest - 62, // 510: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:input_type -> api.v1.GetWorkloadRecommendationPolicyRequest - 162, // 511: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:input_type -> api.v1.GetPolicyRecommendedDefaultsRequest - 64, // 512: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:input_type -> api.v1.ListWorkloadRecommendationPoliciesRequest - 66, // 513: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:input_type -> api.v1.UpdateWorkloadRecommendationPolicyRequest - 68, // 514: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:input_type -> api.v1.DeleteWorkloadRecommendationPolicyRequest - 70, // 515: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:input_type -> api.v1.AttachWorkloadRecommendationPolicyRequest - 72, // 516: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:input_type -> api.v1.AttachWorkloadRecommendationPoliciesRequest - 76, // 517: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:input_type -> api.v1.CreateWorkloadPolicyTargetRequest - 78, // 518: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:input_type -> api.v1.GetWorkloadPolicyTargetRequest - 80, // 519: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:input_type -> api.v1.ListWorkloadPolicyTargetsRequest - 82, // 520: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:input_type -> api.v1.UpdateWorkloadPolicyTargetRequest - 84, // 521: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:input_type -> api.v1.DeleteWorkloadPolicyTargetRequest - 85, // 522: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:input_type -> api.v1.ToggleWorkloadPolicyTargetsRequest - 90, // 523: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:input_type -> api.v1.PreviewWorkloadPolicyTargetMatchesRequest - 92, // 524: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:input_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsRequest - 45, // 525: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:input_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsRequest - 96, // 526: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:input_type -> api.v1.CreateNodeGroupPolicyTargetRequest - 98, // 527: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:input_type -> api.v1.GetNodeGroupPolicyTargetRequest - 100, // 528: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:input_type -> api.v1.ListNodeGroupPolicyTargetsRequest - 102, // 529: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:input_type -> api.v1.UpdateNodeGroupPolicyTargetRequest - 104, // 530: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:input_type -> api.v1.DeleteNodeGroupPolicyTargetRequest - 105, // 531: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:input_type -> api.v1.ToggleNodeGroupPolicyTargetsRequest - 108, // 532: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:input_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesRequest - 110, // 533: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:input_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsRequest - 112, // 534: api.v1.K8sRecommendationService.BalanceGetRecommendations:input_type -> api.v1.BalanceGetRecommendationsRequest - 22, // 535: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:input_type -> api.v1.GetOptimalInstanceTypeForNodeGroupRequest - 172, // 536: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:input_type -> api.v1.GetAttachedNodeGroupPoliciesRequest - 174, // 537: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:input_type -> api.v1.GetAttachedWorkloadPoliciesRequest - 226, // 538: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:input_type -> api.v1.SearchResourcesByTargetingFiltersRequest - 225, // 539: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:input_type -> api.v1.GetAvailableKindsByTargetingFiltersRequest - 180, // 540: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:input_type -> api.v1.ListAttachedWorkloadPoliciesRequest - 182, // 541: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:input_type -> api.v1.ListAttachedNodeGroupPoliciesRequest - 189, // 542: api.v1.K8sRecommendationService.RecommendationEvents:input_type -> api.v1.RecommendationEventsRequest - 187, // 543: api.v1.K8sRecommendationService.ApplyRecommendation:input_type -> api.v1.ApplyRecommendationRequest - 185, // 544: api.v1.K8sRecommendationService.RecommendationApplied:input_type -> api.v1.RecommendationAppliedRequest - 191, // 545: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:input_type -> api.v1.RetrieveSavingsForWorkloadRequest - 193, // 546: api.v1.K8sRecommendationService.CreateNodePolicies:input_type -> api.v1.CreateNodePoliciesRequest - 213, // 547: api.v1.K8sRecommendationService.ListNodePolicies:input_type -> api.v1.ListNodePoliciesRequest - 215, // 548: api.v1.K8sRecommendationService.UpdateNodePolicy:input_type -> api.v1.UpdateNodePolicyRequest - 217, // 549: api.v1.K8sRecommendationService.DeleteNodePolicy:input_type -> api.v1.DeleteNodePolicyRequest - 195, // 550: api.v1.K8sRecommendationService.SuggestedNodePolicy:input_type -> api.v1.SuggestedNodePolicyRequest - 223, // 551: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:input_type -> api.v1.SuggestedKarpenterConfigRequest - 197, // 552: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:input_type -> api.v1.GenerateNodePoliciesFromKarpenterRequest - 199, // 553: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:input_type -> api.v1.GenerateNodePoliciesFromNodeGroupsRequest - 201, // 554: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:input_type -> api.v1.GetNodeAnnotationReadinessRequest - 203, // 555: api.v1.K8sRecommendationService.GetMigrationState:input_type -> api.v1.GetMigrationStateRequest - 205, // 556: api.v1.K8sRecommendationService.UpdateMigrationState:input_type -> api.v1.UpdateMigrationStateRequest - 207, // 557: api.v1.K8sRecommendationService.ReportNodePoolValidation:input_type -> api.v1.ReportNodePoolValidationRequest - 209, // 558: api.v1.K8sRecommendationService.GetNodePoolValidations:input_type -> api.v1.GetNodePoolValidationsRequest - 234, // 559: api.v1.K8sRecommendationService.CreateNodePolicyTargets:input_type -> api.v1.CreateNodePolicyTargetsRequest - 236, // 560: api.v1.K8sRecommendationService.ListNodePolicyTargets:input_type -> api.v1.ListNodePolicyTargetsRequest - 238, // 561: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:input_type -> api.v1.UpdateNodePolicyTargetRequest - 220, // 562: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:input_type -> api.v1.PreviewNodeRecommendationConfigRequest - 249, // 563: api.v1.K8sRecommendationService.GetInstanceFamilies:input_type -> api.v1.GetInstanceFamiliesRequest - 251, // 564: api.v1.K8sRecommendationService.GetInstanceSizes:input_type -> api.v1.GetInstanceSizesRequest - 258, // 565: api.v1.K8sRecommendationService.GetInstanceCategories:input_type -> api.v1.GetInstanceCategoriesRequest - 260, // 566: api.v1.K8sRecommendationService.GetInstanceCPUs:input_type -> api.v1.GetInstanceCPUsRequest - 262, // 567: api.v1.K8sRecommendationService.GetInstanceTypeNames:input_type -> api.v1.GetInstanceTypeNamesRequest - 133, // 568: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:input_type -> api.v1.GeneratePodDisruptionBudgetRequest - 135, // 569: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:input_type -> api.v1.GenerateAndCreatePodDisruptionBudgetRequest - 137, // 570: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:input_type -> api.v1.CreatePodDisruptionBudgetRequest - 139, // 571: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:input_type -> api.v1.GetPDBRecommendationForWorkloadRequest - 297, // 572: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:input_type -> api.v1.CreateStorageRecommendationPolicyRequest - 299, // 573: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:input_type -> api.v1.GetStorageRecommendationPolicyRequest - 301, // 574: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:input_type -> api.v1.ListStorageRecommendationPoliciesRequest - 303, // 575: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:input_type -> api.v1.UpdateStorageRecommendationPolicyRequest - 305, // 576: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:input_type -> api.v1.DeleteStorageRecommendationPolicyRequest - 308, // 577: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:input_type -> api.v1.CreateStoragePolicyTargetRequest - 310, // 578: api.v1.K8sRecommendationService.ListStoragePolicyTargets:input_type -> api.v1.ListStoragePolicyTargetsRequest - 312, // 579: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:input_type -> api.v1.UpdateStoragePolicyTargetRequest - 314, // 580: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:input_type -> api.v1.DeleteStoragePolicyTargetRequest - 317, // 581: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:input_type -> api.v1.GetPvcStorageRecommendationRequest - 319, // 582: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:input_type -> api.v1.ListPvcStorageRecommendationsRequest - 321, // 583: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:input_type -> api.v1.GeneratePvcStorageRecommendationRequest - 323, // 584: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:input_type -> api.v1.PreviewPvcStorageRecommendationRequest - 326, // 585: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:input_type -> api.v1.ListWorkloadRuleOOMEventsRequest - 328, // 586: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:input_type -> api.v1.ListWorkloadOOMEventsRequest - 331, // 587: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:input_type -> api.v1.ListWorkloadRuleCPUThrottleEventsRequest - 333, // 588: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:input_type -> api.v1.ListWorkloadCPUThrottleEventsRequest - 88, // 589: api.v1.K8sRecommendationService.RemoveClusterOptimizations:input_type -> api.v1.RemoveClusterOptimizationsRequest - 336, // 590: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:input_type -> api.v1.CreateWorkloadOptimizationPolicyRequest - 338, // 591: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:input_type -> api.v1.ListWorkloadOptimizationPoliciesRequest - 340, // 592: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:input_type -> api.v1.GetWorkloadOptimizationPolicyRequest - 342, // 593: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:input_type -> api.v1.UpdateWorkloadOptimizationPolicyRequest - 344, // 594: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:input_type -> api.v1.DeleteWorkloadOptimizationPolicyRequest - 359, // 595: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:input_type -> api.v1.UpsertManualWorkloadRuleRequest - 361, // 596: api.v1.K8sRecommendationService.PreviewWorkloadRule:input_type -> api.v1.PreviewWorkloadRuleRequest - 346, // 597: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:input_type -> api.v1.GetWorkloadRulesByPolicyRequest - 348, // 598: api.v1.K8sRecommendationService.ListWorkloadRules:input_type -> api.v1.ListWorkloadRulesRequest - 350, // 599: api.v1.K8sRecommendationService.GetWorkloadRuleByID:input_type -> api.v1.GetWorkloadRuleByIDRequest - 352, // 600: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:input_type -> api.v1.GetWorkloadRuleByWorkloadRequest - 354, // 601: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:input_type -> api.v1.GetWorkloadByWorkloadRuleRequest - 356, // 602: api.v1.K8sRecommendationService.DeleteWorkloadRule:input_type -> api.v1.DeleteWorkloadRuleRequest - 363, // 603: api.v1.K8sRecommendationService.GetWorkloadContainerNames:input_type -> api.v1.GetWorkloadContainerNamesRequest - 366, // 604: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:input_type -> api.v1.BatchAutoOptimizeWorkloadsRequest - 372, // 605: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:input_type -> api.v1.GetNodeRecommendationStatusRequest - 21, // 606: api.v1.K8sRecommendationService.GetNodeGroupStats:output_type -> api.v1.GetNodeGroupStatsResponse - 25, // 607: api.v1.K8sRecommendationService.GetLatestNodeGroupRecommendation:output_type -> api.v1.GetLatestNodeGroupRecommendationResponse - 27, // 608: api.v1.K8sRecommendationService.GetLatestWorkloadRecommendation:output_type -> api.v1.GetLatestWorkloadRecommendationResponse - 29, // 609: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendation:output_type -> api.v1.GetPreviewWorkloadRecommendationResponse - 32, // 610: api.v1.K8sRecommendationService.GetPreviewWorkloadRecommendations:output_type -> api.v1.GetPreviewWorkloadRecommendationsResponse - 19, // 611: api.v1.K8sRecommendationService.GetRecommendationsForWorkload:output_type -> api.v1.GetRecommendationsForWorkloadResponse - 17, // 612: api.v1.K8sRecommendationService.GetRecommendations:output_type -> api.v1.GetRecommendationsResponse - 49, // 613: api.v1.K8sRecommendationService.CreateNodeGroupRecommendationPolicy:output_type -> api.v1.CreateNodeGroupRecommendationPolicyResponse - 51, // 614: api.v1.K8sRecommendationService.GetNodeGroupRecommendationPolicy:output_type -> api.v1.GetNodeGroupRecommendationPolicyResponse - 53, // 615: api.v1.K8sRecommendationService.ListNodeGroupRecommendationPolicies:output_type -> api.v1.ListNodeGroupRecommendationPoliciesResponse - 55, // 616: api.v1.K8sRecommendationService.UpdateNodeGroupRecommendationPolicy:output_type -> api.v1.UpdateNodeGroupRecommendationPolicyResponse - 57, // 617: api.v1.K8sRecommendationService.DeleteNodeGroupRecommendationPolicy:output_type -> api.v1.DeleteNodeGroupRecommendationPolicyResponse - 59, // 618: api.v1.K8sRecommendationService.AttachNodeGroupRecommendationPolicy:output_type -> api.v1.AttachNodeGroupRecommendationPolicyResponse - 61, // 619: api.v1.K8sRecommendationService.CreateWorkloadRecommendationPolicy:output_type -> api.v1.CreateWorkloadRecommendationPolicyResponse - 63, // 620: api.v1.K8sRecommendationService.GetWorkloadRecommendationPolicy:output_type -> api.v1.GetWorkloadRecommendationPolicyResponse - 163, // 621: api.v1.K8sRecommendationService.GetPolicyRecommendedDefaults:output_type -> api.v1.GetPolicyRecommendedDefaultsResponse - 65, // 622: api.v1.K8sRecommendationService.ListWorkloadRecommendationPolicies:output_type -> api.v1.ListWorkloadRecommendationPoliciesResponse - 67, // 623: api.v1.K8sRecommendationService.UpdateWorkloadRecommendationPolicy:output_type -> api.v1.UpdateWorkloadRecommendationPolicyResponse - 69, // 624: api.v1.K8sRecommendationService.DeleteWorkloadRecommendationPolicy:output_type -> api.v1.DeleteWorkloadRecommendationPolicyResponse - 71, // 625: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicy:output_type -> api.v1.AttachWorkloadRecommendationPolicyResponse - 73, // 626: api.v1.K8sRecommendationService.AttachWorkloadRecommendationPolicies:output_type -> api.v1.AttachWorkloadRecommendationPoliciesResponse - 77, // 627: api.v1.K8sRecommendationService.CreateWorkloadPolicyTarget:output_type -> api.v1.CreateWorkloadPolicyTargetResponse - 79, // 628: api.v1.K8sRecommendationService.GetWorkloadPolicyTarget:output_type -> api.v1.GetWorkloadPolicyTargetResponse - 81, // 629: api.v1.K8sRecommendationService.ListWorkloadPolicyTargets:output_type -> api.v1.ListWorkloadPolicyTargetsResponse - 83, // 630: api.v1.K8sRecommendationService.UpdateWorkloadPolicyTarget:output_type -> api.v1.UpdateWorkloadPolicyTargetResponse - 87, // 631: api.v1.K8sRecommendationService.DeleteWorkloadPolicyTarget:output_type -> api.v1.DeleteWorkloadPolicyTargetResponse - 86, // 632: api.v1.K8sRecommendationService.ToggleWorkloadPolicyTargets:output_type -> api.v1.ToggleWorkloadPolicyTargetsResponse - 91, // 633: api.v1.K8sRecommendationService.PreviewWorkloadPolicyTargetMatches:output_type -> api.v1.PreviewWorkloadPolicyTargetMatchesResponse - 93, // 634: api.v1.K8sRecommendationService.GetPreviewWorkloadPolicyTargetRecommendations:output_type -> api.v1.GetPreviewWorkloadPolicyTargetRecommendationsResponse - 46, // 635: api.v1.K8sRecommendationService.GetWorkloadsWithAttachedPolicyTargets:output_type -> api.v1.GetWorkloadsWithAttachedPolicyTargetsResponse - 97, // 636: api.v1.K8sRecommendationService.CreateNodeGroupPolicyTarget:output_type -> api.v1.CreateNodeGroupPolicyTargetResponse - 99, // 637: api.v1.K8sRecommendationService.GetNodeGroupPolicyTarget:output_type -> api.v1.GetNodeGroupPolicyTargetResponse - 101, // 638: api.v1.K8sRecommendationService.ListNodeGroupPolicyTargets:output_type -> api.v1.ListNodeGroupPolicyTargetsResponse - 103, // 639: api.v1.K8sRecommendationService.UpdateNodeGroupPolicyTarget:output_type -> api.v1.UpdateNodeGroupPolicyTargetResponse - 107, // 640: api.v1.K8sRecommendationService.DeleteNodeGroupPolicyTarget:output_type -> api.v1.DeleteNodeGroupPolicyTargetResponse - 106, // 641: api.v1.K8sRecommendationService.ToggleNodeGroupPolicyTargets:output_type -> api.v1.ToggleNodeGroupPolicyTargetsResponse - 109, // 642: api.v1.K8sRecommendationService.PreviewNodeGroupPolicyTargetMatches:output_type -> api.v1.PreviewNodeGroupPolicyTargetMatchesResponse - 111, // 643: api.v1.K8sRecommendationService.GetPreviewNodeGroupPolicyTargetRecommendations:output_type -> api.v1.GetPreviewNodeGroupPolicyTargetRecommendationsResponse - 113, // 644: api.v1.K8sRecommendationService.BalanceGetRecommendations:output_type -> api.v1.BalanceGetRecommendationsResponse - 23, // 645: api.v1.K8sRecommendationService.GetOptimalInstanceTypeForNodeGroup:output_type -> api.v1.GetOptimalInstanceTypeForNodeGroupResponse - 173, // 646: api.v1.K8sRecommendationService.GetAttachedNodeGroupPolicies:output_type -> api.v1.GetAttachedNodeGroupPoliciesResponse - 175, // 647: api.v1.K8sRecommendationService.GetAttachedWorkloadPolicies:output_type -> api.v1.GetAttachedWorkloadPoliciesResponse - 229, // 648: api.v1.K8sRecommendationService.SearchResourcesByTargetingFilters:output_type -> api.v1.SearchResourcesByTargetingFiltersResponse - 228, // 649: api.v1.K8sRecommendationService.GetAvailableKindsByTargetingFilters:output_type -> api.v1.GetAvailableKindsByTargetingFiltersResponse - 181, // 650: api.v1.K8sRecommendationService.ListAttachedWorkloadPolicies:output_type -> api.v1.ListAttachedWorkloadPoliciesResponse - 183, // 651: api.v1.K8sRecommendationService.ListAttachedNodeGroupPolicies:output_type -> api.v1.ListAttachedNodeGroupPoliciesResponse - 190, // 652: api.v1.K8sRecommendationService.RecommendationEvents:output_type -> api.v1.RecommendationEventsResponse - 188, // 653: api.v1.K8sRecommendationService.ApplyRecommendation:output_type -> api.v1.ApplyRecommendationResponse - 186, // 654: api.v1.K8sRecommendationService.RecommendationApplied:output_type -> api.v1.RecommendationAppliedResponse - 192, // 655: api.v1.K8sRecommendationService.RetrieveSavingsForWorkload:output_type -> api.v1.RetrieveSavingsForWorkloadResponse - 194, // 656: api.v1.K8sRecommendationService.CreateNodePolicies:output_type -> api.v1.CreateNodePoliciesResponse - 214, // 657: api.v1.K8sRecommendationService.ListNodePolicies:output_type -> api.v1.ListNodePoliciesResponse - 216, // 658: api.v1.K8sRecommendationService.UpdateNodePolicy:output_type -> api.v1.UpdateNodePolicyResponse - 218, // 659: api.v1.K8sRecommendationService.DeleteNodePolicy:output_type -> api.v1.DeleteNodePolicyResponse - 196, // 660: api.v1.K8sRecommendationService.SuggestedNodePolicy:output_type -> api.v1.SuggestedNodePolicyResponse - 224, // 661: api.v1.K8sRecommendationService.SuggestedKarpenterConfig:output_type -> api.v1.SuggestedKarpenterConfigResponse - 198, // 662: api.v1.K8sRecommendationService.GenerateNodePoliciesFromKarpenter:output_type -> api.v1.GenerateNodePoliciesFromKarpenterResponse - 200, // 663: api.v1.K8sRecommendationService.GenerateNodePoliciesFromNodeGroups:output_type -> api.v1.GenerateNodePoliciesFromNodeGroupsResponse - 202, // 664: api.v1.K8sRecommendationService.GetNodeAnnotationReadiness:output_type -> api.v1.GetNodeAnnotationReadinessResponse - 204, // 665: api.v1.K8sRecommendationService.GetMigrationState:output_type -> api.v1.GetMigrationStateResponse - 206, // 666: api.v1.K8sRecommendationService.UpdateMigrationState:output_type -> api.v1.UpdateMigrationStateResponse - 208, // 667: api.v1.K8sRecommendationService.ReportNodePoolValidation:output_type -> api.v1.ReportNodePoolValidationResponse - 211, // 668: api.v1.K8sRecommendationService.GetNodePoolValidations:output_type -> api.v1.GetNodePoolValidationsResponse - 235, // 669: api.v1.K8sRecommendationService.CreateNodePolicyTargets:output_type -> api.v1.CreateNodePolicyTargetsResponse - 237, // 670: api.v1.K8sRecommendationService.ListNodePolicyTargets:output_type -> api.v1.ListNodePolicyTargetsResponse - 239, // 671: api.v1.K8sRecommendationService.UpdateNodePolicyTarget:output_type -> api.v1.UpdateNodePolicyTargetResponse - 221, // 672: api.v1.K8sRecommendationService.PreviewNodeRecommendationConfig:output_type -> api.v1.PreviewNodeRecommendationConfigResponse - 250, // 673: api.v1.K8sRecommendationService.GetInstanceFamilies:output_type -> api.v1.GetInstanceFamiliesResponse - 252, // 674: api.v1.K8sRecommendationService.GetInstanceSizes:output_type -> api.v1.GetInstanceSizesResponse - 259, // 675: api.v1.K8sRecommendationService.GetInstanceCategories:output_type -> api.v1.GetInstanceCategoriesResponse - 261, // 676: api.v1.K8sRecommendationService.GetInstanceCPUs:output_type -> api.v1.GetInstanceCPUsResponse - 263, // 677: api.v1.K8sRecommendationService.GetInstanceTypeNames:output_type -> api.v1.GetInstanceTypeNamesResponse - 134, // 678: api.v1.K8sRecommendationService.GeneratePodDisruptionBudget:output_type -> api.v1.GeneratePodDisruptionBudgetResponse - 136, // 679: api.v1.K8sRecommendationService.GenerateAndCreatePodDisruptionBudget:output_type -> api.v1.GenerateAndCreatePodDisruptionBudgetResponse - 138, // 680: api.v1.K8sRecommendationService.CreatePodDisruptionBudget:output_type -> api.v1.CreatePodDisruptionBudgetResponse - 140, // 681: api.v1.K8sRecommendationService.GetPDBRecommendationForWorkload:output_type -> api.v1.GetPDBRecommendationForWorkloadResponse - 298, // 682: api.v1.K8sRecommendationService.CreateStorageRecommendationPolicy:output_type -> api.v1.CreateStorageRecommendationPolicyResponse - 300, // 683: api.v1.K8sRecommendationService.GetStorageRecommendationPolicy:output_type -> api.v1.GetStorageRecommendationPolicyResponse - 302, // 684: api.v1.K8sRecommendationService.ListStorageRecommendationPolicies:output_type -> api.v1.ListStorageRecommendationPoliciesResponse - 304, // 685: api.v1.K8sRecommendationService.UpdateStorageRecommendationPolicy:output_type -> api.v1.UpdateStorageRecommendationPolicyResponse - 306, // 686: api.v1.K8sRecommendationService.DeleteStorageRecommendationPolicy:output_type -> api.v1.DeleteStorageRecommendationPolicyResponse - 309, // 687: api.v1.K8sRecommendationService.CreateStoragePolicyTarget:output_type -> api.v1.CreateStoragePolicyTargetResponse - 311, // 688: api.v1.K8sRecommendationService.ListStoragePolicyTargets:output_type -> api.v1.ListStoragePolicyTargetsResponse - 313, // 689: api.v1.K8sRecommendationService.UpdateStoragePolicyTarget:output_type -> api.v1.UpdateStoragePolicyTargetResponse - 315, // 690: api.v1.K8sRecommendationService.DeleteStoragePolicyTarget:output_type -> api.v1.DeleteStoragePolicyTargetResponse - 318, // 691: api.v1.K8sRecommendationService.GetPvcStorageRecommendation:output_type -> api.v1.GetPvcStorageRecommendationResponse - 320, // 692: api.v1.K8sRecommendationService.ListPvcStorageRecommendations:output_type -> api.v1.ListPvcStorageRecommendationsResponse - 322, // 693: api.v1.K8sRecommendationService.GeneratePvcStorageRecommendation:output_type -> api.v1.GeneratePvcStorageRecommendationResponse - 324, // 694: api.v1.K8sRecommendationService.PreviewPvcStorageRecommendation:output_type -> api.v1.PreviewPvcStorageRecommendationResponse - 327, // 695: api.v1.K8sRecommendationService.ListWorkloadRuleOOMEvents:output_type -> api.v1.ListWorkloadRuleOOMEventsResponse - 329, // 696: api.v1.K8sRecommendationService.ListWorkloadOOMEvents:output_type -> api.v1.ListWorkloadOOMEventsResponse - 332, // 697: api.v1.K8sRecommendationService.ListWorkloadRuleCPUThrottleEvents:output_type -> api.v1.ListWorkloadRuleCPUThrottleEventsResponse - 334, // 698: api.v1.K8sRecommendationService.ListWorkloadCPUThrottleEvents:output_type -> api.v1.ListWorkloadCPUThrottleEventsResponse - 89, // 699: api.v1.K8sRecommendationService.RemoveClusterOptimizations:output_type -> api.v1.RemoveClusterOptimizationsResponse - 337, // 700: api.v1.K8sRecommendationService.CreateWorkloadOptimizationPolicy:output_type -> api.v1.CreateWorkloadOptimizationPolicyResponse - 339, // 701: api.v1.K8sRecommendationService.ListWorkloadOptimizationPolicies:output_type -> api.v1.ListWorkloadOptimizationPoliciesResponse - 341, // 702: api.v1.K8sRecommendationService.GetWorkloadOptimizationPolicy:output_type -> api.v1.GetWorkloadOptimizationPolicyResponse - 343, // 703: api.v1.K8sRecommendationService.UpdateWorkloadOptimizationPolicy:output_type -> api.v1.UpdateWorkloadOptimizationPolicyResponse - 345, // 704: api.v1.K8sRecommendationService.DeleteWorkloadOptimizationPolicy:output_type -> api.v1.DeleteWorkloadOptimizationPolicyResponse - 360, // 705: api.v1.K8sRecommendationService.UpsertManualWorkloadRule:output_type -> api.v1.UpsertManualWorkloadRuleResponse - 362, // 706: api.v1.K8sRecommendationService.PreviewWorkloadRule:output_type -> api.v1.PreviewWorkloadRuleResponse - 347, // 707: api.v1.K8sRecommendationService.GetWorkloadRulesByPolicy:output_type -> api.v1.GetWorkloadRulesByPolicyResponse - 349, // 708: api.v1.K8sRecommendationService.ListWorkloadRules:output_type -> api.v1.ListWorkloadRulesResponse - 351, // 709: api.v1.K8sRecommendationService.GetWorkloadRuleByID:output_type -> api.v1.GetWorkloadRuleByIDResponse - 353, // 710: api.v1.K8sRecommendationService.GetWorkloadRuleByWorkload:output_type -> api.v1.GetWorkloadRuleByWorkloadResponse - 355, // 711: api.v1.K8sRecommendationService.GetWorkloadByWorkloadRule:output_type -> api.v1.GetWorkloadByWorkloadRuleResponse - 357, // 712: api.v1.K8sRecommendationService.DeleteWorkloadRule:output_type -> api.v1.DeleteWorkloadRuleResponse - 364, // 713: api.v1.K8sRecommendationService.GetWorkloadContainerNames:output_type -> api.v1.GetWorkloadContainerNamesResponse - 368, // 714: api.v1.K8sRecommendationService.BatchAutoOptimizeWorkloads:output_type -> api.v1.BatchAutoOptimizeWorkloadsResponse - 373, // 715: api.v1.K8sRecommendationService.GetNodeRecommendationStatus:output_type -> api.v1.GetNodeRecommendationStatusResponse - 606, // [606:716] is the sub-list for method output_type - 496, // [496:606] is the sub-list for method input_type - 496, // [496:496] is the sub-list for extension type_name - 496, // [496:496] is the sub-list for extension extendee - 0, // [0:496] 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() } @@ -35935,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{} { @@ -35949,8 +57291,1976 @@ 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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: @@ -35961,8 +59271,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[166].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BalanceApplyRecommendationResponse); i { case 0: return &v.state case 1: @@ -35973,8 +59283,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[167].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LiveMigrationResult); i { case 0: return &v.state case 1: @@ -35985,8 +59295,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[168].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupReference); i { case 0: return &v.state case 1: @@ -35997,8 +59307,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[169].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupRecommendation); i { case 0: return &v.state case 1: @@ -36009,8 +59319,500 @@ 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[170].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CostImpact); 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[171].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRecommendation); 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[172].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDetails); 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[173].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningEvidence); 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[174].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningInsight); 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[175].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningResourceEdge); 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[176].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningContainerChange); 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[177].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningUtilization); 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[178].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningHistoricalPattern); 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[179].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningReplicas); 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[180].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReasoningDecision); 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[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: @@ -36021,8 +59823,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[212].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeAnnotationReadinessResponse); i { case 0: return &v.state case 1: @@ -36033,8 +59835,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[213].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerRequest); i { case 0: return &v.state case 1: @@ -36045,8 +59847,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[214].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectClusterAutoscalerResponse); i { case 0: return &v.state case 1: @@ -36057,8 +59859,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[215].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36069,8 +59871,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[216].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36081,8 +59883,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[217].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36093,8 +59895,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[218].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36105,8 +59907,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[219].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36117,8 +59919,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[220].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36129,8 +59931,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[221].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateRequest); i { case 0: return &v.state case 1: @@ -36141,8 +59943,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[222].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateKarpenterMigrationStateResponse); i { case 0: return &v.state case 1: @@ -36153,8 +59955,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[223].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterOwnershipConflict); i { case 0: return &v.state case 1: @@ -36165,8 +59967,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[224].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsRequest); i { case 0: return &v.state case 1: @@ -36177,8 +59979,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[225].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectKarpenterOwnershipConflictsResponse); i { case 0: return &v.state case 1: @@ -36189,8 +59991,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[226].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictRequest); i { case 0: return &v.state case 1: @@ -36201,8 +60003,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[227].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AcknowledgeKarpenterOwnershipConflictResponse); i { case 0: return &v.state case 1: @@ -36213,8 +60015,8 @@ 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[228].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSourceResource); i { case 0: return &v.state case 1: @@ -36225,8 +60027,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[229].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesRequest); i { case 0: return &v.state case 1: @@ -36237,8 +60039,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[230].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterSourceResourcesResponse); i { case 0: return &v.state case 1: @@ -36249,8 +60051,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[231].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolAdoptionStatus); i { case 0: return &v.state case 1: @@ -36261,8 +60063,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[232].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusRequest); i { case 0: return &v.state case 1: @@ -36273,8 +60075,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[233].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetKarpenterAdoptionStatusResponse); i { case 0: return &v.state case 1: @@ -36285,8 +60087,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[234].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationRequest); i { case 0: return &v.state case 1: @@ -36297,8 +60099,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[235].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportNodePoolValidationResponse); i { case 0: return &v.state case 1: @@ -36309,8 +60111,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[236].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsRequest); i { case 0: return &v.state case 1: @@ -36321,8 +60123,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[237].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePoolValidationReport); i { case 0: return &v.state case 1: @@ -36333,8 +60135,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[238].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodePoolValidationsResponse); i { case 0: return &v.state case 1: @@ -36345,8 +60147,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[239].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadCompatibilityWarning); i { case 0: return &v.state case 1: @@ -36357,8 +60159,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[240].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesRequest); i { case 0: return &v.state case 1: @@ -36369,8 +60171,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[241].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePoliciesResponse); i { case 0: return &v.state case 1: @@ -36381,8 +60183,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[242].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyRequest); i { case 0: return &v.state case 1: @@ -36393,8 +60195,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[243].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyResponse); i { case 0: return &v.state case 1: @@ -36405,8 +60207,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[244].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupCheckpointStatus); i { case 0: return &v.state case 1: @@ -36417,8 +60219,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[245].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusRequest); i { case 0: return &v.state case 1: @@ -36429,8 +60231,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[246].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetNodeGroupsCheckpointStatusResponse); i { case 0: return &v.state case 1: @@ -36441,8 +60243,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[247].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelRequest); i { case 0: return &v.state case 1: @@ -36453,8 +60255,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[248].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetNodePolicyCheckpointLabelResponse); i { case 0: return &v.state case 1: @@ -36465,8 +60267,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[249].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyRequest); i { case 0: return &v.state case 1: @@ -36477,8 +60279,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[250].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteNodePolicyResponse); i { case 0: return &v.state case 1: @@ -36489,8 +60291,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[251].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicy); i { case 0: return &v.state case 1: @@ -36501,8 +60303,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[252].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigRequest); i { case 0: return &v.state case 1: @@ -36513,8 +60315,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[253].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewNodeRecommendationConfigResponse); i { case 0: return &v.state case 1: @@ -36525,8 +60327,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[254].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendationConfig); i { case 0: return &v.state case 1: @@ -36537,8 +60339,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[255].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigRequest); i { case 0: return &v.state case 1: @@ -36549,8 +60351,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[256].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestedKarpenterConfigResponse); i { case 0: return &v.state case 1: @@ -36561,8 +60363,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[257].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsRequest); i { case 0: return &v.state case 1: @@ -36573,8 +60375,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[258].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestNodePolicyImprovementsResponse); i { case 0: return &v.state case 1: @@ -36585,8 +60387,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[259].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsRequest); i { case 0: return &v.state case 1: @@ -36597,8 +60399,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[260].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListClusterNodePolicySuggestionsResponse); i { case 0: return &v.state case 1: @@ -36609,8 +60411,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[261].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestionsForPolicy); i { case 0: return &v.state case 1: @@ -36621,8 +60423,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[262].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicySuggestion); i { case 0: return &v.state case 1: @@ -36633,8 +60435,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[263].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionFieldChange); i { case 0: return &v.state case 1: @@ -36645,8 +60447,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[264].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionEvidence); i { case 0: return &v.state case 1: @@ -36657,8 +60459,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[265].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionWorkloadRef); i { case 0: return &v.state case 1: @@ -36669,8 +60471,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[266].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuggestionContext); i { case 0: return &v.state case 1: @@ -36681,8 +60483,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[267].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -36693,8 +60495,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[268].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersRequest); i { case 0: return &v.state case 1: @@ -36705,8 +60507,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[269].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TargetFilters); i { case 0: return &v.state case 1: @@ -36717,8 +60519,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[270].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetAvailableKindsByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -36729,8 +60531,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[271].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SearchResourcesByTargetingFiltersResponse); i { case 0: return &v.state case 1: @@ -36741,8 +60543,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[272].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NamespaceSearchResult); i { case 0: return &v.state case 1: @@ -36753,8 +60555,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[273].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadSearchResult); i { case 0: return &v.state case 1: @@ -36765,8 +60567,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[274].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeGroupSearchResult); i { case 0: return &v.state case 1: @@ -36777,8 +60579,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[275].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LabelSearchResult); i { case 0: return &v.state case 1: @@ -36789,8 +60591,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[276].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -36801,8 +60603,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[277].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -36813,8 +60615,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[278].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -36825,8 +60627,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[279].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListNodePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -36837,8 +60639,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[280].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -36849,8 +60651,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[281].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateNodePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -36861,8 +60663,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[282].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTarget); i { case 0: return &v.state case 1: @@ -36873,8 +60675,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[283].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyCondition); i { case 0: return &v.state case 1: @@ -36885,8 +60687,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[284].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePolicyTargetStatus); i { case 0: return &v.state case 1: @@ -36897,8 +60699,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[285].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ZonalShiftConfig); i { case 0: return &v.state case 1: @@ -36909,8 +60711,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[286].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Taint); i { case 0: return &v.state case 1: @@ -36921,8 +60723,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[287].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionBudget); i { case 0: return &v.state case 1: @@ -36933,8 +60735,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[288].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DisruptionPolicy); i { case 0: return &v.state case 1: @@ -36945,8 +60747,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[289].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResourceLimits); i { case 0: return &v.state case 1: @@ -36957,8 +60759,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[290].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSNodeClassSpec); i { case 0: return &v.state case 1: @@ -36969,8 +60771,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[291].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesRequest); i { case 0: return &v.state case 1: @@ -36981,8 +60783,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[292].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceFamiliesResponse); i { case 0: return &v.state case 1: @@ -36993,8 +60795,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[293].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesRequest); i { case 0: return &v.state case 1: @@ -37005,8 +60807,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[294].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceSizesResponse); i { case 0: return &v.state case 1: @@ -37017,8 +60819,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[295].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesRequest); i { case 0: return &v.state case 1: @@ -37029,8 +60831,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[296].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceShapesResponse); i { case 0: return &v.state case 1: @@ -37041,8 +60843,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[297].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceFamily); i { case 0: return &v.state case 1: @@ -37053,8 +60855,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[298].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceShape); i { case 0: return &v.state case 1: @@ -37065,8 +60867,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[299].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceSize); i { case 0: return &v.state case 1: @@ -37077,8 +60879,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[300].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCategory); i { case 0: return &v.state case 1: @@ -37089,8 +60891,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[301].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceCPU); i { case 0: return &v.state case 1: @@ -37101,8 +60903,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[302].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstanceTypeName); i { case 0: return &v.state case 1: @@ -37113,8 +60915,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[303].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesRequest); i { case 0: return &v.state case 1: @@ -37125,8 +60927,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[304].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCategoriesResponse); i { case 0: return &v.state case 1: @@ -37137,8 +60939,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[305].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsRequest); i { case 0: return &v.state case 1: @@ -37149,8 +60951,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[306].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceCPUsResponse); i { case 0: return &v.state case 1: @@ -37161,8 +60963,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[307].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesRequest); i { case 0: return &v.state case 1: @@ -37173,8 +60975,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[308].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstanceTypeNamesResponse); i { case 0: return &v.state case 1: @@ -37185,8 +60987,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[309].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -37197,8 +60999,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[310].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -37209,8 +61011,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[311].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CapacityReservationSelectorTerm); i { case 0: return &v.state case 1: @@ -37221,8 +61023,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[312].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMISelectorTerm); i { case 0: return &v.state case 1: @@ -37233,8 +61035,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[313].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KubeletConfiguration); i { case 0: return &v.state case 1: @@ -37245,8 +61047,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[314].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDeviceMapping); i { case 0: return &v.state case 1: @@ -37257,8 +61059,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[315].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockDevice); i { case 0: return &v.state case 1: @@ -37269,8 +61071,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[316].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetadataOptions); i { case 0: return &v.state case 1: @@ -37281,8 +61083,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[317].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPNodeClassSpec); i { case 0: return &v.state case 1: @@ -37293,8 +61095,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[318].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPImageSelectorTerm); i { case 0: return &v.state case 1: @@ -37305,8 +61107,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[319].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPDisk); i { case 0: return &v.state case 1: @@ -37317,8 +61119,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[320].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureNodeClassSpec); i { case 0: return &v.state case 1: @@ -37329,8 +61131,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[321].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AzureKubeletConfiguration); i { case 0: return &v.state case 1: @@ -37341,8 +61143,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[322].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIImageSelectorTerm); i { case 0: return &v.state case 1: @@ -37353,8 +61155,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[323].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISubnetSelectorTerm); i { case 0: return &v.state case 1: @@ -37365,8 +61167,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[324].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCISecurityGroupSelectorTerm); i { case 0: return &v.state case 1: @@ -37377,8 +61179,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[325].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIBootConfig); i { case 0: return &v.state case 1: @@ -37389,8 +61191,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[326].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCILaunchOptions); i { case 0: return &v.state case 1: @@ -37401,8 +61203,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[327].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIVolumeAttributes); i { case 0: return &v.state case 1: @@ -37413,8 +61215,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[328].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClassSpec); i { case 0: return &v.state case 1: @@ -37425,8 +61227,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[329].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KarpenterSettingsRecommendation); i { case 0: return &v.state case 1: @@ -37437,8 +61239,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[330].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawKarpenterSpec); i { case 0: return &v.state case 1: @@ -37449,8 +61251,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[331].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotRecommendation); i { case 0: return &v.state case 1: @@ -37461,8 +61263,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[332].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ForensicSnapshotRecommendation); i { case 0: return &v.state case 1: @@ -37473,8 +61275,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[333].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatusReport); i { case 0: return &v.state case 1: @@ -37485,8 +61287,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[334].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRStatus); i { case 0: return &v.state case 1: @@ -37497,8 +61299,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[335].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotCRRuntimeStatus); i { case 0: return &v.state case 1: @@ -37509,8 +61311,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[336].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPolicyTargetStatus); i { case 0: return &v.state case 1: @@ -37521,8 +61323,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[337].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotPrereqs); i { case 0: return &v.state case 1: @@ -37533,8 +61335,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[338].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeRecommendation); i { case 0: return &v.state case 1: @@ -37545,8 +61347,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[339].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AWSKarpenterSpec); i { case 0: return &v.state case 1: @@ -37557,8 +61359,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[340].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSKarpenterSpec); i { case 0: return &v.state case 1: @@ -37569,8 +61371,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[341].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodePool); i { case 0: return &v.state case 1: @@ -37581,8 +61383,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[342].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EC2NodeClass); i { case 0: return &v.state case 1: @@ -37593,8 +61395,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[343].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AKSNodeClass); i { case 0: return &v.state case 1: @@ -37605,8 +61407,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[344].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCPKarpenterSpec); i { case 0: return &v.state case 1: @@ -37617,8 +61419,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[345].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GCENodeClass); i { case 0: return &v.state case 1: @@ -37629,8 +61431,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[346].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIKarpenterSpec); i { case 0: return &v.state case 1: @@ -37641,8 +61443,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[347].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCINodeClass); i { case 0: return &v.state case 1: @@ -37653,8 +61455,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[348].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StorageRecommendationPolicy); i { case 0: return &v.state case 1: @@ -37665,8 +61467,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[349].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37677,8 +61479,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[350].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37689,8 +61491,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[351].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37701,8 +61503,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[352].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37713,8 +61515,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[353].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesRequest); i { case 0: return &v.state case 1: @@ -37725,8 +61527,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[354].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStorageRecommendationPoliciesResponse); i { case 0: return &v.state case 1: @@ -37737,8 +61539,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[355].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37749,8 +61551,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[356].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37761,8 +61563,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[357].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyRequest); i { case 0: return &v.state case 1: @@ -37773,8 +61575,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[358].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStorageRecommendationPolicyResponse); i { case 0: return &v.state case 1: @@ -37785,8 +61587,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[359].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StoragePolicyTarget); i { case 0: return &v.state case 1: @@ -37797,8 +61599,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[360].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37809,8 +61611,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[361].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37821,8 +61623,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[362].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsRequest); i { case 0: return &v.state case 1: @@ -37833,8 +61635,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[363].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoragePolicyTargetsResponse); i { case 0: return &v.state case 1: @@ -37845,8 +61647,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[364].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37857,8 +61659,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[365].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37869,8 +61671,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[366].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetRequest); i { case 0: return &v.state case 1: @@ -37881,8 +61683,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[367].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteStoragePolicyTargetResponse); i { case 0: return &v.state case 1: @@ -37893,8 +61695,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[368].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PvcStorageRecommendation); i { case 0: return &v.state case 1: @@ -37905,8 +61707,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[369].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37917,8 +61719,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[370].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -37929,8 +61731,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[371].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsRequest); i { case 0: return &v.state case 1: @@ -37941,8 +61743,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[372].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPvcStorageRecommendationsResponse); i { case 0: return &v.state case 1: @@ -37953,8 +61755,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[373].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37965,8 +61767,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[374].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneratePvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -37977,8 +61779,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[375].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationRequest); i { case 0: return &v.state case 1: @@ -37989,8 +61791,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[376].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PreviewPvcStorageRecommendationResponse); i { case 0: return &v.state case 1: @@ -38001,8 +61803,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[377].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleOOMEvent); i { case 0: return &v.state case 1: @@ -38013,8 +61815,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[378].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsRequest); i { case 0: return &v.state case 1: @@ -38025,8 +61827,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[379].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleOOMEventsResponse); i { case 0: return &v.state case 1: @@ -38037,8 +61839,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[380].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsRequest); i { case 0: return &v.state case 1: @@ -38049,8 +61851,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[381].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadOOMEventsResponse); i { case 0: return &v.state case 1: @@ -38061,8 +61863,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[382].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadRuleCPUThrottleEvent); i { case 0: return &v.state case 1: @@ -38073,8 +61875,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[383].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -38085,8 +61887,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[384].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadRuleCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -38097,8 +61899,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[385].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsRequest); i { case 0: return &v.state case 1: @@ -38109,8 +61911,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[386].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkloadCPUThrottleEventsResponse); i { case 0: return &v.state case 1: @@ -38121,8 +61923,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[387].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringSetSelector); i { case 0: return &v.state case 1: @@ -38133,8 +61935,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[388].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkloadOptimizationPolicyProto); i { case 0: return &v.state case 1: @@ -38145,8 +61947,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[389].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericOptimizationSettings); i { case 0: return &v.state case 1: @@ -38157,8 +61959,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.(*GetNodeAnnotationReadinessRequest); 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: @@ -38169,8 +61971,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.(*GetNodeAnnotationReadinessResponse); 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: @@ -38181,8 +61983,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.(*GetMigrationStateRequest); 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: @@ -38193,8 +61995,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.(*GetMigrationStateResponse); 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: @@ -38205,8 +62007,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.(*UpdateMigrationStateRequest); 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: @@ -38217,8 +62019,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.(*UpdateMigrationStateResponse); 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: @@ -38229,8 +62031,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.(*ReportNodePoolValidationRequest); 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: @@ -38241,8 +62043,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.(*ReportNodePoolValidationResponse); 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: @@ -38253,8 +62055,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.(*GetNodePoolValidationsRequest); 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: @@ -38265,8 +62067,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.(*NodePoolValidationReport); 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: @@ -38277,8 +62079,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.(*GetNodePoolValidationsResponse); 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: @@ -38289,8 +62091,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.(*WorkloadCompatibilityWarning); 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: @@ -38301,8 +62103,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.(*ListNodePoliciesRequest); 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: @@ -38313,8 +62115,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.(*ListNodePoliciesResponse); 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: @@ -38325,8 +62127,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.(*UpdateNodePolicyRequest); 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: @@ -38337,8 +62139,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.(*UpdateNodePolicyResponse); 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: @@ -38349,8 +62151,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.(*DeleteNodePolicyRequest); 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: @@ -38361,8 +62163,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.(*DeleteNodePolicyResponse); 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: @@ -38373,8 +62175,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.(*NodePolicy); 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: @@ -38385,8 +62187,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.(*PreviewNodeRecommendationConfigRequest); 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: @@ -38397,8 +62199,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.(*PreviewNodeRecommendationConfigResponse); 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: @@ -38409,8 +62211,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.(*NodeRecommendationConfig); 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: @@ -38421,8 +62223,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.(*SuggestedKarpenterConfigRequest); 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: @@ -38433,8 +62235,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.(*SuggestedKarpenterConfigResponse); 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: @@ -38445,8 +62247,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.(*GetAvailableKindsByTargetingFiltersRequest); 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: @@ -38457,8 +62259,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.(*SearchResourcesByTargetingFiltersRequest); 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: @@ -38469,8 +62271,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.(*TargetFilters); 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: @@ -38481,8 +62283,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.(*GetAvailableKindsByTargetingFiltersResponse); 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: @@ -38493,8 +62295,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.(*SearchResourcesByTargetingFiltersResponse); 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: @@ -38505,8 +62307,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.(*NamespaceSearchResult); 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: @@ -38517,8 +62319,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.(*WorkloadSearchResult); 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: @@ -38529,8 +62331,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.(*NodeGroupSearchResult); 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: @@ -38541,8 +62343,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.(*LabelSearchResult); 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: @@ -38553,8 +62355,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.(*CreateNodePolicyTargetsRequest); 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: @@ -38565,8 +62367,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.(*CreateNodePolicyTargetsResponse); 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: @@ -38577,8 +62379,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.(*ListNodePolicyTargetsRequest); 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: @@ -38589,8 +62391,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.(*ListNodePolicyTargetsResponse); 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: @@ -38601,8 +62403,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.(*UpdateNodePolicyTargetRequest); 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: @@ -38613,8 +62415,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.(*UpdateNodePolicyTargetResponse); 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: @@ -38625,8 +62427,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.(*NodePolicyTarget); 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: @@ -38637,8 +62439,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.(*NodePolicyCondition); 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: @@ -38649,8 +62451,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.(*NodePolicyTargetStatus); 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: @@ -38661,8 +62463,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.(*ZonalShiftConfig); 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: @@ -38673,8 +62475,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.(*Taint); 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: @@ -38685,8 +62487,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.(*DisruptionBudget); 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: @@ -38697,8 +62499,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.(*DisruptionPolicy); 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: @@ -38709,8 +62511,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.(*ResourceLimits); 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: @@ -38721,8 +62523,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.(*AWSNodeClassSpec); 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: @@ -38733,8 +62535,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.(*GetInstanceFamiliesRequest); 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: @@ -38745,8 +62547,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.(*GetInstanceFamiliesResponse); 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: @@ -38757,8 +62559,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.(*GetInstanceSizesRequest); 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: @@ -38769,8 +62571,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.(*GetInstanceSizesResponse); 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: @@ -38781,8 +62583,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.(*InstanceFamily); 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: @@ -38793,8 +62595,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.(*InstanceSize); 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: @@ -38805,8 +62607,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.(*InstanceCategory); 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: @@ -38817,8 +62619,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.(*InstanceCPU); 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: @@ -38829,8 +62631,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.(*InstanceTypeName); 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: @@ -38841,8 +62643,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.(*GetInstanceCategoriesRequest); 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: @@ -38853,8 +62655,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.(*GetInstanceCategoriesResponse); 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: @@ -38865,8 +62667,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.(*GetInstanceCPUsRequest); 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: @@ -38877,8 +62679,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.(*GetInstanceCPUsResponse); 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: @@ -38889,8 +62691,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.(*GetInstanceTypeNamesRequest); 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: @@ -38901,8 +62703,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.(*GetInstanceTypeNamesResponse); 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: @@ -38913,8 +62715,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.(*SubnetSelectorTerm); 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: @@ -38925,8 +62727,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.(*SecurityGroupSelectorTerm); 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: @@ -38937,8 +62739,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.(*CapacityReservationSelectorTerm); 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: @@ -38949,8 +62751,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.(*AMISelectorTerm); 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: @@ -38961,8 +62763,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.(*KubeletConfiguration); 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: @@ -38973,8 +62775,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.(*BlockDeviceMapping); 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: @@ -38985,8 +62787,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.(*BlockDevice); 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: @@ -38997,8 +62799,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.(*MetadataOptions); 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: @@ -39009,8 +62811,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.(*GCPNodeClassSpec); 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: @@ -39021,8 +62823,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.(*GCPImageSelectorTerm); 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: @@ -39033,8 +62835,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.(*GCPDisk); 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: @@ -39045,8 +62847,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.(*AzureNodeClassSpec); 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: @@ -39057,8 +62859,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.(*AzureKubeletConfiguration); 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: @@ -39069,8 +62871,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.(*OCIImageSelectorTerm); 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: @@ -39081,8 +62883,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.(*OCISubnetSelectorTerm); 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: @@ -39093,8 +62895,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.(*OCISecurityGroupSelectorTerm); 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: @@ -39105,8 +62907,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.(*OCIBootConfig); 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: @@ -39117,8 +62919,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.(*OCILaunchOptions); 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: @@ -39129,8 +62931,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.(*OCIVolumeAttributes); 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: @@ -39141,8 +62943,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.(*OCINodeClassSpec); 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: @@ -39153,8 +62955,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.(*KarpenterSettingsRecommendation); 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: @@ -39165,8 +62967,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.(*RawKarpenterSpec); 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: @@ -39177,8 +62979,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.(*NodeRecommendation); 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: @@ -39189,8 +62991,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.(*AWSKarpenterSpec); 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: @@ -39201,8 +63003,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.(*AKSKarpenterSpec); 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: @@ -39213,8 +63015,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.(*NodePool); 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: @@ -39225,8 +63027,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.(*EC2NodeClass); 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: @@ -39237,8 +63039,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.(*AKSNodeClass); 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: @@ -39249,8 +63051,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.(*GCPKarpenterSpec); 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: @@ -39261,8 +63063,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.(*GCENodeClass); 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: @@ -39273,8 +63075,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.(*OCIKarpenterSpec); 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: @@ -39285,8 +63087,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.(*OCINodeClass); 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: @@ -39297,8 +63099,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.(*StorageRecommendationPolicy); 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: @@ -39309,8 +63111,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.(*CreateStorageRecommendationPolicyRequest); 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: @@ -39321,8 +63123,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.(*CreateStorageRecommendationPolicyResponse); 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: @@ -39333,8 +63135,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.(*GetStorageRecommendationPolicyRequest); 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: @@ -39345,8 +63147,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.(*GetStorageRecommendationPolicyResponse); 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: @@ -39357,8 +63159,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.(*ListStorageRecommendationPoliciesRequest); 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: @@ -39369,8 +63171,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.(*ListStorageRecommendationPoliciesResponse); 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: @@ -39381,8 +63183,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.(*UpdateStorageRecommendationPolicyRequest); 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: @@ -39393,8 +63195,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.(*UpdateStorageRecommendationPolicyResponse); 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: @@ -39405,8 +63207,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.(*DeleteStorageRecommendationPolicyRequest); 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: @@ -39417,8 +63219,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.(*DeleteStorageRecommendationPolicyResponse); 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: @@ -39429,8 +63231,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.(*StoragePolicyTarget); 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: @@ -39441,8 +63243,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.(*CreateStoragePolicyTargetRequest); 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: @@ -39453,8 +63255,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.(*CreateStoragePolicyTargetResponse); 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: @@ -39465,8 +63267,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.(*ListStoragePolicyTargetsRequest); 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: @@ -39477,8 +63279,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.(*ListStoragePolicyTargetsResponse); 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: @@ -39489,8 +63291,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.(*UpdateStoragePolicyTargetRequest); 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: @@ -39501,8 +63303,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.(*UpdateStoragePolicyTargetResponse); 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: @@ -39513,8 +63315,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.(*DeleteStoragePolicyTargetRequest); 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: @@ -39525,8 +63327,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.(*DeleteStoragePolicyTargetResponse); 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: @@ -39537,8 +63339,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.(*PvcStorageRecommendation); 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: @@ -39549,8 +63351,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.(*GetPvcStorageRecommendationRequest); 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: @@ -39561,8 +63363,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.(*GetPvcStorageRecommendationResponse); 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: @@ -39573,8 +63375,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.(*ListPvcStorageRecommendationsRequest); 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: @@ -39585,8 +63387,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.(*ListPvcStorageRecommendationsResponse); 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: @@ -39597,8 +63399,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.(*GeneratePvcStorageRecommendationRequest); 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: @@ -39609,8 +63411,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.(*GeneratePvcStorageRecommendationResponse); 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: @@ -39621,8 +63423,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.(*PreviewPvcStorageRecommendationRequest); 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: @@ -39633,8 +63435,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.(*PreviewPvcStorageRecommendationResponse); 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: @@ -39645,8 +63447,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.(*WorkloadRuleOOMEvent); 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: @@ -39657,8 +63459,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.(*ListWorkloadRuleOOMEventsRequest); 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: @@ -39669,8 +63471,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.(*ListWorkloadRuleOOMEventsResponse); 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: @@ -39681,8 +63483,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.(*ListWorkloadOOMEventsRequest); 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: @@ -39693,8 +63495,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.(*ListWorkloadOOMEventsResponse); 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: @@ -39705,8 +63507,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.(*WorkloadRuleCPUThrottleEvent); 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: @@ -39717,8 +63519,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.(*ListWorkloadRuleCPUThrottleEventsRequest); 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: @@ -39729,8 +63531,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.(*ListWorkloadRuleCPUThrottleEventsResponse); 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: @@ -39741,8 +63543,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.(*ListWorkloadCPUThrottleEventsRequest); 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: @@ -39753,8 +63555,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.(*ListWorkloadCPUThrottleEventsResponse); 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: @@ -39765,8 +63567,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.(*WorkloadOptimizationPolicyProto); 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: @@ -39777,8 +63579,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.(*CreateWorkloadOptimizationPolicyRequest); 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: @@ -39789,8 +63591,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.(*CreateWorkloadOptimizationPolicyResponse); 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: @@ -39801,8 +63603,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.(*ListWorkloadOptimizationPoliciesRequest); 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: @@ -39813,8 +63615,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.(*ListWorkloadOptimizationPoliciesResponse); 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: @@ -39825,8 +63627,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.(*GetWorkloadOptimizationPolicyRequest); 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: @@ -39837,8 +63639,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.(*GetWorkloadOptimizationPolicyResponse); 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: @@ -39849,8 +63651,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.(*UpdateWorkloadOptimizationPolicyRequest); 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: @@ -39861,8 +63663,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.(*UpdateWorkloadOptimizationPolicyResponse); 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: @@ -39873,8 +63675,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.(*DeleteWorkloadOptimizationPolicyRequest); 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: @@ -39885,8 +63687,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.(*DeleteWorkloadOptimizationPolicyResponse); 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: @@ -39897,8 +63699,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.(*GetWorkloadRulesByPolicyRequest); 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: @@ -39909,8 +63711,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.(*GetWorkloadRulesByPolicyResponse); 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: @@ -39921,8 +63723,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.(*ListWorkloadRulesRequest); 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: @@ -39933,8 +63735,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.(*ListWorkloadRulesResponse); 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: @@ -39945,8 +63747,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.(*GetWorkloadRuleByIDRequest); 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: @@ -39957,8 +63759,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.(*GetWorkloadRuleByIDResponse); 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: @@ -39969,8 +63771,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.(*GetWorkloadRuleByWorkloadRequest); 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: @@ -39981,8 +63783,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.(*GetWorkloadRuleByWorkloadResponse); 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: @@ -39993,8 +63795,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.(*GetWorkloadByWorkloadRuleRequest); 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: @@ -40005,8 +63807,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.(*GetWorkloadByWorkloadRuleResponse); 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: @@ -40017,8 +63819,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.(*DeleteWorkloadRuleRequest); 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: @@ -40029,8 +63831,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.(*DeleteWorkloadRuleResponse); 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: @@ -40041,8 +63843,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.(*ManualRuleFields); 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: @@ -40053,8 +63855,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.(*UpsertManualWorkloadRuleRequest); 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: @@ -40065,8 +63867,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.(*UpsertManualWorkloadRuleResponse); 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: @@ -40077,8 +63879,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.(*PreviewWorkloadRuleRequest); 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: @@ -40089,8 +63891,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.(*PreviewWorkloadRuleResponse); 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: @@ -40101,8 +63903,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.(*GetWorkloadContainerNamesRequest); 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: @@ -40113,8 +63915,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.(*GetWorkloadContainerNamesResponse); 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: @@ -40125,8 +63927,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.(*BatchAutoOptimizeWorkload); 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: @@ -40137,8 +63939,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.(*BatchAutoOptimizeWorkloadsRequest); 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: @@ -40149,8 +63951,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.(*BatchAutoOptimizeWorkloadResult); 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: @@ -40161,8 +63963,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.(*BatchAutoOptimizeWorkloadsResponse); 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: @@ -40173,8 +63975,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.(*WorkloadProfileManifest); 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: @@ -40185,8 +63987,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.(*BatchWorkloadProfiles); 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: @@ -40197,8 +63999,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.(*NodeConfigApplyEvent); 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: @@ -40209,8 +64011,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.(*GetNodeRecommendationStatusRequest); 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: @@ -40221,8 +64023,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.(*GetNodeRecommendationStatusResponse); 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: @@ -40250,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), @@ -40277,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[203].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[211].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[232].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[252].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[253].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[254].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[255].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[256].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[265].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[267].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[280].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[281].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[287].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[291].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[292].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[294].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[300].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[303].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[304].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[306].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[308].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[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[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[317].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[319].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[326].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[332].OneofWrappers = []interface{}{} - file_api_v1_recommendation_proto_msgTypes[342].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: 16, - NumMessages: 390, + 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 97db482..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); @@ -128,14 +149,66 @@ service K8sRecommendationService { // k8s_nodes metadata for clusters without Karpenter/dzkarp. rpc GenerateNodePoliciesFromNodeGroups(GenerateNodePoliciesFromNodeGroupsRequest) returns (GenerateNodePoliciesFromNodeGroupsResponse); + // GetNodeGroupsCheckpointStatus returns, per node group in a cluster, whether + // checkpoint-restore is enabled (dz-managed + active node policy + the + // dakr.devzero.io/checkpoint-node label) so the UI can render status/CTA. + rpc GetNodeGroupsCheckpointStatus(GetNodeGroupsCheckpointStatusRequest) returns (GetNodeGroupsCheckpointStatusResponse); + // SetNodePolicyCheckpointLabel toggles the dakr.devzero.io/checkpoint-node + // label on a single node policy via a targeted label patch (not a full-row + // policy update). + rpc SetNodePolicyCheckpointLabel(SetNodePolicyCheckpointLabelRequest) returns (SetNodePolicyCheckpointLabelResponse); + + // EnableCheckpointForPolicy is the orchestration RPC for the checkpoint-restore + // toggle on a NodePolicy. It performs the policy-template patch (same as + // SetNodePolicyCheckpointLabel) AND enqueues one GenericResourceRecommendation + // per currently-observed node in the policy's matched groups so existing + // nodes get (un)labelled, not just future ones. All enqueued rows share a + // batch_id the caller polls via GetCheckpointApplyStatus. + rpc EnableCheckpointForPolicy(EnableCheckpointForPolicyRequest) returns (EnableCheckpointForPolicyResponse); + // GetCheckpointApplyStatus surfaces the per-batch status counts (plus per-node + // failure details) for the most recent EnableCheckpointForPolicy batch on a + // policy. The FE polls this while a batch is in flight so the toggle CTA can + // 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); @@ -150,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); @@ -159,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); @@ -194,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); @@ -206,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 { @@ -340,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; } @@ -362,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; } @@ -725,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; @@ -751,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; } @@ -798,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 @@ -851,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 { @@ -872,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 { @@ -883,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. @@ -1019,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; @@ -1058,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 } @@ -1112,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 { @@ -1140,6 +1393,57 @@ message ResourceRuleConfig { // Whether to actively remove limits from workloads. bool limits_removal_enabled = 13; + + // Human-readable annotations from the engine: clamp messages, pmax / + // throttle / OOM floor activation, and "request exceeds existing limit" + // warnings. Surfaced through PreviewWorkloadRule so the UI can show why + // 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 { @@ -1150,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 @@ -1172,6 +1477,21 @@ message ContainerResourceConfig { // Carried so the UI can surface profiling's per-container percentile // pick alongside the workload-level chip. optional float target_percentile = 8; + + // 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. @@ -1182,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 { @@ -1209,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; @@ -1247,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 @@ -1328,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; @@ -1487,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 { @@ -1516,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 { @@ -1659,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 { @@ -1779,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. @@ -1790,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; @@ -1801,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 { @@ -1836,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. @@ -1855,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 { @@ -1920,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; @@ -1935,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). @@ -1943,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; @@ -1951,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 { @@ -2160,6 +2897,77 @@ message GenerateNodePoliciesFromNodeGroupsResponse { repeated NodePolicy policies = 1; repeated NodePolicyTarget targets = 2; repeated WorkloadCompatibilityWarning warnings = 3; + // 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. + repeated NodeGroupMigrationEligibility eligibility = 4; +} + +// 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. +message NodeGroupMigrationEligibility { + // group_name matches NodePolicy.name (the source node group's name). + string group_name = 1; + // 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. + bool migratable = 2; + // 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. + repeated string reasons = 3; } message GetNodeAnnotationReadinessRequest { @@ -2174,9 +2982,35 @@ message GetNodeAnnotationReadinessResponse { bool ready = 4; repeated string unannotated_node_names = 5; // supported is false when the cluster's cloud provider has no annotation - // schema yet (Azure / OCI today). The wizard renders a clear "not - // supported" state instead of polling indefinitely. + // schema yet (OCI today). The wizard renders a clear "not supported" + // state instead of polling indefinitely. bool supported = 6; + // 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. + 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 @@ -2207,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; @@ -2262,6 +3184,77 @@ message UpdateNodePolicyResponse { NodePolicy policy = 1; } +// NodeGroupCheckpointState classifies a node group's checkpoint-restore status. +enum NodeGroupCheckpointState { + NODE_GROUP_CHECKPOINT_STATE_UNSPECIFIED = 0; + // Node group is not DevZero/dzkarp-managed (no matching node policy node + // pool). Customer is responsible for adding the checkpoint-node label. + NODE_GROUP_CHECKPOINT_STATE_NOT_DZ_MANAGED = 1; + // dz-managed (matches a policy's node pool) but no active node policy + // target for this cluster. + NODE_GROUP_CHECKPOINT_STATE_DZ_MANAGED_NO_ACTIVE_POLICY = 2; + // dz-managed + active policy, but the policy lacks the + // dakr.devzero.io/checkpoint-node label. Eligible for the one-click CTA. + NODE_GROUP_CHECKPOINT_STATE_POLICY_NO_LABEL = 3; + // dz-managed + active policy + label present. Intent declared; actual CRIU + // capability not (yet) verified. + NODE_GROUP_CHECKPOINT_STATE_CONFIGURED = 4; + // CONFIGURED and CRIU verified present on the node group's nodes. + 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). + string policy_id = 2; + string policy_name = 3; + // For scope disclosure on the CTA: all node pool names this policy compiles + // 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 { + string team_id = 1; + string cluster_id = 2; +} + +message GetNodeGroupsCheckpointStatusResponse { + // Keyed by node group name. + map by_node_group = 1; +} + +message SetNodePolicyCheckpointLabelRequest { + string team_id = 1; + string policy_id = 2; + // true adds dakr.devzero.io/checkpoint-node=true; false removes the key. + bool enabled = 3; +} + +message SetNodePolicyCheckpointLabelResponse { + bool success = 1; +} + message DeleteNodePolicyRequest { string team_id = 1; string policy_id = 2; @@ -2286,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 @@ -2298,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 @@ -2347,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 { @@ -2387,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; @@ -2601,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 { @@ -2608,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; @@ -2755,6 +4021,7 @@ message AzureNodeClassSpec { map tags = 5; optional AzureKubeletConfiguration kubelet = 6; optional int32 max_pods = 7; + optional string image_version = 8; } message AzureKubeletConfiguration { @@ -2832,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; @@ -2927,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 { @@ -3285,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 @@ -3308,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; @@ -3333,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 { @@ -3343,6 +4766,11 @@ message CreateWorkloadOptimizationPolicyResponse { message ListWorkloadOptimizationPoliciesRequest { string team_id = 1; + // 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). + string cluster_id = 2; } message ListWorkloadOptimizationPoliciesResponse { @@ -3358,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; @@ -3378,38 +4827,412 @@ 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 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 ToggleSchedulerPolicyDisabledRequest { + string team_id = 1; + 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 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; } @@ -3469,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 @@ -3488,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. @@ -3531,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 { @@ -3544,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 { @@ -3567,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 { @@ -3608,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 @@ -3653,3 +5648,599 @@ message GetNodeRecommendationStatusResponse { NodeRecommendationConfig current_config = 1; repeated NodeConfigApplyEvent history = 2; } + +// 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. +message EnableCheckpointForPolicyRequest { + string team_id = 1; + string policy_id = 2; + bool enabled = 3; +} + +message EnableCheckpointForPolicyResponse { + // UUID grouping the enqueued per-node patches; empty when no live nodes + // needed enqueueing (policy template still got patched). + string batch_id = 1; + uint32 enqueued_nodes = 2; + // 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. + repeated string skipped_clusters = 3; +} + +message GetCheckpointApplyStatusRequest { + string team_id = 1; + string policy_id = 2; +} + +message GetCheckpointApplyStatusResponse { + // batch_id of the most-recent EnableCheckpointForPolicy batch for the + // supplied policy, or empty when no batch exists yet. + string batch_id = 1; + uint32 pending = 2; + uint32 applied = 3; + uint32 failed = 4; + // rejected lumps every other terminal status (superseded, blocked, ignored, + // and the operator's Rejected) — the UI surfaces them collectively as "did + // not apply". + uint32 rejected = 5; + repeated NodeApplyFailure failures = 6; +} + +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/provider/pkg/provider/client.go b/provider/pkg/provider/client.go index efc07e9..7b0b3ed 100644 --- a/provider/pkg/provider/client.go +++ b/provider/pkg/provider/client.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "net/http" + "strings" "time" "connectrpc.com/connect" @@ -42,11 +43,28 @@ func authInterceptor(token string) connect.UnaryInterceptorFunc { } } +// isIdempotentProcedure reports whether an RPC is safe to retry after a +// transport-level failure. Only read-style RPCs qualify: a Create/Upsert whose +// first attempt actually landed server-side would be duplicated on retry +// (CreateNodePolicies without a client-set id always inserts a new row, and +// there is no name uniqueness). +func isIdempotentProcedure(procedure string) bool { + name := procedure + if i := strings.LastIndex(procedure, "/"); i >= 0 { + name = procedure[i+1:] + } + return strings.HasPrefix(name, "Get") || strings.HasPrefix(name, "List") +} + // retryInterceptor returns a Connect interceptor that retries transient errors -// (CodeUnavailable, CodeDeadlineExceeded) with exponential backoff. +// (CodeUnavailable, CodeDeadlineExceeded) with exponential backoff. Only +// idempotent (read-style) RPCs are retried. func retryInterceptor(maxAttempts int, initialDelay time.Duration) connect.UnaryInterceptorFunc { return func(next connect.UnaryFunc) connect.UnaryFunc { return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { + if maxAttempts < 1 || !isIdempotentProcedure(req.Spec().Procedure) { + return next(ctx, req) + } delay := initialDelay for attempt := 0; attempt < maxAttempts; attempt++ { resp, err := next(ctx, req) diff --git a/provider/pkg/provider/client_test.go b/provider/pkg/provider/client_test.go index 1c0564c..ab3e291 100644 --- a/provider/pkg/provider/client_test.go +++ b/provider/pkg/provider/client_test.go @@ -40,8 +40,7 @@ func TestRetryInterceptor_SuccessOnFirstAttempt(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -51,6 +50,27 @@ func TestRetryInterceptor_SuccessOnFirstAttempt(t *testing.T) { } } +// fakeProcedureRequest wraps a connect request and reports a Get-style +// procedure, since retryInterceptor only retries idempotent (read) RPCs. +type fakeProcedureRequest struct { + connect.AnyRequest + procedure string +} + +func (f *fakeProcedureRequest) Spec() connect.Spec { + return connect.Spec{Procedure: f.procedure} +} + +func newIdempotentRequest() connect.AnyRequest { + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + return &fakeProcedureRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sService/GetCluster"} +} + +func newMutatingRequest() connect.AnyRequest { + req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) + return &fakeProcedureRequest{AnyRequest: connect.NewRequest(req), procedure: "/api.v1.K8sRecommendationService/CreateNodePolicies"} +} + func TestRetryInterceptor_RetriesOnUnavailable(t *testing.T) { calls := 0 next := func(_ context.Context, _ connect.AnyRequest) (connect.AnyResponse, error) { @@ -61,8 +81,7 @@ func TestRetryInterceptor_RetriesOnUnavailable(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -79,8 +98,7 @@ func TestRetryInterceptor_DoesNotRetryOnPermissionDenied(t *testing.T) { return nil, connect.NewError(connect.CodePermissionDenied, errors.New("forbidden")) } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err == nil { t.Fatal("expected error, got nil") @@ -97,8 +115,7 @@ func TestRetryInterceptor_ExhaustsAllAttempts(t *testing.T) { return nil, connect.NewError(connect.CodeUnavailable, errors.New("always down")) } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err == nil { t.Fatal("expected error after exhausting retries") @@ -142,8 +159,7 @@ func TestRetryInterceptor_RetriesOnDeadlineExceeded(t *testing.T) { return nil, nil } - req, _ := http.NewRequest(http.MethodPost, "http://example.com", nil) - _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), connect.NewRequest(req)) + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newIdempotentRequest()) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -191,3 +207,21 @@ func TestClientsetGetSet(t *testing.T) { t.Error("Get should return the set ClientSet") } } + +// A transient failure on a mutating RPC must NOT be retried: if the first +// attempt landed server-side, a retry would create a duplicate resource. +func TestRetryInterceptor_DoesNotRetryMutations(t *testing.T) { + calls := 0 + next := func(_ context.Context, _ connect.AnyRequest) (connect.AnyResponse, error) { + calls++ + return nil, connect.NewError(connect.CodeUnavailable, errors.New("service down")) + } + + _, err := retryInterceptor(3, time.Millisecond)(next)(context.Background(), newMutatingRequest()) + if err == nil { + t.Fatal("expected error") + } + if calls != 1 { + t.Errorf("expected exactly 1 call for a mutating RPC, got %d", calls) + } +} diff --git a/provider/pkg/resources/cluster.go b/provider/pkg/resources/cluster.go index ae37c48..3e69425 100644 --- a/provider/pkg/resources/cluster.go +++ b/provider/pkg/resources/cluster.go @@ -25,7 +25,7 @@ type ClusterState struct { // Annotate provides descriptions for SDK documentation and marks secret fields. func (s *ClusterState) Annotate(a infer.Annotator) { a.Describe(&s.Name, "The name of the cluster.") - a.Describe(&s.Token, "Authentication token for the cluster. Rotated automatically if empty on update (e.g. after import).") + a.Describe(&s.Token, "Bearer token minted for the cluster at creation. Not retrievable afterwards; imported clusters have an empty token (rotate it deliberately from the DevZero UI if you need it in state).") } // Cluster is the resource implementation. @@ -77,12 +77,15 @@ func (c *Cluster) Read(ctx context.Context, req infer.ReadRequest[ClusterArgs, C ClusterId: req.ID, })) if err != nil { + if isNotFound(err) { + // Deleted out of band — drop from state. + return infer.ReadResponse[ClusterArgs, ClusterState]{}, nil + } return infer.ReadResponse[ClusterArgs, ClusterState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetCluster: %w", err) } if resp.Msg.Cluster == nil { - return infer.ReadResponse[ClusterArgs, ClusterState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetCluster: cluster not found") + return infer.ReadResponse[ClusterArgs, ClusterState]{}, nil } // Prefer CustomName (user-set); fall back to the system-assigned Name. @@ -103,7 +106,6 @@ func (c *Cluster) Read(ctx context.Context, req infer.ReadRequest[ClusterArgs, C } // Update calls ClusterMutationService.UpdateCluster. -// If the existing token is empty (e.g. after import), it also calls ResetClusterToken. func (c *Cluster) Update(ctx context.Context, req infer.UpdateRequest[ClusterArgs, ClusterState]) (infer.UpdateResponse[ClusterState], error) { if req.DryRun { return infer.UpdateResponse[ClusterState]{Output: ClusterState{ClusterArgs: req.Inputs, Token: req.State.Token}}, nil @@ -126,26 +128,21 @@ func (c *Cluster) Update(ctx context.Context, req infer.UpdateRequest[ClusterArg return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("UpdateCluster: empty response from server") } - token := req.State.Token - // Rotate the token if it is empty — this happens after `pulumi import`. - if token == "" { - resetResp, err := cs.ClusterMutationClient.ResetClusterToken(ctx, connect.NewRequest(&apiv1.ResetClusterTokenRequest{ - TeamId: cs.TeamID, - ClusterId: req.ID, - })) - if err != nil { - return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("ResetClusterToken: %w", err) - } - if resetResp.Msg.Token == "" { - return infer.UpdateResponse[ClusterState]{}, fmt.Errorf("ResetClusterToken: server returned empty token") - } - token = resetResp.Msg.Token + // NOTE: the token is intentionally never rotated here. Rotating on update + // (the previous behavior when state had no token, e.g. after `pulumi + // import`) silently invalidated the credential the running in-cluster + // agent was using whenever an unrelated field changed. An imported + // cluster therefore has an empty token; rotate it deliberately from the + // DevZero UI (or by recreating the resource) if you need it in state. + name := updateResp.Msg.Cluster.CustomName + if name == "" { + name = updateResp.Msg.Cluster.Name } return infer.UpdateResponse[ClusterState]{ Output: ClusterState{ - ClusterArgs: ClusterArgs{Name: updateResp.Msg.Cluster.CustomName}, - Token: token, + ClusterArgs: ClusterArgs{Name: name}, + Token: req.State.Token, }, }, nil } @@ -161,7 +158,7 @@ func (c *Cluster) Delete(ctx context.Context, req infer.DeleteRequest[ClusterSta TeamId: cs.TeamID, ClusterId: req.ID, })) - if err != nil { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteCluster: %w", err) } return infer.DeleteResponse{}, nil diff --git a/provider/pkg/resources/cluster_test.go b/provider/pkg/resources/cluster_test.go index 2fa2cf4..948c42f 100644 --- a/provider/pkg/resources/cluster_test.go +++ b/provider/pkg/resources/cluster_test.go @@ -237,32 +237,41 @@ func TestCluster_Update_Success(t *testing.T) { } } -func TestCluster_Update_RotatesTokenWhenEmpty(t *testing.T) { +// The provider must never rotate the cluster token as a side effect of an +// unrelated update — that would silently invalidate the credential the +// running in-cluster agent is using. An imported cluster keeps an empty token. +func TestCluster_Update_DoesNotRotateToken(t *testing.T) { + rotated := false mut := &mockMutationClient{ - updateFn: func(_ context.Context, req *connect.Request[apiv1.UpdateClusterRequest]) (*connect.Response[apiv1.UpdateClusterResponse], error) { + updateFn: func(_ context.Context, _ *connect.Request[apiv1.UpdateClusterRequest]) (*connect.Response[apiv1.UpdateClusterResponse], error) { return connect.NewResponse(&apiv1.UpdateClusterResponse{ - Cluster: &apiv1.Cluster{CustomName: req.Msg.ClusterName}, + Cluster: &apiv1.Cluster{Id: "cluster-123", CustomName: "renamed"}, }), nil }, resetTokenFn: func(_ context.Context, _ *connect.Request[apiv1.ResetClusterTokenRequest]) (*connect.Response[apiv1.ResetClusterTokenResponse], error) { - return connect.NewResponse(&apiv1.ResetClusterTokenResponse{Token: "new-rotated-token"}), nil + rotated = true + return connect.NewResponse(&apiv1.ResetClusterTokenResponse{Token: "new-token"}), nil }, } withMockClientSet(t, mut, &mockK8SClient{}) c := &Cluster{} - // State.Token is empty — triggers rotation resp, err := c.Update(context.Background(), infer.UpdateRequest[ClusterArgs, ClusterState]{ ID: "cluster-123", - State: ClusterState{ClusterArgs: ClusterArgs{Name: "name"}, Token: ""}, - Inputs: ClusterArgs{Name: "name"}, + Inputs: ClusterArgs{Name: "renamed"}, + State: ClusterState{ClusterArgs: ClusterArgs{Name: "old"}, Token: ""}, }) - if err != nil { t.Fatalf("unexpected error: %v", err) } - if resp.Output.Token != "new-rotated-token" { - t.Errorf("token: got %q, want %q", resp.Output.Token, "new-rotated-token") + if rotated { + t.Fatal("expected token NOT to be rotated on update") + } + if resp.Output.Token != "" { + t.Fatalf("expected the (empty) state token to be preserved, got %q", resp.Output.Token) + } + if resp.Output.Name != "renamed" { + t.Fatalf("Name: got %q", resp.Output.Name) } } @@ -313,7 +322,7 @@ func TestCluster_Delete_Success(t *testing.T) { func TestCluster_Delete_APIError(t *testing.T) { mut := &mockMutationClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteClusterRequest]) (*connect.Response[apiv1.DeleteClusterResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockClientSet(t, mut, &mockK8SClient{}) diff --git a/provider/pkg/resources/fake_server_test.go b/provider/pkg/resources/fake_server_test.go new file mode 100644 index 0000000..347b5de --- /dev/null +++ b/provider/pkg/resources/fake_server_test.go @@ -0,0 +1,673 @@ +package resources + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "sync" + "testing" + + "connectrpc.com/connect" + "github.com/pulumi/pulumi-go-provider/infer" + + apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" + apiv1connect "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1/apiv1connect" + "github.com/devzero-inc/pulumi-provider-devzero/provider/pkg/clientset" +) + +// --------------------------------------------------------------------------- +// Fake backend: an in-memory connect server mimicking the dakr semantics that +// matter to CRUD correctness (upsert keys, NotFound codes, node-policy-target +// invariants, fields.disabled rejection on rule update, virtual +// source=="cluster" policies mixed into ListNodePolicies). +// --------------------------------------------------------------------------- + +type fakeBackend struct { + apiv1connect.UnimplementedK8SRecommendationServiceHandler + apiv1connect.UnimplementedK8SServiceHandler + apiv1connect.UnimplementedClusterMutationServiceHandler + + mu sync.Mutex + nextID int + 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 +} + +func newFakeBackend() *fakeBackend { + return &fakeBackend{ + 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{}, + } +} + +func (f *fakeBackend) id(prefix string) string { + f.nextID++ + return fmt.Sprintf("%s-%04d", prefix, f.nextID) +} + +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 +} + +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")) + } + f.nodeTgt[t.TargetId] = t + return connect.NewResponse(&apiv1.UpdateNodePolicyTargetResponse{Target: t}), nil +} + +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) 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 +} + +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, + ClusterIds: req.Msg.ClusterIds, + } + t.NodeGroupNames = req.Msg.NodeGroupNames //nolint:staticcheck // deprecated upstream but still round-tripped + 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 +} + +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 { + 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, + Status: "active", + SyncStatus: "pending", + Generation: 1, + } + switch req.Msg.Source { + case apiv1.WorkloadRuleSource_WORKLOAD_RULE_SOURCE_PULUMI_AUTO: + rule.CurrentSource = "pulumi_auto" + default: + rule.CurrentSource = "pulumi_manual" + } + 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 (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 withFakeServer(t *testing.T) *fakeBackend { + t.Helper() + fake := newFakeBackend() + 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) + + prev := clientset.Get() + clientset.Set(&clientset.ClientSet{ + TeamID: "team-1", + Token: "test-token", + ClusterMutationClient: apiv1connect.NewClusterMutationServiceClient(srv.Client(), srv.URL), + K8SClient: apiv1connect.NewK8SServiceClient(srv.Client(), srv.URL), + RecommendationClient: apiv1connect.NewK8SRecommendationServiceClient(srv.Client(), srv.URL), + ClusterServiceClient: apiv1connect.NewClusterServiceClient(srv.Client(), srv.URL), + }) + t.Cleanup(func() { clientset.Set(prev) }) + return fake +} + +// --------------------------------------------------------------------------- +// Lifecycle tests +// --------------------------------------------------------------------------- + +func TestLifecycle_NodePolicy(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicy{} + + args := NodePolicyArgs{ + Name: "azure-pool", + Azure: &AzureNodeClassSpecArgs{ + VnetSubnetId: "/subscriptions/x/subnet/y", + }, + Taints: []TaintArgs{{Key: "dedicated", Value: "gpu", Effect: "NoSchedule"}}, + } + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected an ID") + } + if created.Output.Azure == nil || created.Output.Azure.VnetSubnetId != "/subscriptions/x/subnet/y" { + t.Fatalf("azure block not round-tripped: %+v", created.Output.Azure) + } + if len(created.Output.Taints) != 1 || created.Output.Taints[0].Key != "dedicated" { + t.Fatalf("taints not round-tripped: %+v", created.Output.Taints) + } + + // Read refreshes and must skip the virtual source=="cluster" policy. + read, err := n.Read(ctx, infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ + ID: created.ID, Inputs: args, State: created.Output, + }) + if err != nil { + t.Fatalf("Read: %v", err) + } + if read.ID != created.ID { + t.Fatalf("Read ID: got %q", read.ID) + } + + // Out-of-band deletion drops from state. + fake.mu.Lock() + delete(fake.nodePol, created.ID) + fake.mu.Unlock() + gone, err := n.Read(ctx, infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ID: created.ID, Inputs: args, State: created.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } + + // Recreate; Delete must hit the API and be idempotent. + created, err = n.Create(ctx, infer.CreateRequest[NodePolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("re-Create: %v", err) + } + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + fake.mu.Lock() + _, still := fake.nodePol[created.ID] + fake.mu.Unlock() + if still { + t.Fatal("Delete did not remove the policy from the backend") + } + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} + +func TestLifecycle_NodePolicyTarget(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicyTarget{} + + args := NodePolicyTargetArgs{ + Name: "target-1", + PolicyId: "np-0001", + ClusterIds: []string{"cluster-1"}, + } + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyTargetArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected target id") + } + + // Destroy disables (no delete RPC exists). + if _, err := n.Delete(ctx, infer.DeleteRequest[NodePolicyTargetState]{ID: created.ID, State: created.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + fake.mu.Lock() + tgt := fake.nodeTgt[created.ID] + fake.mu.Unlock() + if tgt == nil { + t.Fatal("target should still exist backend-side") + } + if tgt.Enabled { + t.Fatal("Delete must disable the target") + } +} + +func TestLifecycle_WorkloadPolicy(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadPolicy{} + + tp := 0.75 + args := WorkloadPolicyArgs{ + Name: "policy-1", + CpuVerticalScaling: &VerticalScalingArgs{ + Enabled: true, + TargetPercentile: &tp, + }, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadPolicyArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.Output.CpuVerticalScaling == nil || created.Output.CpuVerticalScaling.TargetPercentile == nil || + *created.Output.CpuVerticalScaling.TargetPercentile != 0.75 { + t.Fatalf("targetPercentile did not round-trip exactly: %+v", created.Output.CpuVerticalScaling) + } + + // Out-of-band delete → drop from state. + fake.mu.Lock() + delete(fake.wp, created.ID) + fake.mu.Unlock() + gone, err := w.Read(ctx, infer.ReadRequest[WorkloadPolicyArgs, WorkloadPolicyState]{ID: created.ID, Inputs: args, State: created.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } +} + +func TestLifecycle_WorkloadRule(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadRule{} + + minReq := 10 + args := WorkloadRuleArgs{ + ClusterID: "cluster-1", + Namespace: "prod", + Kind: "Deployment", + Name: "api", + CpuRule: &ResourceRuleConfigArgs{Enabled: true, MinRequest: &minReq}, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadRuleArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + if created.ID == "" { + t.Fatal("expected rule id") + } + + // Update flipping `disabled` must go through the toggle RPC (the fake + // rejects fields.disabled on update, mirroring dakr). + disabled := true + updatedArgs := args + updatedArgs.Disabled = &disabled + updated, err := w.Update(ctx, infer.UpdateRequest[WorkloadRuleArgs, WorkloadRuleState]{ + ID: created.ID, Inputs: updatedArgs, State: created.Output, + }) + if err != nil { + t.Fatalf("Update: %v", err) + } + if updated.Output.Disabled == nil || !*updated.Output.Disabled { + t.Fatalf("expected disabled=true in output, got %+v", updated.Output.Disabled) + } + fake.mu.Lock() + rule := fake.rules[created.ID] + fake.mu.Unlock() + if rule == nil || !rule.Disabled { + t.Fatalf("expected rule disabled via toggle RPC, got %+v", rule) + } + + // Delete + idempotent delete. + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadRuleState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete: %v", err) + } + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadRuleState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} + +// Round-trip guard for the enabled default: omitting `enabled` must create an +// ENABLED target (the API stores the proto bool verbatim). +func TestLifecycle_NodePolicyTarget_EnabledDefaultsTrue(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + n := &NodePolicyTarget{} + + created, err := n.Create(ctx, infer.CreateRequest[NodePolicyTargetArgs]{Inputs: NodePolicyTargetArgs{ + Name: "defaults", + PolicyId: "np-0001", + ClusterIds: []string{"c-1"}, + // Enabled omitted. + }}) + if err != nil { + t.Fatalf("Create: %v", err) + } + fake.mu.Lock() + tgt := fake.nodeTgt[created.ID] + fake.mu.Unlock() + if tgt == nil || !tgt.Enabled { + t.Fatalf("expected the target to be created enabled, got %+v", tgt) + } +} + +func TestLifecycle_WorkloadPolicyTarget(t *testing.T) { + ctx := context.Background() + fake := withFakeServer(t) + w := &WorkloadPolicyTarget{} + + desc := "team a targets" + args := WorkloadPolicyTargetArgs{ + Name: "t1", + PolicyId: "wp-0001", + ClusterIds: []string{"c1"}, + Description: &desc, + KindFilter: []string{"Deployment"}, + KindFilterNotIn: []string{"CronJob"}, + WorkloadNamesNotIn: []string{"excluded"}, + AnnotationSelector: &LabelSelectorArgs{MatchLabels: map[string]string{"team": "a"}}, + } + + created, err := w.Create(ctx, infer.CreateRequest[WorkloadPolicyTargetArgs]{Inputs: args}) + if err != nil { + t.Fatalf("Create: %v", err) + } + out := created.Output + if out.AnnotationSelector == nil || out.AnnotationSelector.MatchLabels["team"] != "a" { + t.Fatalf("annotationSelector did not round-trip: %+v", out.AnnotationSelector) + } + if len(out.KindFilterNotIn) != 1 || len(out.WorkloadNamesNotIn) != 1 { + t.Fatalf("notIn filters did not round-trip: %+v", out) + } + if out.Enabled == nil || !*out.Enabled { + t.Fatal("enabled must default to true") + } + + // Update: disable + rename. + disabled := false + updatedArgs := args + updatedArgs.Name = "t1-renamed" + updatedArgs.Enabled = &disabled + updated, err := w.Update(ctx, infer.UpdateRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ + ID: created.ID, Inputs: updatedArgs, State: created.Output, + }) + if err != nil { + t.Fatalf("Update: %v", err) + } + if updated.Output.Name != "t1-renamed" || updated.Output.Enabled == nil || *updated.Output.Enabled { + t.Fatalf("update did not round-trip: %+v", updated.Output) + } + fake.mu.Lock() + stored := fake.wpt[created.ID] + fake.mu.Unlock() + if stored == nil || stored.Name != "t1-renamed" || stored.Enabled { + t.Fatalf("update not propagated backend-side: %+v", stored) + } + + // Out-of-band delete → Read drops from state; Delete tolerates NotFound. + fake.mu.Lock() + delete(fake.wpt, created.ID) + fake.mu.Unlock() + gone, err := w.Read(ctx, infer.ReadRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: created.ID, Inputs: updatedArgs, State: updated.Output}) + if err != nil { + t.Fatalf("Read after out-of-band delete: %v", err) + } + if gone.ID != "" { + t.Fatalf("expected drop-from-state, got ID %q", gone.ID) + } + if _, err := w.Delete(ctx, infer.DeleteRequest[WorkloadPolicyTargetState]{ID: created.ID, State: updated.Output}); err != nil { + t.Fatalf("Delete (already gone): %v", err) + } +} diff --git a/provider/pkg/resources/get_cluster_id_by_name.go b/provider/pkg/resources/get_cluster_id_by_name.go index ccda7d9..e965ca9 100644 --- a/provider/pkg/resources/get_cluster_id_by_name.go +++ b/provider/pkg/resources/get_cluster_id_by_name.go @@ -56,9 +56,9 @@ func (f *GetClusterIdByName) Invoke(ctx context.Context, req infer.FunctionReque } rpcReq := &apiv1.GetClusterIDByNameRequest{ - TeamId: teamID, - Name: req.Input.Name, - Region: req.Input.Region, + TeamId: teamID, + Name: req.Input.Name, + Region: req.Input.Region, CloudProvider: req.Input.CloudProvider, } if req.Input.Liveness != nil { @@ -80,4 +80,4 @@ func (f *GetClusterIdByName) Invoke(ctx context.Context, req infer.FunctionReque return infer.FunctionResponse[GetClusterIDByNameResult]{ Output: GetClusterIDByNameResult{ClusterID: resp.Msg.Id}, }, nil -} \ No newline at end of file +} diff --git a/provider/pkg/resources/get_cluster_id_by_name_test.go b/provider/pkg/resources/get_cluster_id_by_name_test.go index 9ebd798..2956d80 100644 --- a/provider/pkg/resources/get_cluster_id_by_name_test.go +++ b/provider/pkg/resources/get_cluster_id_by_name_test.go @@ -234,4 +234,4 @@ func TestGetClusterIDByName_InvalidLiveness(t *testing.T) { if err == nil { t.Fatal("expected error for invalid liveness value") } -} \ No newline at end of file +} diff --git a/provider/pkg/resources/node_policy.go b/provider/pkg/resources/node_policy.go index 38aaf1e..7ef15c0 100644 --- a/provider/pkg/resources/node_policy.go +++ b/provider/pkg/resources/node_policy.go @@ -298,6 +298,8 @@ type AzureNodeClassSpecArgs struct { Tags map[string]string `pulumi:"tags,optional"` Kubelet *AzureKubeletConfigurationArgs `pulumi:"kubelet,optional"` MaxPods *int `pulumi:"maxPods,optional"` + // Pinned node image version. Requires the DevZero node operator >= 1.8.4. + ImageVersion *string `pulumi:"imageVersion,optional"` } // Annotate provides SDK documentation for AzureNodeClassSpecArgs fields. @@ -345,8 +347,9 @@ type NodePolicyArgs struct { OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems,optional"` // Node metadata - Labels map[string]string `pulumi:"labels,optional"` - Taints []TaintArgs `pulumi:"taints,optional"` + Labels map[string]string `pulumi:"labels,optional"` + Taints []TaintArgs `pulumi:"taints,optional"` + StartupTaints []TaintArgs `pulumi:"startupTaints,optional"` // Policy configuration Disruption *DisruptionPolicyArgs `pulumi:"disruption,optional"` @@ -360,6 +363,15 @@ type NodePolicyArgs struct { Aws *AWSNodeClassSpecArgs `pulumi:"aws,optional"` Azure *AzureNodeClassSpecArgs `pulumi:"azure,optional"` + // AWS-only: behavior during an ARC zonal shift. + ZonalShift *ZonalShiftConfigArgs `pulumi:"zonalShift,optional"` + // AWS-only: ephemeral NVMe storage per node in GiB (karpenter.k8s.aws/instance-local-nvme). + InstanceLocalNvme *LabelSelectorArgs `pulumi:"instanceLocalNvme,optional"` + // Informational: 1 = AWS, 2 = Azure, 3 = GCP, 4 = OCI. Compilation always uses the target cluster's provider. + CloudProviderId *int `pulumi:"cloudProviderId,optional"` + // AWS fallback for aws.role when neither role nor instanceProfile is set. + MasterOverrideRoleName *string `pulumi:"masterOverrideRoleName,optional"` + // Raw Karpenter YAML (escape hatch for full customization) Raw []RawKarpenterSpecArgs `pulumi:"raw,optional"` } @@ -444,7 +456,14 @@ func (n *NodePolicy) Read(ctx context.Context, req infer.ReadRequest[NodePolicyA fmt.Errorf("ListNodePolicies: %w", err) } + // ListNodePolicies also returns read-only virtual policies mirrored from + // non-dakr Karpenter resources; skip exactly those (source == "cluster") + // rather than any unknown source, so a future backend source tag cannot + // silently orphan a managed policy. for _, p := range resp.Msg.Policies { + if p.Source == "cluster" { + continue + } if p.Id == req.ID { updatedArgs := nodePolicyProtoToArgs(p) return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{ @@ -455,8 +474,9 @@ func (n *NodePolicy) Read(ctx context.Context, req infer.ReadRequest[NodePolicyA } } - return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("ListNodePolicies: policy %q not found", req.ID) + // Deleted out of band — return an empty response so the engine drops the + // resource from state instead of failing the refresh. + return infer.ReadResponse[NodePolicyArgs, NodePolicyState]{}, nil } func (n *NodePolicy) Update(ctx context.Context, req infer.UpdateRequest[NodePolicyArgs, NodePolicyState]) (infer.UpdateResponse[NodePolicyState], error) { @@ -485,8 +505,21 @@ func (n *NodePolicy) Update(ctx context.Context, req infer.UpdateRequest[NodePol }, nil } -// Delete removes the resource from Pulumi state only — no delete endpoint exists for NodePolicy. -func (n *NodePolicy) Delete(_ context.Context, _ infer.DeleteRequest[NodePolicyState]) (infer.DeleteResponse, error) { +// Delete removes the node policy via DeleteNodePolicy (which also cascades +// its targets server-side). A policy already gone is treated as deleted. +func (n *NodePolicy) Delete(ctx context.Context, req infer.DeleteRequest[NodePolicyState]) (infer.DeleteResponse, error) { + cs := clientset.Get() + if cs == nil { + return infer.DeleteResponse{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") + } + + _, err := cs.RecommendationClient.DeleteNodePolicy(ctx, connect.NewRequest(&apiv1.DeleteNodePolicyRequest{ + TeamId: cs.TeamID, + PolicyId: req.ID, + })) + if err != nil && !isNotFound(err) { + return infer.DeleteResponse{}, fmt.Errorf("DeleteNodePolicy: %w", err) + } return infer.DeleteResponse{}, nil } @@ -513,15 +546,31 @@ func nodePolicyArgsToProto(teamID, id string, a NodePolicyArgs) *apiv1.NodePolic CapacityTypes: labelSelectorToProto(a.CapacityTypes), OperatingSystems: labelSelectorToProto(a.OperatingSystems), Taints: taintsToProto(a.Taints), + StartupTaints: taintsToProto(a.StartupTaints), Disruption: disruptionPolicyToProto(a.Disruption), Limits: resourceLimitsToProto(a.Limits), Aws: awsNodeClassSpecToProto(a.Aws), Azure: azureNodeClassSpecToProto(a.Azure), Raw: rawKarpenterSpecsToProto(a.Raw), + InstanceLocalNvme: labelSelectorToProto(a.InstanceLocalNvme), } if a.Description != nil { p.Description = *a.Description } + if a.ZonalShift != nil { + p.ZonalShift = &apiv1.ZonalShiftConfig{ + RespectZonalShift: a.ZonalShift.RespectZonalShift, + EvictImpactedNodes: a.ZonalShift.EvictImpactedNodes, + AllowZoneFallback: a.ZonalShift.AllowZoneFallback, + } + } + if a.CloudProviderId != nil { + v := int64(*a.CloudProviderId) + p.CloudProviderId = &v + } + if a.MasterOverrideRoleName != nil { + p.MasterOverrideRoleName = *a.MasterOverrideRoleName + } return p } @@ -544,18 +593,38 @@ func nodePolicyProtoToArgs(p *apiv1.NodePolicy) NodePolicyArgs { CapacityTypes: labelSelectorFromProto(p.CapacityTypes), OperatingSystems: labelSelectorFromProto(p.OperatingSystems), Taints: taintsFromProto(p.Taints), + StartupTaints: taintsFromProto(p.StartupTaints), Disruption: disruptionPolicyFromProto(p.Disruption), Limits: resourceLimitsFromProto(p.Limits), Aws: awsNodeClassSpecFromProto(p.Aws), Azure: azureNodeClassSpecFromProto(p.Azure), Raw: rawKarpenterSpecsFromProto(p.Raw), + InstanceLocalNvme: labelSelectorFromProto(p.InstanceLocalNvme), } if p.Description != "" { a.Description = &p.Description } + if p.ZonalShift != nil { + a.ZonalShift = &ZonalShiftConfigArgs{ + RespectZonalShift: p.ZonalShift.RespectZonalShift, + EvictImpactedNodes: p.ZonalShift.EvictImpactedNodes, + AllowZoneFallback: p.ZonalShift.AllowZoneFallback, + } + } + a.CloudProviderId = int64PtrToIntPtr(p.CloudProviderId) + if p.MasterOverrideRoleName != "" { + a.MasterOverrideRoleName = &p.MasterOverrideRoleName + } return a } +// ZonalShiftConfigArgs configures behavior during an AWS ARC zonal shift (AWS only). +type ZonalShiftConfigArgs struct { + RespectZonalShift bool `pulumi:"respectZonalShift,optional"` + EvictImpactedNodes bool `pulumi:"evictImpactedNodes,optional"` + AllowZoneFallback bool `pulumi:"allowZoneFallback,optional"` +} + // ---------- taint helpers ---------- func taintsToProto(taints []TaintArgs) []*apiv1.Taint { @@ -1037,6 +1106,9 @@ func azureNodeClassSpecToProto(a *AzureNodeClassSpecArgs) *apiv1.AzureNodeClassS v := int32(*a.MaxPods) spec.MaxPods = &v } + if a.ImageVersion != nil { + spec.ImageVersion = a.ImageVersion + } return spec } @@ -1065,6 +1137,7 @@ func azureNodeClassSpecFromProto(spec *apiv1.AzureNodeClassSpec) *AzureNodeClass v := int(*spec.MaxPods) a.MaxPods = &v } + a.ImageVersion = spec.ImageVersion return a } diff --git a/provider/pkg/resources/node_policy_target.go b/provider/pkg/resources/node_policy_target.go index a315ead..3b347f6 100644 --- a/provider/pkg/resources/node_policy_target.go +++ b/provider/pkg/resources/node_policy_target.go @@ -17,7 +17,7 @@ type NodePolicyTargetArgs struct { PolicyId string `pulumi:"policyId"` ClusterIds []string `pulumi:"clusterIds"` Description *string `pulumi:"description,optional"` - Enabled bool `pulumi:"enabled,optional"` + Enabled *bool `pulumi:"enabled,optional"` } // NodePolicyTargetState is the full persisted state (identical to args — no additional computed fields). @@ -29,17 +29,31 @@ type NodePolicyTargetState struct { func (s *NodePolicyTargetState) Annotate(a infer.Annotator) { a.Describe(&s.Name, "Human-friendly name for the target.") a.Describe(&s.PolicyId, "Node policy ID this target is attached to.") - a.Describe(&s.ClusterIds, "Cluster IDs where this node policy applies.") + a.Describe(&s.ClusterIds, "Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster.") a.Describe(&s.Description, "Free-form description of the target.") a.Describe(&s.Enabled, "Whether this target is active. Defaults to true.") + a.SetDefault(&s.Enabled, true) } // NodePolicyTarget is the resource implementation. type NodePolicyTarget struct{} +func validateNodePolicyTargetArgs(a NodePolicyTargetArgs) error { + if len(a.ClusterIds) == 0 { + return fmt.Errorf("clusterIds must name exactly one cluster") + } + if len(a.ClusterIds) > 1 { + return fmt.Errorf("clusterIds names %d clusters, but the DevZero API accepts at most one cluster per node policy target; create one target per cluster", len(a.ClusterIds)) + } + return nil +} + // ---------- CRUD ---------- func (n *NodePolicyTarget) Create(ctx context.Context, req infer.CreateRequest[NodePolicyTargetArgs]) (infer.CreateResponse[NodePolicyTargetState], error) { + if err := validateNodePolicyTargetArgs(req.Inputs); err != nil { + return infer.CreateResponse[NodePolicyTargetState]{}, err + } if req.DryRun { return infer.CreateResponse[NodePolicyTargetState]{Output: NodePolicyTargetState{NodePolicyTargetArgs: req.Inputs}}, nil } @@ -92,11 +106,15 @@ func (n *NodePolicyTarget) Read(ctx context.Context, req infer.ReadRequest[NodeP } } - return infer.ReadResponse[NodePolicyTargetArgs, NodePolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("ListNodePolicyTargets: target %q not found", req.ID) + // Deleted out of band — return an empty response so the engine drops the + // resource from state instead of failing the refresh. + return infer.ReadResponse[NodePolicyTargetArgs, NodePolicyTargetState]{}, nil } func (n *NodePolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]) (infer.UpdateResponse[NodePolicyTargetState], error) { + if err := validateNodePolicyTargetArgs(req.Inputs); err != nil { + return infer.UpdateResponse[NodePolicyTargetState]{}, err + } if req.DryRun { return infer.UpdateResponse[NodePolicyTargetState]{Output: NodePolicyTargetState{NodePolicyTargetArgs: req.Inputs}}, nil } @@ -121,21 +139,42 @@ func (n *NodePolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[N }, nil } -// Delete removes the resource from Pulumi state only — no delete endpoint exists for NodePolicyTarget. -func (n *NodePolicyTarget) Delete(_ context.Context, _ infer.DeleteRequest[NodePolicyTargetState]) (infer.DeleteResponse, error) { +// Delete disables the target. The API has no DeleteNodePolicyTarget RPC, and +// leaving the target enabled would keep applying the node policy after +// `pulumi destroy`, so the target is disabled and removed from state (the row +// itself remains in the backend). +func (n *NodePolicyTarget) Delete(ctx context.Context, req infer.DeleteRequest[NodePolicyTargetState]) (infer.DeleteResponse, error) { + cs := clientset.Get() + if cs == nil { + return infer.DeleteResponse{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") + } + + target := nodePolicyTargetArgsToProto(cs.TeamID, req.ID, req.State.NodePolicyTargetArgs) + target.Enabled = false + + _, err := cs.RecommendationClient.UpdateNodePolicyTarget(ctx, connect.NewRequest(&apiv1.UpdateNodePolicyTargetRequest{ + Target: target, + })) + if err != nil && !isNotFound(err) { + return infer.DeleteResponse{}, fmt.Errorf("disable node policy target on destroy: %w", err) + } return infer.DeleteResponse{}, nil } // ---------- proto conversion ---------- func nodePolicyTargetArgsToProto(teamID, id string, a NodePolicyTargetArgs) *apiv1.NodePolicyTarget { + enabled := true + if a.Enabled != nil { + enabled = *a.Enabled + } t := &apiv1.NodePolicyTarget{ TargetId: id, TeamId: teamID, Name: a.Name, PolicyId: a.PolicyId, ClusterIds: a.ClusterIds, - Enabled: a.Enabled, + Enabled: enabled, } if a.Description != nil { t.Description = *a.Description @@ -144,11 +183,12 @@ func nodePolicyTargetArgsToProto(teamID, id string, a NodePolicyTargetArgs) *api } func nodePolicyTargetProtoToArgs(t *apiv1.NodePolicyTarget) NodePolicyTargetArgs { + enabled := t.Enabled a := NodePolicyTargetArgs{ Name: t.Name, PolicyId: t.PolicyId, ClusterIds: t.ClusterIds, - Enabled: t.Enabled, + Enabled: &enabled, } if t.Description != "" { a.Description = &t.Description diff --git a/provider/pkg/resources/node_policy_target_test.go b/provider/pkg/resources/node_policy_target_test.go index 4de9490..9e83b64 100644 --- a/provider/pkg/resources/node_policy_target_test.go +++ b/provider/pkg/resources/node_policy_target_test.go @@ -58,7 +58,7 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { if tgt.TeamId != "team-test" { t.Errorf("TeamId: got %q, want %q", tgt.TeamId, "team-test") } - if len(tgt.ClusterIds) != 2 { + if len(tgt.ClusterIds) != 1 { t.Errorf("ClusterIds: got %v", tgt.ClusterIds) } if !tgt.Enabled { @@ -71,7 +71,7 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { Name: "prod-target", PolicyId: "np-123", TeamId: "team-test", - ClusterIds: []string{"c-1", "c-2"}, + ClusterIds: []string{"c-1"}, Enabled: true, }, }, @@ -86,8 +86,8 @@ func TestNodePolicyTarget_Create_Success(t *testing.T) { Inputs: NodePolicyTargetArgs{ Name: "prod-target", PolicyId: "np-123", - ClusterIds: []string{"c-1", "c-2"}, - Enabled: true, + ClusterIds: []string{"c-1"}, + Enabled: boolPtr(true), }, }) if err != nil { @@ -242,7 +242,7 @@ func TestNodePolicyTarget_Read_Success(t *testing.T) { if resp.State.PolicyId != "np-123" { t.Errorf("PolicyId: got %q, want %q", resp.State.PolicyId, "np-123") } - if !resp.State.Enabled { + if resp.State.Enabled == nil || !*resp.State.Enabled { t.Error("Enabled should be true") } } @@ -258,9 +258,12 @@ func TestNodePolicyTarget_Read_NotFound(t *testing.T) { withMockNPTClientSet(t, rec) n := &NodePolicyTarget{} - _, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ID: "npt-missing"}) - if err == nil { - t.Fatal("expected error for not-found, got nil") + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ID: "npt-missing"}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected empty response (drop from state) for a target deleted out of band, got ID %q", resp.ID) } } @@ -325,7 +328,7 @@ func TestNodePolicyTarget_Update_Success(t *testing.T) { n := &NodePolicyTarget{} resp, err := n.Update(context.Background(), infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ ID: "npt-456", - Inputs: NodePolicyTargetArgs{Name: "updated-target", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: true}, + Inputs: NodePolicyTargetArgs{Name: "updated-target", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: boolPtr(true)}, }) if err != nil { t.Fatalf("unexpected error: %v", err) @@ -351,12 +354,12 @@ func TestNodePolicyTarget_Update_Disable(t *testing.T) { n := &NodePolicyTarget{} resp, err := n.Update(context.Background(), infer.UpdateRequest[NodePolicyTargetArgs, NodePolicyTargetState]{ ID: "npt-456", - Inputs: NodePolicyTargetArgs{Name: "staging", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: false}, + Inputs: NodePolicyTargetArgs{Name: "staging", PolicyId: "np-123", ClusterIds: []string{"c-1"}, Enabled: boolPtr(false)}, }) if err != nil { t.Fatalf("unexpected error: %v", err) } - if resp.Output.Enabled { + if resp.Output.Enabled != nil && *resp.Output.Enabled { t.Error("Enabled should be false after update") } } @@ -429,15 +432,37 @@ func TestNodePolicyTarget_Update_EmptyResponse(t *testing.T) { // ---------- Delete ---------- -func TestNodePolicyTarget_Delete_StateOnly(t *testing.T) { +// The API has no DeleteNodePolicyTarget RPC: destroy must disable the target +// so the node policy stops being applied. +func TestNodePolicyTarget_Delete_DisablesTarget(t *testing.T) { + disabled := false + rec := &mockRecommendationClientNPT{ + updateNodePolicyTargetFn: func(_ context.Context, req *connect.Request[apiv1.UpdateNodePolicyTargetRequest]) (*connect.Response[apiv1.UpdateNodePolicyTargetResponse], error) { + if req.Msg.Target.Enabled { + t.Error("expected the target to be disabled on destroy") + } + disabled = true + return connect.NewResponse(&apiv1.UpdateNodePolicyTargetResponse{Target: req.Msg.Target}), nil + }, + } + withMockNPTClientSet(t, rec) + n := &NodePolicyTarget{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyTargetState]{ - ID: "npt-456", - State: NodePolicyTargetState{}, + ID: "npt-456", + State: NodePolicyTargetState{NodePolicyTargetArgs: NodePolicyTargetArgs{ + Name: "prod-target", + PolicyId: "np-123", + ClusterIds: []string{"c-1"}, + Enabled: boolPtr(true), + }}, }) if err != nil { t.Fatalf("unexpected error: %v", err) } + if !disabled { + t.Fatal("expected UpdateNodePolicyTarget to be called with enabled=false") + } } func TestNodePolicyTarget_Delete_NilClientSet(t *testing.T) { @@ -447,8 +472,8 @@ func TestNodePolicyTarget_Delete_NilClientSet(t *testing.T) { n := &NodePolicyTarget{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyTargetState]{ID: "npt-456"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) + if err == nil { + t.Fatal("expected error when provider is not configured") } } @@ -461,7 +486,7 @@ func TestNodePolicyTarget_ProtoRoundtrip(t *testing.T) { PolicyId: "np-123", ClusterIds: []string{"c-1", "c-2", "c-3"}, Description: &desc, - Enabled: true, + Enabled: boolPtr(true), } proto := nodePolicyTargetArgsToProto("team-abc", "npt-456", input) @@ -497,40 +522,23 @@ func TestNodePolicyTarget_ProtoRoundtrip(t *testing.T) { if got.Description == nil || *got.Description != desc { t.Errorf("Description roundtrip failed") } - if !got.Enabled { + if got.Enabled == nil || !*got.Enabled { t.Error("Enabled roundtrip failed") } } -func TestNodePolicyTarget_MultipleClusterIds(t *testing.T) { - clusterIDs := []string{"c-us-east-1", "c-us-west-2", "c-eu-west-1"} - rec := &mockRecommendationClientNPT{ - createNodePolicyTargetsFn: func(_ context.Context, req *connect.Request[apiv1.CreateNodePolicyTargetsRequest]) (*connect.Response[apiv1.CreateNodePolicyTargetsResponse], error) { - tgt := req.Msg.Targets[0] - if len(tgt.ClusterIds) != 3 { - t.Errorf("expected 3 cluster IDs, got %d: %v", len(tgt.ClusterIds), tgt.ClusterIds) - } - return connect.NewResponse(&apiv1.CreateNodePolicyTargetsResponse{ - Targets: []*apiv1.NodePolicyTarget{ - {TargetId: "npt-multi", Name: "multi-cluster", PolicyId: "np-123", ClusterIds: clusterIDs}, - }, - }), nil - }, - } - withMockNPTClientSet(t, rec) - +// The API accepts at most one cluster per node policy target; the provider +// rejects multi-cluster targets before calling the API. +func TestNodePolicyTarget_MultipleClusterIds_Rejected(t *testing.T) { n := &NodePolicyTarget{} - resp, err := n.Create(context.Background(), infer.CreateRequest[NodePolicyTargetArgs]{ + _, err := n.Create(context.Background(), infer.CreateRequest[NodePolicyTargetArgs]{ Inputs: NodePolicyTargetArgs{ Name: "multi-cluster", PolicyId: "np-123", - ClusterIds: clusterIDs, + ClusterIds: []string{"c-us-east-1", "c-us-west-2", "c-eu-west-1"}, }, }) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - if len(resp.Output.ClusterIds) != 3 { - t.Errorf("ClusterIds: got %v", resp.Output.ClusterIds) + if err == nil { + t.Fatal("expected validation error for multiple cluster IDs") } } diff --git a/provider/pkg/resources/node_policy_test.go b/provider/pkg/resources/node_policy_test.go index c5eeb9e..cc2a5e4 100644 --- a/provider/pkg/resources/node_policy_test.go +++ b/provider/pkg/resources/node_policy_test.go @@ -18,6 +18,11 @@ type mockRecommendationClientNodePolicy struct { createNodePoliciesFn func(context.Context, *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) listNodePoliciesFn func(context.Context, *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) updateNodePolicyFn func(context.Context, *connect.Request[apiv1.UpdateNodePolicyRequest]) (*connect.Response[apiv1.UpdateNodePolicyResponse], error) + deleteNodePolicyFn func(context.Context, *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) +} + +func (m *mockRecommendationClientNodePolicy) DeleteNodePolicy(ctx context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + return m.deleteNodePolicyFn(ctx, req) } func (m *mockRecommendationClientNodePolicy) CreateNodePolicies(ctx context.Context, req *connect.Request[apiv1.CreateNodePoliciesRequest]) (*connect.Response[apiv1.CreateNodePoliciesResponse], error) { @@ -198,11 +203,36 @@ func TestNodePolicy_Read_NotFound(t *testing.T) { withMockNodePolicyClientSet(t, rec) n := &NodePolicy{} - _, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ ID: "np-missing", }) - if err == nil { - t.Fatal("expected error for not-found, got nil") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected empty response (drop from state) for a policy deleted out of band, got ID %q", resp.ID) + } +} + +// ListNodePolicies mixes in read-only virtual policies mirrored from non-dakr +// Karpenter resources (source == "cluster"); Read must never adopt them. +func TestNodePolicy_Read_SkipsClusterSourcedPolicies(t *testing.T) { + rec := &mockRecommendationClientNodePolicy{ + listNodePoliciesFn: func(_ context.Context, _ *connect.Request[apiv1.ListNodePoliciesRequest]) (*connect.Response[apiv1.ListNodePoliciesResponse], error) { + return connect.NewResponse(&apiv1.ListNodePoliciesResponse{ + Policies: []*apiv1.NodePolicy{{Id: "np-virtual", Name: "cluster-managed", Source: "cluster"}}, + }), nil + }, + } + withMockNodePolicyClientSet(t, rec) + + n := &NodePolicy{} + resp, err := n.Read(context.Background(), infer.ReadRequest[NodePolicyArgs, NodePolicyState]{ID: "np-virtual"}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if resp.ID != "" { + t.Fatalf("expected the cluster-sourced virtual policy to be skipped, got ID %q", resp.ID) } } @@ -339,8 +369,19 @@ func TestNodePolicy_Update_EmptyResponse(t *testing.T) { // ---------- Delete ---------- -func TestNodePolicy_Delete_StateOnly(t *testing.T) { - // Delete should always succeed without calling any API. +func TestNodePolicy_Delete_CallsAPI(t *testing.T) { + deleted := false + rec := &mockRecommendationClientNodePolicy{ + deleteNodePolicyFn: func(_ context.Context, req *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + if req.Msg.PolicyId != "np-123" { + t.Errorf("PolicyId: got %q, want %q", req.Msg.PolicyId, "np-123") + } + deleted = true + return connect.NewResponse(&apiv1.DeleteNodePolicyResponse{Success: true}), nil + }, + } + withMockNodePolicyClientSet(t, rec) + n := &NodePolicy{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ ID: "np-123", @@ -349,18 +390,34 @@ func TestNodePolicy_Delete_StateOnly(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } + if !deleted { + t.Fatal("expected DeleteNodePolicy to be called") + } +} + +func TestNodePolicy_Delete_ToleratesNotFound(t *testing.T) { + rec := &mockRecommendationClientNodePolicy{ + deleteNodePolicyFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteNodePolicyRequest]) (*connect.Response[apiv1.DeleteNodePolicyResponse], error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("resource not found")) + }, + } + withMockNodePolicyClientSet(t, rec) + + n := &NodePolicy{} + if _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ID: "np-gone"}); err != nil { + t.Fatalf("expected NotFound to be tolerated, got: %v", err) + } } func TestNodePolicy_Delete_NilClientSet(t *testing.T) { - // Even with nil clientset, delete must succeed (state-only). prev := clientset.Get() clientset.Set(nil) t.Cleanup(func() { clientset.Set(prev) }) n := &NodePolicy{} _, err := n.Delete(context.Background(), infer.DeleteRequest[NodePolicyState]{ID: "np-123"}) - if err != nil { - t.Fatalf("unexpected error: %v", err) + if err == nil { + t.Fatal("expected error when provider is not configured") } } diff --git a/provider/pkg/resources/roundtrip_test.go b/provider/pkg/resources/roundtrip_test.go new file mode 100644 index 0000000..6b7bd7b --- /dev/null +++ b/provider/pkg/resources/roundtrip_test.go @@ -0,0 +1,382 @@ +package resources + +import ( + "context" + "fmt" + "reflect" + "strings" + "testing" + + "github.com/pulumi/pulumi-go-provider/infer" + "google.golang.org/protobuf/proto" + + apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" +) + +// --------------------------------------------------------------------------- +// All-fields round-trip harness. +// +// populateArgs fills EVERY pulumi-tagged field of an args struct — pointers, +// slices, maps, nested structs — with a concrete value (enum-valued strings +// get a valid member from fieldOverrides). Each resource's round-trip test +// then converts args → proto → args → proto and requires the two protos to be +// identical (proto.Equal). Any field that toProto forgets to send, or that +// fromProto forgets to read back, breaks the equality and fails the test — +// so newly added fields cannot silently stop round-tripping. +// --------------------------------------------------------------------------- + +// fieldOverrides supplies valid values for pulumi fields whose converters +// only accept a fixed vocabulary. Keyed by the pulumi tag name, applied at +// any nesting depth. +var fieldOverrides = map[string]string{ + "actionTriggers": "on_schedule", + "detectionTriggers": "pod_creation", + "kind": "Deployment", + "kindFilter": "Deployment", + "kindFilterNotIn": "CronJob", + "operator": "In", + "effect": "NoSchedule", + "primaryMetric": "cpu", + "instanceStorePolicy": "INSTANCE_STORE_POLICY_RAID0", + "consolidationPolicy": "WhenEmptyOrUnderutilized", + "type": "CPU", + "selectPolicy": "Max", +} + +func populateArgs(t *testing.T, v reflect.Value, tag string) { + t.Helper() + switch v.Kind() { + case reflect.Ptr: + v.Set(reflect.New(v.Type().Elem())) + populateArgs(t, v.Elem(), tag) + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + f := v.Type().Field(i) + fieldTag, ok := f.Tag.Lookup("pulumi") + if !ok { + continue + } + name := strings.Split(fieldTag, ",")[0] + populateArgs(t, v.Field(i), name) + } + case reflect.Slice: + elem := reflect.New(v.Type().Elem()).Elem() + populateArgs(t, elem, tag) + v.Set(reflect.Append(reflect.MakeSlice(v.Type(), 0, 1), elem)) + case reflect.Map: + m := reflect.MakeMap(v.Type()) + val := reflect.New(v.Type().Elem()).Elem() + populateArgs(t, val, tag) + m.SetMapIndex(reflect.ValueOf("k"), val) + v.Set(m) + case reflect.String: + if o, ok := fieldOverrides[tag]; ok { + v.SetString(o) + } else { + v.SetString("x-" + tag) + } + case reflect.Int, reflect.Int32, reflect.Int64: + v.SetInt(7) + case reflect.Float32, reflect.Float64: + v.SetFloat(0.75) + case reflect.Bool: + v.SetBool(true) + default: + t.Fatalf("populateArgs: unhandled kind %s for field %q", v.Kind(), tag) + } +} + +func requireProtoStable(t *testing.T, name string, proto1, proto2 proto.Message) { + t.Helper() + if !proto.Equal(proto1, proto2) { + t.Fatalf("%s: proto round-trip is lossy — a field is dropped in toProto or fromProto.\nfirst: %v\nsecond: %v", name, proto1, proto2) + } +} + +func TestRoundTrip_AllFields_NodePolicy(t *testing.T) { + var args NodePolicyArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + args.Raw = nil // raw YAML is write-only passthrough; keep the test on structured fields + + p1 := nodePolicyArgsToProto("team", "id", args) + back := nodePolicyProtoToArgs(p1) + p2 := nodePolicyArgsToProto("team", "id", back) + requireProtoStable(t, "NodePolicy", p1, p2) + + // Spot-check a few of the newly added fields survived the full cycle. + if p2.ZonalShift == nil || !p2.ZonalShift.RespectZonalShift { + t.Fatal("zonalShift did not round-trip") + } + if len(p2.StartupTaints) != 1 { + t.Fatal("startupTaints did not round-trip") + } + if p2.InstanceLocalNvme == nil { + t.Fatal("instanceLocalNvme did not round-trip") + } + if p2.CloudProviderId == nil || *p2.CloudProviderId != 7 { + t.Fatal("cloudProviderId did not round-trip") + } + if p2.Azure == nil || p2.Azure.ImageVersion == nil { + t.Fatal("azure.imageVersion did not round-trip") + } + if p2.MasterOverrideRoleName == "" { + t.Fatal("masterOverrideRoleName did not round-trip") + } +} + +func TestRoundTrip_AllFields_NodePolicyTarget(t *testing.T) { + var args NodePolicyTargetArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + p1 := nodePolicyTargetArgsToProto("team", "id", args) + back := nodePolicyTargetProtoToArgs(p1) + p2 := nodePolicyTargetArgsToProto("team", "id", back) + requireProtoStable(t, "NodePolicyTarget", p1, p2) +} + +func TestRoundTrip_AllFields_WorkloadPolicy(t *testing.T) { + var args WorkloadPolicyArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + p1 := argsToProto("team", "id", args) + back := protoToArgs(p1) + p2 := argsToProto("team", "id", back) + requireProtoStable(t, "WorkloadPolicy", p1, p2) + + // Spot-check the newly added field groups. + if !p2.EnableInPlaceVerticalScaling || !p2.AllowInPlaceMemoryLimitDecrease || !p2.PdbEnabled { + t.Fatal("in-place/pdb flags did not round-trip") + } + if p2.CpuFloorPercent == nil || p2.MemoryLimitCeilingPercent == nil { + t.Fatal("floor/ceiling percents did not round-trip") + } + if !p2.JvmHeapOptimizationEnabled || p2.JvmMaxHeapBytes == nil || p2.JvmCpuStartupFloorMillicores == nil { + t.Fatal("JVM knobs did not round-trip") + } + if p2.CpuVerticalScaling.RequestUseRss == nil || p2.MemoryVerticalScaling.LimitUseRss == nil { + t.Fatal("RSS flags did not round-trip") + } + hs := p2.HorizontalScaling + if hs.NetworkTargetThroughputBytesPerSec == nil || hs.TargetMemoryUtilization == nil || hs.CompositeFormula == nil || hs.ScaleDownCooldownSeconds == nil { + t.Fatal("horizontal scaling extras did not round-trip") + } +} + +func TestRoundTrip_AllFields_WorkloadPolicyTarget(t *testing.T) { + var args WorkloadPolicyTargetArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + + req1 := targetArgsToCreateRequest("team", args) + // Synthesize the target the server would echo back for these fields. + echo := &apiv1.WorkloadPolicyTarget{ + TargetId: "id", + PolicyId: req1.PolicyId, + TeamId: req1.TeamId, + Name: req1.Name, + Description: req1.Description, + Priority: req1.Priority, + Enabled: req1.Enabled, + NamespaceSelector: req1.NamespaceSelector, + WorkloadSelector: req1.WorkloadSelector, + AnnotationSelector: req1.AnnotationSelector, + KindFilter: req1.KindFilter, + KindFilterNotIn: req1.KindFilterNotIn, + NamePattern: req1.NamePattern, + NamespacePattern: req1.NamespacePattern, + WorkloadNames: req1.WorkloadNames, + WorkloadNamesNotIn: req1.WorkloadNamesNotIn, + NodeGroupNames: req1.NodeGroupNames, //nolint:staticcheck // deprecated upstream but still round-tripped + ClusterIds: req1.ClusterIds, + } + back := targetProtoToArgs(echo) + req2 := targetArgsToCreateRequest("team", back) + requireProtoStable(t, "WorkloadPolicyTarget", req1, req2) + + if req2.AnnotationSelector == nil { + t.Fatal("annotationSelector did not round-trip") + } + if len(req2.WorkloadNamesNotIn) != 1 || len(req2.KindFilterNotIn) != 1 { + t.Fatal("notIn filters did not round-trip") + } +} + +func TestRoundTrip_AllFields_WorkloadRule(t *testing.T) { + var args WorkloadRuleArgs + populateArgs(t, reflect.ValueOf(&args).Elem(), "") + auto := false + args.AutoGenerate = &auto // manual mode so Fields are populated + + req1 := ruleArgsToUpsertRequest("team", args, true) + if req1.Fields == nil { + t.Fatal("expected manual fields") + } + // Synthesize the rule the server would echo back for these fields. + f := req1.Fields + echo := &apiv1.WorkloadRule{ + RuleId: "id", + ClusterId: req1.ClusterId, + Namespace: req1.Namespace, + Kind: req1.Kind, + Name: req1.Name, + CurrentSource: "pulumi_manual", + CpuRule: f.CpuRule, + MemoryRule: f.MemoryRule, + GpuRule: f.GpuRule, + HpaRule: f.HpaRule, + EmergencyResponse: f.EmergencyResponse, + ActionTriggers: f.ActionTriggers, + DetectionTriggers: f.DetectionTriggers, + SchedulerPlugins: f.SchedulerPlugins, + LiveMigrationEnabled: f.LiveMigrationEnabled, + UseInPlaceVerticalScaling: f.UseInPlaceVerticalScaling, + Containers: f.Containers, + StartupPeriodSeconds: f.StartupPeriodSeconds, + CronSchedule: f.CronSchedule, + CooldownMinutes: f.CooldownMinutes, + DefragmentationSchedule: f.DefragmentationSchedule, + LookbackPeriodSeconds: f.LookbackPeriodSeconds, + } + if f.Disabled != nil { + echo.Disabled = *f.Disabled + } + back := ruleProtoToArgs(echo) + back.AutoGenerate = &auto + req2 := ruleArgsToUpsertRequest("team", back, true) + requireProtoStable(t, "WorkloadRule", req1.Fields, req2.Fields) + + f2 := req2.Fields + if f2.LookbackPeriodSeconds == nil || f2.Disabled == nil { + t.Fatal("lookback/disabled did not round-trip") + } + if f2.CpuRule.InitialRequest == nil || f2.CpuRule.FloorPercent == nil || f2.CpuRule.LimitCeilingPercent == nil { + t.Fatal("initial/floor/ceiling bounds did not round-trip") + } + if f2.MemoryRule.RequestUseRss == nil || f2.MemoryRule.LimitUseRss == nil { + t.Fatal("RSS flags did not round-trip") + } + if len(f2.HpaRule.Metrics) != 1 || f2.HpaRule.Metrics[0].ConnectorId == nil { + t.Fatal("metric connectorId did not round-trip") + } + if len(f2.Containers) != 1 || f2.Containers[0].CpuRule.RequestUseRss == nil { + t.Fatal("container RSS flags did not round-trip") + } +} + +// --------------------------------------------------------------------------- +// Diff (replace-on-identity-change) tests +// --------------------------------------------------------------------------- + +func diffReq(old, new WorkloadRuleArgs) infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState] { + return infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState]{ + ID: "wr-1", + State: WorkloadRuleState{WorkloadRuleArgs: old}, + Inputs: new, + } +} + +func TestWorkloadRuleDiff(t *testing.T) { + w := &WorkloadRule{} + base := WorkloadRuleArgs{ClusterID: "c1", Namespace: "prod", Kind: "Deployment", Name: "api"} + + t.Run("no change", func(t *testing.T) { + resp, err := w.Diff(context.Background(), diffReq(base, base)) + if err != nil { + t.Fatal(err) + } + if resp.HasChanges { + t.Fatalf("expected no changes, got %v", resp.DetailedDiff) + } + }) + + for _, field := range []string{"clusterId", "namespace", "kind", "name"} { + t.Run("identity change replaces: "+field, func(t *testing.T) { + changed := base + switch field { + case "clusterId": + changed.ClusterID = "c2" + case "namespace": + changed.Namespace = "staging" + case "kind": + changed.Kind = "StatefulSet" + case "name": + changed.Name = "api-v2" + } + resp, err := w.Diff(context.Background(), diffReq(base, changed)) + if err != nil { + t.Fatal(err) + } + if !resp.HasChanges { + t.Fatal("expected changes") + } + d, ok := resp.DetailedDiff[field] + if !ok { + t.Fatalf("expected a diff entry for %q, got %v", field, resp.DetailedDiff) + } + if !strings.Contains(string(d.Kind), "replace") { + t.Fatalf("expected %q to require replacement, got kind %q", field, d.Kind) + } + }) + } + + t.Run("non-identity change updates in place", func(t *testing.T) { + changed := base + cron := "*/30 * * * *" + changed.CronSchedule = &cron + resp, err := w.Diff(context.Background(), diffReq(base, changed)) + if err != nil { + t.Fatal(err) + } + if !resp.HasChanges { + t.Fatal("expected changes") + } + d, ok := resp.DetailedDiff["cronSchedule"] + if !ok { + t.Fatalf("expected a diff entry for cronSchedule, got %v", resp.DetailedDiff) + } + if strings.Contains(string(d.Kind), "replace") { + t.Fatalf("cronSchedule change must not force replacement, got kind %q", d.Kind) + } + }) +} + +// Guard: every top-level pulumi field of every args struct is either populated +// by populateArgs or explicitly excluded above — fail if a future field type +// isn't handled, so the harness can't silently skip it. +func TestPopulateArgsHandlesAllFieldKinds(t *testing.T) { + for _, target := range []any{ + &NodePolicyArgs{}, &NodePolicyTargetArgs{}, &WorkloadPolicyArgs{}, + &WorkloadPolicyTargetArgs{}, &WorkloadRuleArgs{}, + } { + v := reflect.ValueOf(target).Elem() + populateArgs(t, v, "") + // verify nothing pulumi-tagged stayed zero + var walk func(v reflect.Value, path string) + walk = func(v reflect.Value, path string) { + switch v.Kind() { + case reflect.Ptr: + if v.IsNil() { + t.Errorf("%s: pointer left nil", path) + return + } + walk(v.Elem(), path) + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + f := v.Type().Field(i) + if _, ok := f.Tag.Lookup("pulumi"); !ok { + continue + } + walk(v.Field(i), path+"."+f.Name) + } + case reflect.Slice, reflect.Map: + if v.Len() == 0 { + t.Errorf("%s: collection left empty", path) + } + case reflect.String: + if v.String() == "" { + t.Errorf("%s: string left empty", path) + } + } + } + walk(v, fmt.Sprintf("%T", target)) + } +} diff --git a/provider/pkg/resources/validation.go b/provider/pkg/resources/validation.go new file mode 100644 index 0000000..a83f847 --- /dev/null +++ b/provider/pkg/resources/validation.go @@ -0,0 +1,122 @@ +package resources + +import ( + "fmt" + "sort" + "strings" + + "connectrpc.com/connect" +) + +// isNotFound reports whether err is a connect NotFound — the shared shape for +// "tolerate on delete, drop from state on read". +func isNotFound(err error) bool { + return connect.CodeOf(err) == connect.CodeNotFound +} + +// truePtr returns a *bool for proto-bool → optional-pointer read-backs where +// only an explicit true should materialize. +func truePtr() *bool { + v := true + return &v +} + +// The DevZero API silently ignores unknown enum values (an unknown trigger is +// dropped, an unknown kind becomes UNSPECIFIED and matches nothing), so the +// provider validates every string-enum input up front and fails the operation +// with an actionable message instead. + +var ( + validActionTriggers = map[string]bool{ + "on_schedule": true, + "on_detection": true, + } + validDetectionTriggers = map[string]bool{ + "pod_creation": true, + "pod_update": true, + "pod_reschedule": true, + } + validKinds = map[string]bool{ + "Pod": true, "Job": true, "Deployment": true, "StatefulSet": true, + "DaemonSet": true, "ReplicaSet": true, "CronJob": true, + "ReplicationController": true, "Rollout": true, + } + validSelectorOperators = map[string]bool{ + "In": true, "NotIn": true, "Exists": true, "DoesNotExist": true, "Gt": true, "Lt": true, + } + validHPAMetrics = map[string]bool{ + "cpu": true, "memory": true, "gpu": true, "network_ingress": true, "network_egress": true, + } + validRuleKinds = map[string]bool{ + "Deployment": true, "StatefulSet": true, "DaemonSet": true, "CronJob": true, "Job": true, + } +) + +func sortedKeys(m map[string]bool) string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) + return strings.Join(keys, ", ") +} + +func validateEnumList(field string, values []string, valid map[string]bool) error { + for _, v := range values { + if !valid[v] { + return fmt.Errorf("%s: unknown value %q (valid values: %s)", field, v, sortedKeys(valid)) + } + } + return nil +} + +func validateSelector(field string, sel *LabelSelectorArgs) error { + if sel == nil { + return nil + } + for i, expr := range sel.MatchExpressions { + if !validSelectorOperators[expr.Operator] { + return fmt.Errorf("%s.matchExpressions[%d].operator: unknown value %q (valid values: %s)", field, i, expr.Operator, sortedKeys(validSelectorOperators)) + } + } + return nil +} + +func validateWorkloadPolicyArgs(a WorkloadPolicyArgs) error { + if err := validateEnumList("actionTriggers", a.ActionTriggers, validActionTriggers); err != nil { + return err + } + if err := validateEnumList("detectionTriggers", a.DetectionTriggers, validDetectionTriggers); err != nil { + return err + } + if a.HorizontalScaling != nil && a.HorizontalScaling.PrimaryMetric != nil && !validHPAMetrics[*a.HorizontalScaling.PrimaryMetric] { + return fmt.Errorf("horizontalScaling.primaryMetric: unknown value %q (valid values: %s)", *a.HorizontalScaling.PrimaryMetric, sortedKeys(validHPAMetrics)) + } + return nil +} + +func validateWorkloadPolicyTargetArgs(a WorkloadPolicyTargetArgs) error { + if err := validateEnumList("kindFilter", a.KindFilter, validKinds); err != nil { + return err + } + if err := validateEnumList("kindFilterNotIn", a.KindFilterNotIn, validKinds); err != nil { + return err + } + if err := validateSelector("namespaceSelector", a.NamespaceSelector); err != nil { + return err + } + if err := validateSelector("workloadSelector", a.WorkloadSelector); err != nil { + return err + } + return validateSelector("annotationSelector", a.AnnotationSelector) +} + +func validateWorkloadRuleArgs(a WorkloadRuleArgs) error { + if !validRuleKinds[a.Kind] { + return fmt.Errorf("kind: unknown value %q (valid values: %s)", a.Kind, sortedKeys(validRuleKinds)) + } + if err := validateEnumList("actionTriggers", a.ActionTriggers, validActionTriggers); err != nil { + return err + } + return validateEnumList("detectionTriggers", a.DetectionTriggers, validDetectionTriggers) +} diff --git a/provider/pkg/resources/workload_policy.go b/provider/pkg/resources/workload_policy.go index 0bff12a..425aade 100644 --- a/provider/pkg/resources/workload_policy.go +++ b/provider/pkg/resources/workload_policy.go @@ -3,6 +3,7 @@ package resources import ( "context" "fmt" + "strconv" "connectrpc.com/connect" "github.com/pulumi/pulumi-go-provider/infer" @@ -25,6 +26,8 @@ type VerticalScalingArgs struct { MinDataPoints *int `pulumi:"minDataPoints,optional"` AdjustReqEvenIfNotSet *bool `pulumi:"adjustReqEvenIfNotSet,optional"` LimitsRemovalEnabled *bool `pulumi:"limitsRemovalEnabled,optional"` + RequestUseRss *bool `pulumi:"requestUseRss,optional"` + LimitUseRss *bool `pulumi:"limitUseRss,optional"` } // Annotate provides SDK documentation for VerticalScalingArgs fields. @@ -56,6 +59,11 @@ type HorizontalScalingArgs struct { PrimaryMetric *string `pulumi:"primaryMetric,optional"` MinDataPoints *int `pulumi:"minDataPoints,optional"` MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent,optional"` + + NetworkTargetThroughputBytesPerSec *int `pulumi:"networkTargetThroughputBytesPerSec,optional"` + TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization,optional"` + CompositeFormula *string `pulumi:"compositeFormula,optional"` + ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds,optional"` } // Annotate provides SDK documentation for HorizontalScalingArgs fields. @@ -95,6 +103,29 @@ type WorkloadPolicyArgs struct { CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` EnablePmaxProtection *bool `pulumi:"enablePmaxProtection,optional"` PmaxRatioThreshold *float64 `pulumi:"pmaxRatioThreshold,optional"` + + EnableInPlaceVerticalScaling *bool `pulumi:"enableInPlaceVerticalScaling,optional"` + AllowInPlaceMemoryLimitDecrease *bool `pulumi:"allowInPlaceMemoryLimitDecrease,optional"` + PdbEnabled *bool `pulumi:"pdbEnabled,optional"` + + CpuFloorPercent *int `pulumi:"cpuFloorPercent,optional"` + CpuCeilingPercent *int `pulumi:"cpuCeilingPercent,optional"` + MemoryFloorPercent *int `pulumi:"memoryFloorPercent,optional"` + MemoryCeilingPercent *int `pulumi:"memoryCeilingPercent,optional"` + CpuLimitFloorPercent *int `pulumi:"cpuLimitFloorPercent,optional"` + CpuLimitCeilingPercent *int `pulumi:"cpuLimitCeilingPercent,optional"` + MemoryLimitFloorPercent *int `pulumi:"memoryLimitFloorPercent,optional"` + MemoryLimitCeilingPercent *int `pulumi:"memoryLimitCeilingPercent,optional"` + + JvmHeapOptimizationEnabled *bool `pulumi:"jvmHeapOptimizationEnabled,optional"` + JvmHeapTargetPercentile *float64 `pulumi:"jvmHeapTargetPercentile,optional"` + JvmHeapHeadroomMultiplier *float64 `pulumi:"jvmHeapHeadroomMultiplier,optional"` + JvmNonHeapOverheadPercent *float64 `pulumi:"jvmNonHeapOverheadPercent,optional"` + JvmNonHeapOverheadBytes *int `pulumi:"jvmNonHeapOverheadBytes,optional"` + JvmMinHeapBytes *int `pulumi:"jvmMinHeapBytes,optional"` + JvmMaxHeapBytes *int `pulumi:"jvmMaxHeapBytes,optional"` + JvmPreferContainerSupport *bool `pulumi:"jvmPreferContainerSupport,optional"` + JvmCpuStartupFloorMillicores *int `pulumi:"jvmCpuStartupFloorMillicores,optional"` } // Annotate provides SDK documentation and default values for WorkloadPolicyArgs fields. @@ -140,6 +171,10 @@ type WorkloadPolicy struct{} // ---------- CRUD ---------- func (w *WorkloadPolicy) Create(ctx context.Context, req infer.CreateRequest[WorkloadPolicyArgs]) (infer.CreateResponse[WorkloadPolicyState], error) { + if err := validateWorkloadPolicyArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadPolicyState]{}, err + } + if req.DryRun { return infer.CreateResponse[WorkloadPolicyState]{Output: WorkloadPolicyState{WorkloadPolicyArgs: req.Inputs}}, nil } @@ -178,12 +213,15 @@ func (w *WorkloadPolicy) Read(ctx context.Context, req infer.ReadRequest[Workloa PolicyId: req.ID, })) if err != nil { + if isNotFound(err) { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{}, nil + } return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadRecommendationPolicy: %w", err) } if resp.Msg.Policy == nil { - return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadRecommendationPolicy: policy not found") + return infer.ReadResponse[WorkloadPolicyArgs, WorkloadPolicyState]{}, nil } updatedArgs := protoToArgs(resp.Msg.Policy) @@ -195,6 +233,10 @@ func (w *WorkloadPolicy) Read(ctx context.Context, req infer.ReadRequest[Workloa } func (w *WorkloadPolicy) Update(ctx context.Context, req infer.UpdateRequest[WorkloadPolicyArgs, WorkloadPolicyState]) (infer.UpdateResponse[WorkloadPolicyState], error) { + if err := validateWorkloadPolicyArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadPolicyState]{}, err + } + if req.DryRun { return infer.UpdateResponse[WorkloadPolicyState]{Output: WorkloadPolicyState{WorkloadPolicyArgs: req.Inputs}}, nil } @@ -230,7 +272,7 @@ func (w *WorkloadPolicy) Delete(ctx context.Context, req infer.DeleteRequest[Wor TeamId: cs.TeamID, PolicyId: req.ID, })) - if err != nil { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRecommendationPolicy: %w", err) } return infer.DeleteResponse{}, nil @@ -305,9 +347,75 @@ func argsToProto(teamID, policyID string, a WorkloadPolicyArgs) *apiv1.WorkloadR v := float32(*a.PmaxRatioThreshold) p.PmaxRatioThreshold = &v } + + if a.EnableInPlaceVerticalScaling != nil { + p.EnableInPlaceVerticalScaling = *a.EnableInPlaceVerticalScaling + } + if a.AllowInPlaceMemoryLimitDecrease != nil { + p.AllowInPlaceMemoryLimitDecrease = *a.AllowInPlaceMemoryLimitDecrease + } + if a.PdbEnabled != nil { + p.PdbEnabled = *a.PdbEnabled + } + + p.CpuFloorPercent = intPtrToInt64Ptr(a.CpuFloorPercent) + p.CpuCeilingPercent = intPtrToInt64Ptr(a.CpuCeilingPercent) + p.MemoryFloorPercent = intPtrToInt64Ptr(a.MemoryFloorPercent) + p.MemoryCeilingPercent = intPtrToInt64Ptr(a.MemoryCeilingPercent) + p.CpuLimitFloorPercent = intPtrToInt64Ptr(a.CpuLimitFloorPercent) + p.CpuLimitCeilingPercent = intPtrToInt64Ptr(a.CpuLimitCeilingPercent) + p.MemoryLimitFloorPercent = intPtrToInt64Ptr(a.MemoryLimitFloorPercent) + p.MemoryLimitCeilingPercent = intPtrToInt64Ptr(a.MemoryLimitCeilingPercent) + + if a.JvmHeapOptimizationEnabled != nil { + p.JvmHeapOptimizationEnabled = *a.JvmHeapOptimizationEnabled + } + p.JvmHeapTargetPercentile = float64PtrToFloat32Ptr(a.JvmHeapTargetPercentile) + p.JvmHeapHeadroomMultiplier = float64PtrToFloat32Ptr(a.JvmHeapHeadroomMultiplier) + p.JvmNonHeapOverheadPercent = float64PtrToFloat32Ptr(a.JvmNonHeapOverheadPercent) + p.JvmNonHeapOverheadBytes = intPtrToInt64Ptr(a.JvmNonHeapOverheadBytes) + p.JvmMinHeapBytes = intPtrToInt64Ptr(a.JvmMinHeapBytes) + p.JvmMaxHeapBytes = intPtrToInt64Ptr(a.JvmMaxHeapBytes) + if a.JvmPreferContainerSupport != nil { + p.JvmPreferContainerSupport = *a.JvmPreferContainerSupport + } + p.JvmCpuStartupFloorMillicores = intPtrToInt64Ptr(a.JvmCpuStartupFloorMillicores) + return p } +func intPtrToInt64Ptr(v *int) *int64 { + if v == nil { + return nil + } + x := int64(*v) + return &x +} + +func int64PtrToIntPtr(v *int64) *int { + if v == nil { + return nil + } + x := int(*v) + return &x +} + +func float64PtrToFloat32Ptr(v *float64) *float32 { + if v == nil { + return nil + } + x := float32(*v) + return &x +} + +func float32PtrToFloat64Ptr(v *float32) *float64 { + if v == nil { + return nil + } + x := f32to64(*v) + return &x +} + func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a := WorkloadPolicyArgs{ Name: p.Name, @@ -339,7 +447,7 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.StartupPeriodSeconds = &v } if p.MinChangePercent != nil { - v := float64(*p.MinChangePercent) + v := f32to64(*p.MinChangePercent) a.MinChangePercent = &v } if p.MinDataPoints != nil { @@ -347,15 +455,15 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { a.MinDataPoints = &v } if p.StabilityCvMax != nil { - v := float64(*p.StabilityCvMax) + v := f32to64(*p.StabilityCvMax) a.StabilityCvMax = &v } if p.HysteresisVsTarget != nil { - v := float64(*p.HysteresisVsTarget) + v := f32to64(*p.HysteresisVsTarget) a.HysteresisVsTarget = &v } if p.DriftDeltaPercent != nil { - v := float64(*p.DriftDeltaPercent) + v := f32to64(*p.DriftDeltaPercent) a.DriftDeltaPercent = &v } if p.MinVpaWindowDataPoints != nil { @@ -366,12 +474,47 @@ func protoToArgs(p *apiv1.WorkloadRecommendationPolicy) WorkloadPolicyArgs { v := int(*p.CooldownMinutes) a.CooldownMinutes = &v } - v := p.EnablePmaxProtection - a.EnablePmaxProtection = &v + if p.EnablePmaxProtection { + a.EnablePmaxProtection = truePtr() + } if p.PmaxRatioThreshold != nil { - v := float64(*p.PmaxRatioThreshold) + v := f32to64(*p.PmaxRatioThreshold) a.PmaxRatioThreshold = &v } + + if p.EnableInPlaceVerticalScaling { + a.EnableInPlaceVerticalScaling = truePtr() + } + if p.AllowInPlaceMemoryLimitDecrease { + a.AllowInPlaceMemoryLimitDecrease = truePtr() + } + if p.PdbEnabled { + a.PdbEnabled = truePtr() + } + + a.CpuFloorPercent = int64PtrToIntPtr(p.CpuFloorPercent) + a.CpuCeilingPercent = int64PtrToIntPtr(p.CpuCeilingPercent) + a.MemoryFloorPercent = int64PtrToIntPtr(p.MemoryFloorPercent) + a.MemoryCeilingPercent = int64PtrToIntPtr(p.MemoryCeilingPercent) + a.CpuLimitFloorPercent = int64PtrToIntPtr(p.CpuLimitFloorPercent) + a.CpuLimitCeilingPercent = int64PtrToIntPtr(p.CpuLimitCeilingPercent) + a.MemoryLimitFloorPercent = int64PtrToIntPtr(p.MemoryLimitFloorPercent) + a.MemoryLimitCeilingPercent = int64PtrToIntPtr(p.MemoryLimitCeilingPercent) + + if p.JvmHeapOptimizationEnabled { + a.JvmHeapOptimizationEnabled = truePtr() + } + a.JvmHeapTargetPercentile = float32PtrToFloat64Ptr(p.JvmHeapTargetPercentile) + a.JvmHeapHeadroomMultiplier = float32PtrToFloat64Ptr(p.JvmHeapHeadroomMultiplier) + a.JvmNonHeapOverheadPercent = float32PtrToFloat64Ptr(p.JvmNonHeapOverheadPercent) + a.JvmNonHeapOverheadBytes = int64PtrToIntPtr(p.JvmNonHeapOverheadBytes) + a.JvmMinHeapBytes = int64PtrToIntPtr(p.JvmMinHeapBytes) + a.JvmMaxHeapBytes = int64PtrToIntPtr(p.JvmMaxHeapBytes) + if p.JvmPreferContainerSupport { + a.JvmPreferContainerSupport = truePtr() + } + a.JvmCpuStartupFloorMillicores = int64PtrToIntPtr(p.JvmCpuStartupFloorMillicores) + return a } @@ -485,6 +628,8 @@ func verticalScalingToProto(v *VerticalScalingArgs) *apiv1.VerticalScalingOptimi if v.LimitsRemovalEnabled != nil { t.LimitsRemovalEnabled = *v.LimitsRemovalEnabled } + t.RequestUseRss = v.RequestUseRss + t.LimitUseRss = v.LimitUseRss return t } @@ -504,36 +649,40 @@ func verticalScalingFromProto(t *apiv1.VerticalScalingOptimizationTarget) *Verti v.MaxRequest = &x } if t.OverheadMultiplier != nil { - x := float64(*t.OverheadMultiplier) + x := f32to64(*t.OverheadMultiplier) v.OverheadMultiplier = &x } if t.TargetPercentile != nil { - x := float64(*t.TargetPercentile) + x := f32to64(*t.TargetPercentile) v.TargetPercentile = &x } if t.MaxScaleUpPercent != nil { - x := float64(*t.MaxScaleUpPercent) + x := f32to64(*t.MaxScaleUpPercent) v.MaxScaleUpPercent = &x } if t.MaxScaleDownPercent != nil { - x := float64(*t.MaxScaleDownPercent) + x := f32to64(*t.MaxScaleDownPercent) v.MaxScaleDownPercent = &x } if t.LimitsAdjustmentEnabled != nil { v.LimitsAdjustmentEnabled = t.LimitsAdjustmentEnabled } if t.LimitMultiplier != nil { - x := float64(*t.LimitMultiplier) + x := f32to64(*t.LimitMultiplier) v.LimitMultiplier = &x } if t.MinDataPoints != nil { x := int(*t.MinDataPoints) v.MinDataPoints = &x } - adj := t.AdjustReqEvenIfNotSet - v.AdjustReqEvenIfNotSet = &adj - lre := t.LimitsRemovalEnabled - v.LimitsRemovalEnabled = &lre + if t.AdjustReqEvenIfNotSet { + v.AdjustReqEvenIfNotSet = truePtr() + } + if t.LimitsRemovalEnabled { + v.LimitsRemovalEnabled = truePtr() + } + v.RequestUseRss = t.RequestUseRss + v.LimitUseRss = t.LimitUseRss return v } @@ -567,6 +716,13 @@ func horizontalScalingToProto(h *HorizontalScalingArgs) *apiv1.HorizontalScaling x := float32(*h.MaxReplicaChangePercent) t.MaxReplicaChangePercent = &x } + t.NetworkTargetThroughputBytesPerSec = intPtrToInt64Ptr(h.NetworkTargetThroughputBytesPerSec) + t.TargetMemoryUtilization = float64PtrToFloat32Ptr(h.TargetMemoryUtilization) + t.CompositeFormula = h.CompositeFormula + if h.ScaleDownCooldownSeconds != nil { + x := int32(*h.ScaleDownCooldownSeconds) + t.ScaleDownCooldownSeconds = &x + } return t } @@ -586,7 +742,7 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MaxReplicas = &x } if t.TargetUtilization != nil { - x := float64(*t.TargetUtilization) + x := f32to64(*t.TargetUtilization) h.TargetUtilization = &x } if t.PrimaryMetric != nil { @@ -597,9 +753,16 @@ func horizontalScalingFromProto(t *apiv1.HorizontalScalingOptimizationTarget) *H h.MinDataPoints = &x } if t.MaxReplicaChangePercent != nil { - x := float64(*t.MaxReplicaChangePercent) + x := f32to64(*t.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &x } + h.NetworkTargetThroughputBytesPerSec = int64PtrToIntPtr(t.NetworkTargetThroughputBytesPerSec) + h.TargetMemoryUtilization = float32PtrToFloat64Ptr(t.TargetMemoryUtilization) + h.CompositeFormula = t.CompositeFormula + if t.ScaleDownCooldownSeconds != nil { + x := int(*t.ScaleDownCooldownSeconds) + h.ScaleDownCooldownSeconds = &x + } return h } @@ -646,3 +809,12 @@ func hpaMetricFromProto(m *apiv1.HPAMetricType) *string { } return &s } + +// f32to64(v) converts a float32 coming from the API into the float64 the Pulumi +// SDKs use, picking the shortest decimal that round-trips (so a stored 0.7 +// comes back as 0.7, not 0.699999988079071 — which would show as a perpetual +// diff after refresh). +func f32to64(v float32) float64 { + f, _ := strconv.ParseFloat(strconv.FormatFloat(float64(v), 'g', -1, 32), 64) + return f +} diff --git a/provider/pkg/resources/workload_policy_target.go b/provider/pkg/resources/workload_policy_target.go index 187605f..b3c5638 100644 --- a/provider/pkg/resources/workload_policy_target.go +++ b/provider/pkg/resources/workload_policy_target.go @@ -52,19 +52,22 @@ func (l *LabelSelectorArgs) Annotate(a infer.Annotator) { // WorkloadPolicyTargetArgs are the user-configurable inputs for a WorkloadPolicyTarget resource. type WorkloadPolicyTargetArgs struct { - Name string `pulumi:"name"` - PolicyId string `pulumi:"policyId"` - ClusterIds []string `pulumi:"clusterIds"` - Description *string `pulumi:"description,optional"` - Priority int `pulumi:"priority,optional"` - Enabled bool `pulumi:"enabled,optional"` - WorkloadNames []string `pulumi:"workloadNames,optional"` - NodeGroupNames []string `pulumi:"nodeGroupNames,optional"` - KindFilter []string `pulumi:"kindFilter,optional"` - NamePattern *NamePatternArgs `pulumi:"namePattern,optional"` - NamespacePattern *NamePatternArgs `pulumi:"namespacePattern,optional"` - NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector,optional"` - WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector,optional"` + Name string `pulumi:"name"` + PolicyId string `pulumi:"policyId"` + ClusterIds []string `pulumi:"clusterIds"` + Description *string `pulumi:"description,optional"` + Priority int `pulumi:"priority,optional"` + Enabled *bool `pulumi:"enabled,optional"` + WorkloadNames []string `pulumi:"workloadNames,optional"` + WorkloadNamesNotIn []string `pulumi:"workloadNamesNotIn,optional"` + NodeGroupNames []string `pulumi:"nodeGroupNames,optional"` + KindFilter []string `pulumi:"kindFilter,optional"` + KindFilterNotIn []string `pulumi:"kindFilterNotIn,optional"` + AnnotationSelector *LabelSelectorArgs `pulumi:"annotationSelector,optional"` + NamePattern *NamePatternArgs `pulumi:"namePattern,optional"` + NamespacePattern *NamePatternArgs `pulumi:"namespacePattern,optional"` + NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector,optional"` + WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector,optional"` } // WorkloadPolicyTargetState is the full persisted state (identical to args — no additional computed fields). @@ -79,9 +82,14 @@ func (s *WorkloadPolicyTargetState) Annotate(a infer.Annotator) { a.Describe(&s.ClusterIds, "Cluster IDs where this target applies.") a.Describe(&s.Description, "Free-form description of the target.") a.Describe(&s.Priority, "Evaluation priority; higher values take precedence when targets overlap.") - a.Describe(&s.Enabled, "Enable or disable this target.") + a.Describe(&s.Enabled, "Enable or disable this target. Defaults to true.") + a.SetDefault(&s.Enabled, true) a.Describe(&s.WorkloadNames, "Explicit list of workload names to include.") - a.Describe(&s.NodeGroupNames, "Restrict matching to specific node groups by name.") + a.Describe(&s.WorkloadNamesNotIn, "Explicit list of workload names to exclude.") + a.Describe(&s.KindFilterNotIn, "Kubernetes kinds to exclude from matching. Same allowed values as kindFilter.") + a.Describe(&s.AnnotationSelector, "Select workloads by annotations (same semantics as label selectors, evaluated against annotations).") + a.Describe(&s.NodeGroupNames, "DEPRECATED: unused by the DevZero API — no longer evaluated by any active target.") + a.Deprecate(&s.NodeGroupNames, "node_group_names is deprecated by the DevZero API and no longer evaluated.") a.Describe(&s.KindFilter, "Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod).") a.Describe(&s.NamePattern, "Regex to match workload names.") a.Describe(&s.NamespacePattern, "Regex to match namespace names.") @@ -95,6 +103,10 @@ type WorkloadPolicyTarget struct{} // ---------- CRUD ---------- func (w *WorkloadPolicyTarget) Create(ctx context.Context, req infer.CreateRequest[WorkloadPolicyTargetArgs]) (infer.CreateResponse[WorkloadPolicyTargetState], error) { + if err := validateWorkloadPolicyTargetArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadPolicyTargetState]{}, err + } + if req.DryRun { return infer.CreateResponse[WorkloadPolicyTargetState]{Output: WorkloadPolicyTargetState{WorkloadPolicyTargetArgs: req.Inputs}}, nil } @@ -136,12 +148,15 @@ func (w *WorkloadPolicyTarget) Read(ctx context.Context, req infer.ReadRequest[W resp, err := cs.RecommendationClient.GetWorkloadPolicyTarget(ctx, getReq) if err != nil { + if isNotFound(err) { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{}, nil + } return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadPolicyTarget: %w", err) } if resp.Msg.Target == nil { - return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadPolicyTarget: target not found") + return infer.ReadResponse[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]{}, nil } updatedArgs := targetProtoToArgs(resp.Msg.Target) @@ -153,6 +168,10 @@ func (w *WorkloadPolicyTarget) Read(ctx context.Context, req infer.ReadRequest[W } func (w *WorkloadPolicyTarget) Update(ctx context.Context, req infer.UpdateRequest[WorkloadPolicyTargetArgs, WorkloadPolicyTargetState]) (infer.UpdateResponse[WorkloadPolicyTargetState], error) { + if err := validateWorkloadPolicyTargetArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadPolicyTargetState]{}, err + } + if req.DryRun { return infer.UpdateResponse[WorkloadPolicyTargetState]{Output: WorkloadPolicyTargetState{WorkloadPolicyTargetArgs: req.Inputs}}, nil } @@ -191,7 +210,7 @@ func (w *WorkloadPolicyTarget) Delete(ctx context.Context, req infer.DeleteReque deleteReq.Header().Set("Authorization", "Bearer "+cs.Token) _, err := cs.RecommendationClient.DeleteWorkloadPolicyTarget(ctx, deleteReq) - if err != nil { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadPolicyTarget: %w", err) } return infer.DeleteResponse{}, nil @@ -201,19 +220,22 @@ func (w *WorkloadPolicyTarget) Delete(ctx context.Context, req infer.DeleteReque func targetArgsToCreateRequest(teamID string, a WorkloadPolicyTargetArgs) *apiv1.CreateWorkloadPolicyTargetRequest { r := &apiv1.CreateWorkloadPolicyTargetRequest{ - TeamId: teamID, - PolicyId: a.PolicyId, - Name: a.Name, - Priority: int32(a.Priority), - Enabled: a.Enabled, - ClusterIds: a.ClusterIds, - WorkloadNames: a.WorkloadNames, - NodeGroupNames: a.NodeGroupNames, - KindFilter: kindFilterToProto(a.KindFilter), - NamePattern: namePatternToProto(a.NamePattern), - NamespacePattern: namePatternToProto(a.NamespacePattern), - NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), - WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + TeamId: teamID, + PolicyId: a.PolicyId, + Name: a.Name, + Priority: int32(a.Priority), + Enabled: a.EnabledOrDefault(), + ClusterIds: a.ClusterIds, + WorkloadNames: a.WorkloadNames, + WorkloadNamesNotIn: a.WorkloadNamesNotIn, + NodeGroupNames: a.NodeGroupNames, + KindFilter: kindFilterToProto(a.KindFilter), + KindFilterNotIn: kindFilterToProto(a.KindFilterNotIn), + NamePattern: namePatternToProto(a.NamePattern), + NamespacePattern: namePatternToProto(a.NamespacePattern), + NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), + WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + AnnotationSelector: labelSelectorToProto(a.AnnotationSelector), } if a.Description != nil { r.Description = *a.Description @@ -224,20 +246,23 @@ func targetArgsToCreateRequest(teamID string, a WorkloadPolicyTargetArgs) *apiv1 func targetArgsToUpdateRequest(teamID, targetID string, a WorkloadPolicyTargetArgs) *apiv1.UpdateWorkloadPolicyTargetRequest { policyID := a.PolicyId r := &apiv1.UpdateWorkloadPolicyTargetRequest{ - TeamId: teamID, - TargetId: targetID, - PolicyId: &policyID, - Name: a.Name, - Priority: int32(a.Priority), - Enabled: a.Enabled, - ClusterIds: a.ClusterIds, - WorkloadNames: a.WorkloadNames, - NodeGroupNames: a.NodeGroupNames, - KindFilter: kindFilterToProto(a.KindFilter), - NamePattern: namePatternToProto(a.NamePattern), - NamespacePattern: namePatternToProto(a.NamespacePattern), - NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), - WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + TeamId: teamID, + TargetId: targetID, + PolicyId: &policyID, + Name: a.Name, + Priority: int32(a.Priority), + Enabled: a.EnabledOrDefault(), + ClusterIds: a.ClusterIds, + WorkloadNames: a.WorkloadNames, + WorkloadNamesNotIn: a.WorkloadNamesNotIn, + NodeGroupNames: a.NodeGroupNames, + KindFilter: kindFilterToProto(a.KindFilter), + KindFilterNotIn: kindFilterToProto(a.KindFilterNotIn), + NamePattern: namePatternToProto(a.NamePattern), + NamespacePattern: namePatternToProto(a.NamespacePattern), + NamespaceSelector: labelSelectorToProto(a.NamespaceSelector), + WorkloadSelector: labelSelectorToProto(a.WorkloadSelector), + AnnotationSelector: labelSelectorToProto(a.AnnotationSelector), } if a.Description != nil { r.Description = *a.Description @@ -247,18 +272,21 @@ func targetArgsToUpdateRequest(teamID, targetID string, a WorkloadPolicyTargetAr func targetProtoToArgs(t *apiv1.WorkloadPolicyTarget) WorkloadPolicyTargetArgs { a := WorkloadPolicyTargetArgs{ - Name: t.Name, - PolicyId: t.PolicyId, - ClusterIds: t.ClusterIds, - Priority: int(t.Priority), - Enabled: t.Enabled, - WorkloadNames: t.WorkloadNames, - NodeGroupNames: t.NodeGroupNames, - KindFilter: kindFilterFromProto(t.KindFilter), - NamePattern: namePatternFromProto(t.NamePattern), - NamespacePattern: namePatternFromProto(t.NamespacePattern), - NamespaceSelector: labelSelectorFromProto(t.NamespaceSelector), - WorkloadSelector: labelSelectorFromProto(t.WorkloadSelector), + Name: t.Name, + PolicyId: t.PolicyId, + ClusterIds: t.ClusterIds, + Priority: int(t.Priority), + Enabled: boolPtr(t.Enabled), + WorkloadNames: t.WorkloadNames, + WorkloadNamesNotIn: t.WorkloadNamesNotIn, + NodeGroupNames: t.NodeGroupNames, + KindFilter: kindFilterFromProto(t.KindFilter), + KindFilterNotIn: kindFilterFromProto(t.KindFilterNotIn), + NamePattern: namePatternFromProto(t.NamePattern), + NamespacePattern: namePatternFromProto(t.NamespacePattern), + NamespaceSelector: labelSelectorFromProto(t.NamespaceSelector), + WorkloadSelector: labelSelectorFromProto(t.WorkloadSelector), + AnnotationSelector: labelSelectorFromProto(t.AnnotationSelector), } if t.Description != "" { a.Description = &t.Description @@ -389,6 +417,10 @@ func labelSelectorOperatorToProto(op string) commonv1.LabelSelectorOperator { return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_EXISTS case "DoesNotExist": return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST + case "Gt": + return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT + case "Lt": + return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_LT default: return commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_UNSPECIFIED } @@ -404,7 +436,21 @@ func labelSelectorOperatorFromProto(op commonv1.LabelSelectorOperator) string { return "Exists" case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_DOES_NOT_EXIST: return "DoesNotExist" + case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_GT: + return "Gt" + case commonv1.LabelSelectorOperator_LABEL_SELECTOR_OPERATOR_LT: + return "Lt" default: return "" } } + +// EnabledOrDefault returns the effective enabled flag (default true). +func (a WorkloadPolicyTargetArgs) EnabledOrDefault() bool { + if a.Enabled == nil { + return true + } + return *a.Enabled +} + +func boolPtr(b bool) *bool { return &b } diff --git a/provider/pkg/resources/workload_policy_target_test.go b/provider/pkg/resources/workload_policy_target_test.go index fd46c40..b241fef 100644 --- a/provider/pkg/resources/workload_policy_target_test.go +++ b/provider/pkg/resources/workload_policy_target_test.go @@ -254,7 +254,7 @@ func TestWorkloadPolicyTarget_Read_Success(t *testing.T) { if resp.Inputs.Description == nil || *resp.Inputs.Description != desc { t.Errorf("description: got %v, want %q", resp.Inputs.Description, desc) } - if !resp.Inputs.Enabled { + if resp.Inputs.Enabled == nil || !*resp.Inputs.Enabled { t.Error("enabled should be true") } if resp.Inputs.Priority != 5 { @@ -279,7 +279,7 @@ func TestWorkloadPolicyTarget_Read_NilClientSet(t *testing.T) { func TestWorkloadPolicyTarget_Read_APIError(t *testing.T) { rec := &mockRecommendationClientFull{ getTargetFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.GetWorkloadPolicyTargetResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockTargetClientSet(t, rec) @@ -394,7 +394,7 @@ func TestWorkloadPolicyTarget_Delete_Success(t *testing.T) { func TestWorkloadPolicyTarget_Delete_APIError(t *testing.T) { rec := &mockRecommendationClientFull{ deleteTargetFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadPolicyTargetRequest]) (*connect.Response[apiv1.DeleteWorkloadPolicyTargetResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockTargetClientSet(t, rec) diff --git a/provider/pkg/resources/workload_policy_test.go b/provider/pkg/resources/workload_policy_test.go index ca7ee4a..cfa5127 100644 --- a/provider/pkg/resources/workload_policy_test.go +++ b/provider/pkg/resources/workload_policy_test.go @@ -309,7 +309,7 @@ func TestWorkloadPolicy_Read_NilClientSet(t *testing.T) { func TestWorkloadPolicy_Read_APIError(t *testing.T) { rec := &mockRecommendationClient{ getFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.GetWorkloadRecommendationPolicyResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockRecommendationClientSet(t, rec) @@ -418,7 +418,7 @@ func TestWorkloadPolicy_Delete_Success(t *testing.T) { func TestWorkloadPolicy_Delete_APIError(t *testing.T) { rec := &mockRecommendationClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadRecommendationPolicyRequest]) (*connect.Response[apiv1.DeleteWorkloadRecommendationPolicyResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockRecommendationClientSet(t, rec) diff --git a/provider/pkg/resources/workload_rule.go b/provider/pkg/resources/workload_rule.go index 37aa365..e2bdd97 100644 --- a/provider/pkg/resources/workload_rule.go +++ b/provider/pkg/resources/workload_rule.go @@ -3,8 +3,11 @@ package resources import ( "context" "fmt" + "reflect" + "strings" "connectrpc.com/connect" + prov "github.com/pulumi/pulumi-go-provider" "github.com/pulumi/pulumi-go-provider/infer" apiv1 "github.com/devzero-inc/pulumi-provider-devzero/internal/gen/api/v1" @@ -22,6 +25,14 @@ type ResourceRuleConfigArgs struct { MaxScaleUpPercent *float64 `pulumi:"maxScaleUpPercent,optional"` MaxScaleDownPercent *float64 `pulumi:"maxScaleDownPercent,optional"` LimitsRemovalEnabled bool `pulumi:"limitsRemovalEnabled,optional"` + InitialRequest *int `pulumi:"initialRequest,optional"` + FloorPercent *int `pulumi:"floorPercent,optional"` + CeilingPercent *int `pulumi:"ceilingPercent,optional"` + InitialLimit *int `pulumi:"initialLimit,optional"` + LimitFloorPercent *int `pulumi:"limitFloorPercent,optional"` + LimitCeilingPercent *int `pulumi:"limitCeilingPercent,optional"` + RequestUseRss *bool `pulumi:"requestUseRss,optional"` + LimitUseRss *bool `pulumi:"limitUseRss,optional"` } // Annotate provides SDK documentation for ResourceRuleConfigArgs fields. @@ -39,7 +50,7 @@ func (r *ResourceRuleConfigArgs) Annotate(a infer.Annotator) { // HPAMetricTriggerArgs configures a single metric source for the HPA. // Use this for Prometheus or custom metrics; CPU/Memory/Network triggers -// are auto-generated by the engine from primaryMetric / targetUtilization +// can be built-in (CPU/Memory/Network*) or external (prometheus, kafka, ...) // and should not be redeclared here. type HPAMetricTriggerArgs struct { Type string `pulumi:"type"` @@ -49,6 +60,7 @@ type HPAMetricTriggerArgs struct { Metadata map[string]string `pulumi:"metadata,optional"` ServerAddress *string `pulumi:"serverAddress,optional"` Query *string `pulumi:"query,optional"` + ConnectorId *string `pulumi:"connectorId,optional"` } // Annotate provides SDK documentation for HPAMetricTriggerArgs fields. @@ -121,9 +133,6 @@ type HPARuleConfigArgs struct { Enabled bool `pulumi:"enabled,optional"` MinReplicas *int `pulumi:"minReplicas,optional"` MaxReplicas *int `pulumi:"maxReplicas,optional"` - TargetUtilization *float64 `pulumi:"targetUtilization,optional"` - TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization,optional"` - PrimaryMetric *string `pulumi:"primaryMetric,optional"` MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent,optional"` ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds,optional"` Metrics []HPAMetricTriggerArgs `pulumi:"metrics,optional"` @@ -137,12 +146,9 @@ func (h *HPARuleConfigArgs) Annotate(a infer.Annotator) { a.Describe(&h.Enabled, "Enable horizontal (replica) scaling. Example: true.") a.Describe(&h.MinReplicas, "Minimum number of replicas. Example: 2.") a.Describe(&h.MaxReplicas, "Maximum number of replicas. Example: 10.") - a.Describe(&h.TargetUtilization, "Target CPU utilization ratio (0-1). Example: 0.7.") - a.Describe(&h.TargetMemoryUtilization, "Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8.") - a.Describe(&h.PrimaryMetric, "Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'.") a.Describe(&h.MaxReplicaChangePercent, "Maximum percentage change in replica count per cycle. Example: 50.0.") a.Describe(&h.ScaleDownCooldownSeconds, "Seconds to wait between scale-down events. Example: 300.") - a.Describe(&h.Metrics, "Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here.") + a.Describe(&h.Metrics, "HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields.") a.Describe(&h.CompositeFormula, "Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'.") a.Describe(&h.Behavior, "Fine-grained scale-up and scale-down behavior policies.") a.Describe(&h.Fallback, "Replica fallback configuration when metrics are unavailable.") @@ -188,26 +194,28 @@ func (c *ContainerResourceRuleConfigArgs) Annotate(a infer.Annotator) { // WorkloadRuleArgs are the user-configurable inputs for a WorkloadRule resource. type WorkloadRuleArgs struct { - ClusterID string `pulumi:"clusterId"` - Namespace string `pulumi:"namespace"` - Kind string `pulumi:"kind"` - Name string `pulumi:"name"` - AutoGenerate *bool `pulumi:"autoGenerate,optional"` - CpuRule *ResourceRuleConfigArgs `pulumi:"cpuRule,optional"` - MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule,optional"` - GpuRule *ResourceRuleConfigArgs `pulumi:"gpuRule,optional"` - HpaRule *HPARuleConfigArgs `pulumi:"hpaRule,optional"` - EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse,optional"` - ActionTriggers []string `pulumi:"actionTriggers,optional"` - StartupPeriodSeconds *int `pulumi:"startupPeriodSeconds,optional"` - CronSchedule *string `pulumi:"cronSchedule,optional"` - CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` - DetectionTriggers []string `pulumi:"detectionTriggers,optional"` - SchedulerPlugins []string `pulumi:"schedulerPlugins,optional"` - DefragmentationSchedule *string `pulumi:"defragmentationSchedule,optional"` - LiveMigrationEnabled bool `pulumi:"liveMigrationEnabled,optional"` - UseInPlaceVerticalScaling bool `pulumi:"useInPlaceVerticalScaling,optional"` - Containers []ContainerResourceRuleConfigArgs `pulumi:"containers,optional"` + ClusterID string `pulumi:"clusterId"` + Namespace string `pulumi:"namespace"` + Kind string `pulumi:"kind"` + Name string `pulumi:"name"` + AutoGenerate *bool `pulumi:"autoGenerate,optional"` + CpuRule *ResourceRuleConfigArgs `pulumi:"cpuRule,optional"` + MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule,optional"` + GpuRule *ResourceRuleConfigArgs `pulumi:"gpuRule,optional"` + HpaRule *HPARuleConfigArgs `pulumi:"hpaRule,optional"` + EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse,optional"` + ActionTriggers []string `pulumi:"actionTriggers,optional"` + StartupPeriodSeconds *int `pulumi:"startupPeriodSeconds,optional"` + CronSchedule *string `pulumi:"cronSchedule,optional"` + CooldownMinutes *int `pulumi:"cooldownMinutes,optional"` + DetectionTriggers []string `pulumi:"detectionTriggers,optional"` + SchedulerPlugins []string `pulumi:"schedulerPlugins,optional"` + DefragmentationSchedule *string `pulumi:"defragmentationSchedule,optional"` + LiveMigrationEnabled bool `pulumi:"liveMigrationEnabled,optional"` + UseInPlaceVerticalScaling bool `pulumi:"useInPlaceVerticalScaling,optional"` + Containers []ContainerResourceRuleConfigArgs `pulumi:"containers,optional"` + Disabled *bool `pulumi:"disabled,optional"` + LookbackPeriodSeconds *int `pulumi:"lookbackPeriodSeconds,optional"` } // Annotate provides SDK documentation for WorkloadRuleArgs fields. @@ -245,6 +253,10 @@ type WorkloadRule struct{} // ---------- CRUD ---------- func (w *WorkloadRule) Create(ctx context.Context, req infer.CreateRequest[WorkloadRuleArgs]) (infer.CreateResponse[WorkloadRuleState], error) { + if err := validateWorkloadRuleArgs(req.Inputs); err != nil { + return infer.CreateResponse[WorkloadRuleState]{}, err + } + if err := validateContainerRules(req.Inputs.Containers); err != nil { return infer.CreateResponse[WorkloadRuleState]{}, err } @@ -257,7 +269,7 @@ func (w *WorkloadRule) Create(ctx context.Context, req infer.CreateRequest[Workl return infer.CreateResponse[WorkloadRuleState]{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") } - resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs))) + resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs, true))) if err != nil { return infer.CreateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: %w", err) } @@ -285,12 +297,15 @@ func (w *WorkloadRule) Read(ctx context.Context, req infer.ReadRequest[WorkloadR RuleId: req.ID, })) if err != nil { + if isNotFound(err) { + // Deleted out of band — drop from state. + return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{}, nil + } return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, fmt.Errorf("GetWorkloadRuleByID: %w", err) } if resp.Msg.Rule == nil { - return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{ID: req.ID, Inputs: req.Inputs, State: req.State}, - fmt.Errorf("GetWorkloadRuleByID: rule not found") + return infer.ReadResponse[WorkloadRuleArgs, WorkloadRuleState]{}, nil } updatedArgs := ruleProtoToArgs(resp.Msg.Rule) @@ -302,6 +317,10 @@ func (w *WorkloadRule) Read(ctx context.Context, req infer.ReadRequest[WorkloadR } func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[WorkloadRuleArgs, WorkloadRuleState]) (infer.UpdateResponse[WorkloadRuleState], error) { + if err := validateWorkloadRuleArgs(req.Inputs); err != nil { + return infer.UpdateResponse[WorkloadRuleState]{}, err + } + if err := validateContainerRules(req.Inputs.Containers); err != nil { return infer.UpdateResponse[WorkloadRuleState]{}, err } @@ -314,7 +333,7 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("devzero: provider not configured (ClientSet is nil)") } - resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs))) + resp, err := cs.RecommendationClient.UpsertManualWorkloadRule(ctx, connect.NewRequest(ruleArgsToUpsertRequest(cs.TeamID, req.Inputs, false))) if err != nil { return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: %w", err) } @@ -322,6 +341,25 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("UpsertManualWorkloadRule: empty response from server") } + // disabled cannot be sent through the upsert on update; use the toggle RPC. + wantDisabled := req.Inputs.Disabled != nil && *req.Inputs.Disabled + haveDisabled := req.State.Disabled != nil && *req.State.Disabled + if wantDisabled != haveDisabled { + toggleResp, err := cs.RecommendationClient.ToggleWorkloadRuleDisabled(ctx, connect.NewRequest(&apiv1.ToggleWorkloadRuleDisabledRequest{ + TeamId: cs.TeamID, + RuleId: resp.Msg.Rule.RuleId, + Disabled: wantDisabled, + })) + if err != nil { + return infer.UpdateResponse[WorkloadRuleState]{}, fmt.Errorf("ToggleWorkloadRuleDisabled: %w", err) + } + if toggleResp.Msg.Rule != nil { + resp.Msg.Rule.Disabled = toggleResp.Msg.Rule.Disabled + } else { + resp.Msg.Rule.Disabled = wantDisabled + } + } + out := ruleProtoToArgs(resp.Msg.Rule) out.AutoGenerate = req.Inputs.AutoGenerate return infer.UpdateResponse[WorkloadRuleState]{ @@ -329,6 +367,44 @@ func (w *WorkloadRule) Update(ctx context.Context, req infer.UpdateRequest[Workl }, nil } +// Diff implements infer.CustomDiff. The upsert API keys workload rules on +// (clusterId, namespace, kind, name): changing any of them through Update +// would create a second rule server-side while the Pulumi ID kept pointing at +// the old one. Mark those fields as requiring a replacement instead. +func (w *WorkloadRule) Diff(_ context.Context, req infer.DiffRequest[WorkloadRuleArgs, WorkloadRuleState]) (infer.DiffResponse, error) { + replaceOn := map[string]bool{ + "clusterId": true, + "namespace": true, + "kind": true, + "name": true, + } + + diff := map[string]prov.PropertyDiff{} + oldArgs := reflect.ValueOf(req.State.WorkloadRuleArgs) + newArgs := reflect.ValueOf(req.Inputs) + t := oldArgs.Type() + for i := 0; i < t.NumField(); i++ { + tag, ok := t.Field(i).Tag.Lookup("pulumi") + if !ok { + continue + } + name := strings.Split(tag, ",")[0] + if reflect.DeepEqual(oldArgs.Field(i).Interface(), newArgs.Field(i).Interface()) { + continue + } + kind := prov.Update + if replaceOn[name] { + kind = prov.UpdateReplace + } + diff[name] = prov.PropertyDiff{Kind: kind, InputDiff: true} + } + + return infer.DiffResponse{ + HasChanges: len(diff) > 0, + DetailedDiff: diff, + }, nil +} + func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[WorkloadRuleState]) (infer.DeleteResponse, error) { cs := clientset.Get() if cs == nil { @@ -339,7 +415,7 @@ func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[Workl TeamId: cs.TeamID, RuleId: req.ID, })) - if err != nil { + if err != nil && !isNotFound(err) { return infer.DeleteResponse{}, fmt.Errorf("DeleteWorkloadRule: %w", err) } return infer.DeleteResponse{}, nil @@ -347,7 +423,10 @@ func (w *WorkloadRule) Delete(ctx context.Context, req infer.DeleteRequest[Workl // ---------- proto conversion helpers ---------- -func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs) *apiv1.UpsertManualWorkloadRuleRequest { +// ruleArgsToUpsertRequest 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). +func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs, includeDisabled bool) *apiv1.UpsertManualWorkloadRuleRequest { // Attribute the rule to the Pulumi provider so the server persists // source=pulumi_manual or source=pulumi_auto. Audit + UI surfaces use // this to distinguish IaC-managed rules from UI edits AND to tell whether @@ -396,6 +475,13 @@ func ruleArgsToUpsertRequest(teamID string, a WorkloadRuleArgs) *apiv1.UpsertMan if a.DefragmentationSchedule != nil { req.Fields.DefragmentationSchedule = a.DefragmentationSchedule } + if a.LookbackPeriodSeconds != nil { + v := int32(*a.LookbackPeriodSeconds) + req.Fields.LookbackPeriodSeconds = &v + } + if includeDisabled && a.Disabled != nil { + req.Fields.Disabled = a.Disabled + } return req } @@ -417,6 +503,13 @@ func ruleProtoToArgs(r *apiv1.WorkloadRule) WorkloadRuleArgs { UseInPlaceVerticalScaling: r.UseInPlaceVerticalScaling, Containers: containerRuleConfigsFromProto(r.Containers), } + if r.Disabled { + a.Disabled = truePtr() + } + if r.LookbackPeriodSeconds != nil { + v := int(*r.LookbackPeriodSeconds) + a.LookbackPeriodSeconds = &v + } if r.StartupPeriodSeconds != nil { v := int(*r.StartupPeriodSeconds) a.StartupPeriodSeconds = &v @@ -500,6 +593,14 @@ func resourceRuleConfigToProto(r *ResourceRuleConfigArgs) *apiv1.ResourceRuleCon v := float32(*r.MaxScaleDownPercent) p.MaxScaleDownPercent = &v } + p.InitialRequest = intPtrToInt64Ptr(r.InitialRequest) + p.FloorPercent = intPtrToInt64Ptr(r.FloorPercent) + p.CeilingPercent = intPtrToInt64Ptr(r.CeilingPercent) + p.InitialLimit = intPtrToInt64Ptr(r.InitialLimit) + p.LimitFloorPercent = intPtrToInt64Ptr(r.LimitFloorPercent) + p.LimitCeilingPercent = intPtrToInt64Ptr(r.LimitCeilingPercent) + p.RequestUseRss = r.RequestUseRss + p.LimitUseRss = r.LimitUseRss return p } @@ -521,21 +622,29 @@ func resourceRuleConfigFromProto(p *apiv1.ResourceRuleConfig) *ResourceRuleConfi r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := float64(*p.LimitMultiplier) + v := f32to64(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := float64(*p.TargetPercentile) + v := f32to64(*p.TargetPercentile) r.TargetPercentile = &v } if p.MaxScaleUpPercent != nil { - v := float64(*p.MaxScaleUpPercent) + v := f32to64(*p.MaxScaleUpPercent) r.MaxScaleUpPercent = &v } if p.MaxScaleDownPercent != nil { - v := float64(*p.MaxScaleDownPercent) + v := f32to64(*p.MaxScaleDownPercent) r.MaxScaleDownPercent = &v } + r.InitialRequest = int64PtrToIntPtr(p.InitialRequest) + r.FloorPercent = int64PtrToIntPtr(p.FloorPercent) + r.CeilingPercent = int64PtrToIntPtr(p.CeilingPercent) + r.InitialLimit = int64PtrToIntPtr(p.InitialLimit) + r.LimitFloorPercent = int64PtrToIntPtr(p.LimitFloorPercent) + r.LimitCeilingPercent = int64PtrToIntPtr(p.LimitCeilingPercent) + r.RequestUseRss = p.RequestUseRss + r.LimitUseRss = p.LimitUseRss return r } @@ -554,17 +663,6 @@ func hpaRuleConfigToProto(h *HPARuleConfigArgs) *apiv1.HPARuleConfig { v := int32(*h.MaxReplicas) p.MaxReplicas = &v } - if h.TargetUtilization != nil { - v := float32(*h.TargetUtilization) - p.TargetUtilization = &v - } - if h.TargetMemoryUtilization != nil { - v := float32(*h.TargetMemoryUtilization) - p.TargetMemoryUtilization = &v - } - if h.PrimaryMetric != nil { - p.PrimaryMetric = hpaMetricToProto(h.PrimaryMetric) - } if h.MaxReplicaChangePercent != nil { v := float32(*h.MaxReplicaChangePercent) p.MaxReplicaChangePercent = &v @@ -603,19 +701,8 @@ func hpaRuleConfigFromProto(p *apiv1.HPARuleConfig) *HPARuleConfigArgs { v := int(*p.MaxReplicas) h.MaxReplicas = &v } - if p.TargetUtilization != nil { - v := float64(*p.TargetUtilization) - h.TargetUtilization = &v - } - if p.TargetMemoryUtilization != nil { - v := float64(*p.TargetMemoryUtilization) - h.TargetMemoryUtilization = &v - } - if p.PrimaryMetric != nil { - h.PrimaryMetric = hpaMetricFromProto(p.PrimaryMetric) - } if p.MaxReplicaChangePercent != nil { - v := float64(*p.MaxReplicaChangePercent) + v := f32to64(*p.MaxReplicaChangePercent) h.MaxReplicaChangePercent = &v } if p.ScaleDownCooldownSeconds != nil { @@ -649,6 +736,7 @@ func hpaMetricTriggersToProto(ms []HPAMetricTriggerArgs) []*apiv1.HPAMetricTrigg result[i].Weight = m.Weight result[i].ServerAddress = m.ServerAddress result[i].Query = m.Query + result[i].ConnectorId = m.ConnectorId } return result } @@ -659,14 +747,28 @@ func hpaMetricTriggersFromProto(ps []*apiv1.HPAMetricTrigger) []HPAMetricTrigger if p == nil { continue } + // The backend folds serverAddress/query into metadata on write and + // re-derives the dedicated fields on read; strip the folded keys so + // metadata reflects only what the user configured. + var metadata map[string]string + for k, v := range p.Metadata { + if k == "serverAddress" || k == "query" { + continue + } + if metadata == nil { + metadata = map[string]string{} + } + metadata[k] = v + } result = append(result, HPAMetricTriggerArgs{ Type: p.Type, TargetUtilization: p.TargetUtilization, TargetValue: p.TargetValue, Weight: p.Weight, - Metadata: p.Metadata, + Metadata: metadata, ServerAddress: p.ServerAddress, Query: p.Query, + ConnectorId: p.ConnectorId, }) } return result @@ -774,12 +876,12 @@ func emergencyResponseFromProto(p *apiv1.EmergencyResponseConfig) *EmergencyResp } return &EmergencyResponseConfigArgs{ OomEnabled: p.OomEnabled, - OomMemoryMultiplier: float64(p.OomMemoryMultiplier), + OomMemoryMultiplier: f32to64(p.OomMemoryMultiplier), OomMaxReactions: int(p.OomMaxReactions), OomCooldownSeconds: int(p.OomCooldownSeconds), CpuThrottlingEnabled: p.CpuThrottlingEnabled, - CpuThrottlingThreshold: float64(p.CpuThrottlingThreshold), - CpuThrottlingMultiplier: float64(p.CpuThrottlingMultiplier), + CpuThrottlingThreshold: f32to64(p.CpuThrottlingThreshold), + CpuThrottlingMultiplier: f32to64(p.CpuThrottlingMultiplier), } } @@ -842,6 +944,8 @@ func containerResourceConfigToProto(r *ResourceRuleConfigArgs) *apiv1.ContainerR v := float32(*r.TargetPercentile) p.TargetPercentile = &v } + p.RequestUseRss = r.RequestUseRss + p.LimitUseRss = r.LimitUseRss return p } @@ -863,12 +967,14 @@ func containerResourceConfigFromProto(p *apiv1.ContainerResourceConfig) *Resourc r.MaxRequest = &v } if p.LimitMultiplier != nil { - v := float64(*p.LimitMultiplier) + v := f32to64(*p.LimitMultiplier) r.LimitMultiplier = &v } if p.TargetPercentile != nil { - v := float64(*p.TargetPercentile) + v := f32to64(*p.TargetPercentile) r.TargetPercentile = &v } + r.RequestUseRss = p.RequestUseRss + r.LimitUseRss = p.LimitUseRss return r } diff --git a/provider/pkg/resources/workload_rule_test.go b/provider/pkg/resources/workload_rule_test.go index fb3502c..ab52c09 100644 --- a/provider/pkg/resources/workload_rule_test.go +++ b/provider/pkg/resources/workload_rule_test.go @@ -311,7 +311,7 @@ func TestWorkloadRule_Read_NilClientSet(t *testing.T) { func TestWorkloadRule_Read_APIError(t *testing.T) { rec := &mockWorkloadRuleClient{ getFn: func(_ context.Context, _ *connect.Request[apiv1.GetWorkloadRuleByIDRequest]) (*connect.Response[apiv1.GetWorkloadRuleByIDResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockWorkloadRuleClientSet(t, rec) @@ -463,7 +463,7 @@ func TestWorkloadRule_Delete_NilClientSet(t *testing.T) { func TestWorkloadRule_Delete_APIError(t *testing.T) { rec := &mockWorkloadRuleClient{ deleteFn: func(_ context.Context, _ *connect.Request[apiv1.DeleteWorkloadRuleRequest]) (*connect.Response[apiv1.DeleteWorkloadRuleResponse], error) { - return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + return nil, connect.NewError(connect.CodeInternal, errors.New("backend exploded")) }, } withMockWorkloadRuleClientSet(t, rec) @@ -538,16 +538,12 @@ func TestResourceRuleConfig_Nil(t *testing.T) { func TestHPARuleConfig_RoundTrip(t *testing.T) { minR := 1 maxR := 10 - util := 0.7 - metric := "cpu" maxChange := 50.0 h := &HPARuleConfigArgs{ - Enabled: true, - MinReplicas: &minR, - MaxReplicas: &maxR, - TargetUtilization: &util, - PrimaryMetric: &metric, + Enabled: true, + MinReplicas: &minR, + MaxReplicas: &maxR, MaxReplicaChangePercent: &maxChange, } @@ -564,9 +560,6 @@ func TestHPARuleConfig_RoundTrip(t *testing.T) { if back.MaxReplicas == nil || *back.MaxReplicas != maxR { t.Errorf("MaxReplicas: got %v, want %d", back.MaxReplicas, maxR) } - if back.PrimaryMetric == nil || *back.PrimaryMetric != metric { - t.Errorf("PrimaryMetric: got %v, want %q", back.PrimaryMetric, metric) - } if back.MaxReplicaChangePercent == nil || *back.MaxReplicaChangePercent != maxChange { t.Errorf("MaxReplicaChangePercent: got %v, want %f", back.MaxReplicaChangePercent, maxChange) } diff --git a/schema.json b/schema.json index f680541..38a25fe 100644 --- a/schema.json +++ b/schema.json @@ -277,6 +277,9 @@ "type": "string", "description": "Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'." }, + "imageVersion": { + "type": "string" + }, "kubelet": { "$ref": "#/types/devzero:resources:AzureKubeletConfigurationArgs", "description": "Kubelet configuration overrides for Azure nodes." @@ -533,6 +536,9 @@ }, "devzero:resources:HPAMetricTriggerArgs": { "properties": { + "connectorId": { + "type": "string" + }, "metadata": { "type": "object", "additionalProperties": { @@ -601,27 +607,15 @@ "items": { "$ref": "#/types/devzero:resources:HPAMetricTriggerArgs" }, - "description": "Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric \u2014 do not redeclare them here." + "description": "HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields." }, "minReplicas": { "type": "integer", "description": "Minimum number of replicas. Example: 2." }, - "primaryMetric": { - "type": "string", - "description": "Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'." - }, "scaleDownCooldownSeconds": { "type": "integer", "description": "Seconds to wait between scale-down events. Example: 300." - }, - "targetMemoryUtilization": { - "type": "number", - "description": "Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8." - }, - "targetUtilization": { - "type": "number", - "description": "Target CPU utilization ratio (0-1). Example: 0.7." } }, "type": "object" @@ -670,6 +664,9 @@ }, "devzero:resources:HorizontalScalingArgs": { "properties": { + "compositeFormula": { + "type": "string" + }, "enabled": { "type": "boolean", "description": "Enable horizontal (replica) scaling. Example: true." @@ -690,6 +687,9 @@ "type": "integer", "description": "Minimum number of replicas to maintain. Example: 2." }, + "networkTargetThroughputBytesPerSec": { + "type": "integer" + }, "primaryMetric": { "type": "string", "description": "Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'.", @@ -701,6 +701,12 @@ "network_egress" ] }, + "scaleDownCooldownSeconds": { + "type": "integer" + }, + "targetMemoryUtilization": { + "type": "number" + }, "targetUtilization": { "type": "number", "description": "Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization." @@ -886,14 +892,35 @@ }, "devzero:resources:ResourceRuleConfigArgs": { "properties": { + "ceilingPercent": { + "type": "integer" + }, "enabled": { "type": "boolean", "description": "Enable this resource axis rule. Example: true." }, + "floorPercent": { + "type": "integer" + }, + "initialLimit": { + "type": "integer" + }, + "initialRequest": { + "type": "integer" + }, + "limitCeilingPercent": { + "type": "integer" + }, + "limitFloorPercent": { + "type": "integer" + }, "limitMultiplier": { "type": "number", "description": "Multiplier applied to the request to derive the resource limit. Example: 1.5." }, + "limitUseRss": { + "type": "boolean" + }, "limitsAdjustmentEnabled": { "type": "boolean", "description": "Whether to also adjust resource limits alongside requests. Example: true." @@ -918,6 +945,9 @@ "type": "integer", "description": "Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100." }, + "requestUseRss": { + "type": "boolean" + }, "targetPercentile": { "type": "number", "description": "Percentile of usage data used as the recommendation target (0-1). Example: 0.95." @@ -1001,6 +1031,9 @@ "type": "number", "description": "Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request." }, + "limitUseRss": { + "type": "boolean" + }, "limitsAdjustmentEnabled": { "type": "boolean", "description": "Whether to also adjust resource limits alongside requests. Example: true." @@ -1036,12 +1069,29 @@ "type": "number", "description": "Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead." }, + "requestUseRss": { + "type": "boolean" + }, "targetPercentile": { "type": "number", "description": "Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile." } }, "type": "object" + }, + "devzero:resources:ZonalShiftConfigArgs": { + "properties": { + "allowZoneFallback": { + "type": "boolean" + }, + "evictImpactedNodes": { + "type": "boolean" + }, + "respectZonalShift": { + "type": "boolean" + } + }, + "type": "object" } }, "resources": { @@ -1088,6 +1138,9 @@ "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: [\"spot\", \"on-demand\"]}." }, + "cloudProviderId": { + "type": "integer" + }, "description": { "type": "string", "description": "Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'." @@ -1116,6 +1169,9 @@ "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Filter instances by hypervisor type. Example: {in: [\"nitro\"]}." }, + "instanceLocalNvme": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "instanceSizes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Filter instances by size label. Example: {in: [\"large\", \"xlarge\", \"2xlarge\"]}." @@ -1135,6 +1191,9 @@ "$ref": "#/types/devzero:resources:ResourceLimitsArgs", "description": "Resource limits on total capacity managed by this policy. Example: {cpu: \"1000\", memory: \"1000Gi\"}." }, + "masterOverrideRoleName": { + "type": "string" + }, "name": { "type": "string", "description": "Human-friendly name for the node policy. Example: 'prod-spot-policy'." @@ -1158,6 +1217,12 @@ }, "description": "Raw Karpenter YAML for full NodePool/NodeClass customization \u2014 use only when structured fields are insufficient." }, + "startupTaints": { + "type": "array", + "items": { + "$ref": "#/types/devzero:resources:TaintArgs" + } + }, "taints": { "type": "array", "items": { @@ -1169,6 +1234,9 @@ "type": "integer", "description": "Priority weight; higher values take precedence when multiple policies match. Example: 100." }, + "zonalShift": { + "$ref": "#/types/devzero:resources:ZonalShiftConfigArgs" + }, "zones": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Availability zones where nodes may be provisioned. Example: {in: [\"us-east-1a\", \"us-east-1b\"]}." @@ -1190,6 +1258,9 @@ "capacityTypes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, + "cloudProviderId": { + "type": "integer" + }, "description": { "type": "string" }, @@ -1211,6 +1282,9 @@ "instanceHypervisors": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, + "instanceLocalNvme": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "instanceSizes": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" }, @@ -1226,6 +1300,9 @@ "limits": { "$ref": "#/types/devzero:resources:ResourceLimitsArgs" }, + "masterOverrideRoleName": { + "type": "string" + }, "name": { "type": "string" }, @@ -1244,6 +1321,12 @@ "$ref": "#/types/devzero:resources:RawKarpenterSpecArgs" } }, + "startupTaints": { + "type": "array", + "items": { + "$ref": "#/types/devzero:resources:TaintArgs" + } + }, "taints": { "type": "array", "items": { @@ -1253,6 +1336,9 @@ "weight": { "type": "integer" }, + "zonalShift": { + "$ref": "#/types/devzero:resources:ZonalShiftConfigArgs" + }, "zones": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" } @@ -1268,7 +1354,7 @@ "items": { "type": "string" }, - "description": "Cluster IDs where this node policy applies." + "description": "Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster." }, "description": { "type": "string", @@ -1276,7 +1362,8 @@ }, "enabled": { "type": "boolean", - "description": "Whether this target is active. Defaults to true." + "description": "Whether this target is active. Defaults to true.", + "default": true }, "name": { "type": "string", @@ -1327,11 +1414,26 @@ }, "description": "When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: [\"on_detection\"]." }, + "allowInPlaceMemoryLimitDecrease": { + "type": "boolean" + }, "cooldownMinutes": { "type": "integer", "description": "Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default).", "default": 300 }, + "cpuCeilingPercent": { + "type": "integer" + }, + "cpuFloorPercent": { + "type": "integer" + }, + "cpuLimitCeilingPercent": { + "type": "integer" + }, + "cpuLimitFloorPercent": { + "type": "integer" + }, "cpuVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1358,6 +1460,9 @@ "type": "number", "description": "Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0." }, + "enableInPlaceVerticalScaling": { + "type": "boolean" + }, "enablePmaxProtection": { "type": "boolean", "description": "Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false." @@ -1377,6 +1482,33 @@ "type": "number", "description": "Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band)." }, + "jvmCpuStartupFloorMillicores": { + "type": "integer" + }, + "jvmHeapHeadroomMultiplier": { + "type": "number" + }, + "jvmHeapOptimizationEnabled": { + "type": "boolean" + }, + "jvmHeapTargetPercentile": { + "type": "number" + }, + "jvmMaxHeapBytes": { + "type": "integer" + }, + "jvmMinHeapBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadPercent": { + "type": "number" + }, + "jvmPreferContainerSupport": { + "type": "boolean" + }, "liveMigrationEnabled": { "type": "boolean", "description": "Allow live pod migration when applying recommendations without restart. Example: false." @@ -1386,6 +1518,18 @@ "description": "Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default).", "default": 86400 }, + "memoryCeilingPercent": { + "type": "integer" + }, + "memoryFloorPercent": { + "type": "integer" + }, + "memoryLimitCeilingPercent": { + "type": "integer" + }, + "memoryLimitFloorPercent": { + "type": "integer" + }, "memoryVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1408,6 +1552,9 @@ "type": "string", "description": "Human-friendly name for the policy. Example: 'production-vpa-policy'." }, + "pdbEnabled": { + "type": "boolean" + }, "pmaxRatioThreshold": { "type": "number", "description": "Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) \u2014 triggers when peak is 3\u00d7 the recommendation.", @@ -1444,11 +1591,26 @@ }, "description": "When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: [\"on_detection\"]." }, + "allowInPlaceMemoryLimitDecrease": { + "type": "boolean" + }, "cooldownMinutes": { "type": "integer", "description": "Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default).", "default": 300 }, + "cpuCeilingPercent": { + "type": "integer" + }, + "cpuFloorPercent": { + "type": "integer" + }, + "cpuLimitCeilingPercent": { + "type": "integer" + }, + "cpuLimitFloorPercent": { + "type": "integer" + }, "cpuVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1480,6 +1642,9 @@ "type": "number", "description": "Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0." }, + "enableInPlaceVerticalScaling": { + "type": "boolean" + }, "enablePmaxProtection": { "type": "boolean", "description": "Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false." @@ -1499,6 +1664,33 @@ "type": "number", "description": "Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band)." }, + "jvmCpuStartupFloorMillicores": { + "type": "integer" + }, + "jvmHeapHeadroomMultiplier": { + "type": "number" + }, + "jvmHeapOptimizationEnabled": { + "type": "boolean" + }, + "jvmHeapTargetPercentile": { + "type": "number" + }, + "jvmMaxHeapBytes": { + "type": "integer" + }, + "jvmMinHeapBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadBytes": { + "type": "integer" + }, + "jvmNonHeapOverheadPercent": { + "type": "number" + }, + "jvmPreferContainerSupport": { + "type": "boolean" + }, "liveMigrationEnabled": { "type": "boolean", "description": "Allow live pod migration when applying recommendations without restart. Example: false." @@ -1508,6 +1700,18 @@ "description": "Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default).", "default": 86400 }, + "memoryCeilingPercent": { + "type": "integer" + }, + "memoryFloorPercent": { + "type": "integer" + }, + "memoryLimitCeilingPercent": { + "type": "integer" + }, + "memoryLimitFloorPercent": { + "type": "integer" + }, "memoryVerticalScaling": { "$ref": "#/types/devzero:resources:VerticalScalingArgs" }, @@ -1530,6 +1734,9 @@ "type": "string", "description": "Human-friendly name for the policy. Example: 'production-vpa-policy'." }, + "pdbEnabled": { + "type": "boolean" + }, "pmaxRatioThreshold": { "type": "number", "description": "Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) \u2014 triggers when peak is 3\u00d7 the recommendation.", @@ -1557,6 +1764,10 @@ }, "devzero:resources:WorkloadPolicyTarget": { "properties": { + "annotationSelector": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs", + "description": "Select workloads by annotations (same semantics as label selectors, evaluated against annotations)." + }, "clusterIds": { "type": "array", "items": { @@ -1570,7 +1781,8 @@ }, "enabled": { "type": "boolean", - "description": "Enable or disable this target." + "description": "Enable or disable this target. Defaults to true.", + "default": true }, "kindFilter": { "type": "array", @@ -1579,6 +1791,13 @@ }, "description": "Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod)." }, + "kindFilterNotIn": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Kubernetes kinds to exclude from matching. Same allowed values as kindFilter." + }, "name": { "type": "string", "description": "Human-friendly name for this target." @@ -1600,7 +1819,8 @@ "items": { "type": "string" }, - "description": "Restrict matching to specific node groups by name." + "description": "DEPRECATED: unused by the DevZero API \u2014 no longer evaluated by any active target.", + "deprecationMessage": "node_group_names is deprecated by the DevZero API and no longer evaluated." }, "policyId": { "type": "string", @@ -1617,6 +1837,13 @@ }, "description": "Explicit list of workload names to include." }, + "workloadNamesNotIn": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Explicit list of workload names to exclude." + }, "workloadSelector": { "$ref": "#/types/devzero:resources:LabelSelectorArgs", "description": "Select workloads by labels." @@ -1628,6 +1855,9 @@ "clusterIds" ], "inputProperties": { + "annotationSelector": { + "$ref": "#/types/devzero:resources:LabelSelectorArgs" + }, "clusterIds": { "type": "array", "items": { @@ -1657,6 +1887,12 @@ ] } }, + "kindFilterNotIn": { + "type": "array", + "items": { + "type": "string" + } + }, "name": { "type": "string" }, @@ -1687,6 +1923,12 @@ "type": "string" } }, + "workloadNamesNotIn": { + "type": "array", + "items": { + "type": "string" + } + }, "workloadSelector": { "$ref": "#/types/devzero:resources:LabelSelectorArgs" } @@ -1744,6 +1986,9 @@ }, "description": "Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: [\"pod_creation\"]." }, + "disabled": { + "type": "boolean" + }, "emergencyResponse": { "$ref": "#/types/devzero:resources:EmergencyResponseConfigArgs", "description": "Emergency response configuration for OOM and CPU throttle events." @@ -1764,6 +2009,9 @@ "type": "boolean", "description": "Allow live pod migration when applying recommendations. Example: false." }, + "lookbackPeriodSeconds": { + "type": "integer" + }, "memoryRule": { "$ref": "#/types/devzero:resources:ResourceRuleConfigArgs", "description": "Memory vertical scaling rule configuration." @@ -1844,6 +2092,9 @@ }, "description": "Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: [\"pod_creation\"]." }, + "disabled": { + "type": "boolean" + }, "emergencyResponse": { "$ref": "#/types/devzero:resources:EmergencyResponseConfigArgs", "description": "Emergency response configuration for OOM and CPU throttle events." @@ -1864,6 +2115,9 @@ "type": "boolean", "description": "Allow live pod migration when applying recommendations. Example: false." }, + "lookbackPeriodSeconds": { + "type": "integer" + }, "memoryRule": { "$ref": "#/types/devzero:resources:ResourceRuleConfigArgs", "description": "Memory vertical scaling rule configuration." diff --git a/scripts/ci/test-nodejs.sh b/scripts/ci/test-nodejs.sh index 0d074db..2a818c9 100755 --- a/scripts/ci/test-nodejs.sh +++ b/scripts/ci/test-nodejs.sh @@ -45,7 +45,10 @@ cat > package.json <<'PKG' { "name": "consumer-test", "version": "1.0.0", - "private": true + "private": true, + "overrides": { + "@types/node": "^18" + } } PKG diff --git a/sdk/go/devzero/resources/nodePolicy.go b/sdk/go/devzero/resources/nodePolicy.go index acc36ea..cb02731 100644 --- a/sdk/go/devzero/resources/nodePolicy.go +++ b/sdk/go/devzero/resources/nodePolicy.go @@ -22,7 +22,8 @@ type NodePolicy struct { // Azure-specific AKSNodeClass configuration (VNet subnet, OS disk, image family, etc.). Azure AzureNodeClassSpecArgsPtrOutput `pulumi:"azure"` // Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: ["spot", "on-demand"]}. - CapacityTypes LabelSelectorArgsPtrOutput `pulumi:"capacityTypes"` + CapacityTypes LabelSelectorArgsPtrOutput `pulumi:"capacityTypes"` + CloudProviderId pulumi.IntPtrOutput `pulumi:"cloudProviderId"` // Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. Description pulumi.StringPtrOutput `pulumi:"description"` // Karpenter disruption policy controlling consolidation, expiry, and budgets. @@ -37,6 +38,7 @@ type NodePolicy struct { InstanceGenerations LabelSelectorArgsPtrOutput `pulumi:"instanceGenerations"` // Filter instances by hypervisor type. Example: {in: ["nitro"]}. InstanceHypervisors LabelSelectorArgsPtrOutput `pulumi:"instanceHypervisors"` + InstanceLocalNvme LabelSelectorArgsPtrOutput `pulumi:"instanceLocalNvme"` // Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. InstanceSizes LabelSelectorArgsPtrOutput `pulumi:"instanceSizes"` // Explicitly allow specific instance types. Example: {in: ["m5.large", "c6i.large"]}. @@ -44,7 +46,8 @@ type NodePolicy struct { // Labels applied to all provisioned nodes. Example: {"team": "backend", "env": "prod"}. Labels pulumi.StringMapOutput `pulumi:"labels"` // Resource limits on total capacity managed by this policy. Example: {cpu: "1000", memory: "1000Gi"}. - Limits ResourceLimitsArgsPtrOutput `pulumi:"limits"` + Limits ResourceLimitsArgsPtrOutput `pulumi:"limits"` + MasterOverrideRoleName pulumi.StringPtrOutput `pulumi:"masterOverrideRoleName"` // Human-friendly name for the node policy. Example: 'prod-spot-policy'. Name pulumi.StringOutput `pulumi:"name"` // Override name for the generated Karpenter NodeClass resource. Example: 'prod-aws-nodeclass'. @@ -54,11 +57,13 @@ type NodePolicy struct { // Operating systems for nodes. Example: {in: ["linux"]}. OperatingSystems LabelSelectorArgsPtrOutput `pulumi:"operatingSystems"` // Raw Karpenter YAML for full NodePool/NodeClass customization — use only when structured fields are insufficient. - Raw RawKarpenterSpecArgsArrayOutput `pulumi:"raw"` + Raw RawKarpenterSpecArgsArrayOutput `pulumi:"raw"` + StartupTaints TaintArgsArrayOutput `pulumi:"startupTaints"` // Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. Taints TaintArgsArrayOutput `pulumi:"taints"` // Priority weight; higher values take precedence when multiple policies match. Example: 100. - Weight pulumi.IntPtrOutput `pulumi:"weight"` + Weight pulumi.IntPtrOutput `pulumi:"weight"` + ZonalShift ZonalShiftConfigArgsPtrOutput `pulumi:"zonalShift"` // Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. Zones LabelSelectorArgsPtrOutput `pulumi:"zones"` } @@ -106,56 +111,66 @@ func (NodePolicyState) ElementType() reflect.Type { } type nodePolicyArgs struct { - Architectures *LabelSelectorArgs `pulumi:"architectures"` - Aws *AWSNodeClassSpecArgs `pulumi:"aws"` - Azure *AzureNodeClassSpecArgs `pulumi:"azure"` - CapacityTypes *LabelSelectorArgs `pulumi:"capacityTypes"` - Description *string `pulumi:"description"` - Disruption *DisruptionPolicyArgs `pulumi:"disruption"` - InstanceCategories *LabelSelectorArgs `pulumi:"instanceCategories"` - InstanceCpus *LabelSelectorArgs `pulumi:"instanceCpus"` - InstanceFamilies *LabelSelectorArgs `pulumi:"instanceFamilies"` - InstanceGenerations *LabelSelectorArgs `pulumi:"instanceGenerations"` - InstanceHypervisors *LabelSelectorArgs `pulumi:"instanceHypervisors"` - InstanceSizes *LabelSelectorArgs `pulumi:"instanceSizes"` - InstanceTypes *LabelSelectorArgs `pulumi:"instanceTypes"` - Labels map[string]string `pulumi:"labels"` - Limits *ResourceLimitsArgs `pulumi:"limits"` - Name string `pulumi:"name"` - NodeClassName *string `pulumi:"nodeClassName"` - NodePoolName *string `pulumi:"nodePoolName"` - OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems"` - Raw []RawKarpenterSpecArgs `pulumi:"raw"` - Taints []TaintArgs `pulumi:"taints"` - Weight *int `pulumi:"weight"` - Zones *LabelSelectorArgs `pulumi:"zones"` + Architectures *LabelSelectorArgs `pulumi:"architectures"` + Aws *AWSNodeClassSpecArgs `pulumi:"aws"` + Azure *AzureNodeClassSpecArgs `pulumi:"azure"` + CapacityTypes *LabelSelectorArgs `pulumi:"capacityTypes"` + CloudProviderId *int `pulumi:"cloudProviderId"` + Description *string `pulumi:"description"` + Disruption *DisruptionPolicyArgs `pulumi:"disruption"` + InstanceCategories *LabelSelectorArgs `pulumi:"instanceCategories"` + InstanceCpus *LabelSelectorArgs `pulumi:"instanceCpus"` + InstanceFamilies *LabelSelectorArgs `pulumi:"instanceFamilies"` + InstanceGenerations *LabelSelectorArgs `pulumi:"instanceGenerations"` + InstanceHypervisors *LabelSelectorArgs `pulumi:"instanceHypervisors"` + InstanceLocalNvme *LabelSelectorArgs `pulumi:"instanceLocalNvme"` + InstanceSizes *LabelSelectorArgs `pulumi:"instanceSizes"` + InstanceTypes *LabelSelectorArgs `pulumi:"instanceTypes"` + Labels map[string]string `pulumi:"labels"` + Limits *ResourceLimitsArgs `pulumi:"limits"` + MasterOverrideRoleName *string `pulumi:"masterOverrideRoleName"` + Name string `pulumi:"name"` + NodeClassName *string `pulumi:"nodeClassName"` + NodePoolName *string `pulumi:"nodePoolName"` + OperatingSystems *LabelSelectorArgs `pulumi:"operatingSystems"` + Raw []RawKarpenterSpecArgs `pulumi:"raw"` + StartupTaints []TaintArgs `pulumi:"startupTaints"` + Taints []TaintArgs `pulumi:"taints"` + Weight *int `pulumi:"weight"` + ZonalShift *ZonalShiftConfigArgs `pulumi:"zonalShift"` + Zones *LabelSelectorArgs `pulumi:"zones"` } // The set of arguments for constructing a NodePolicy resource. type NodePolicyArgs struct { - Architectures LabelSelectorArgsPtrInput - Aws AWSNodeClassSpecArgsPtrInput - Azure AzureNodeClassSpecArgsPtrInput - CapacityTypes LabelSelectorArgsPtrInput - Description pulumi.StringPtrInput - Disruption DisruptionPolicyArgsPtrInput - InstanceCategories LabelSelectorArgsPtrInput - InstanceCpus LabelSelectorArgsPtrInput - InstanceFamilies LabelSelectorArgsPtrInput - InstanceGenerations LabelSelectorArgsPtrInput - InstanceHypervisors LabelSelectorArgsPtrInput - InstanceSizes LabelSelectorArgsPtrInput - InstanceTypes LabelSelectorArgsPtrInput - Labels pulumi.StringMapInput - Limits ResourceLimitsArgsPtrInput - Name pulumi.StringInput - NodeClassName pulumi.StringPtrInput - NodePoolName pulumi.StringPtrInput - OperatingSystems LabelSelectorArgsPtrInput - Raw RawKarpenterSpecArgsArrayInput - Taints TaintArgsArrayInput - Weight pulumi.IntPtrInput - Zones LabelSelectorArgsPtrInput + Architectures LabelSelectorArgsPtrInput + Aws AWSNodeClassSpecArgsPtrInput + Azure AzureNodeClassSpecArgsPtrInput + CapacityTypes LabelSelectorArgsPtrInput + CloudProviderId pulumi.IntPtrInput + Description pulumi.StringPtrInput + Disruption DisruptionPolicyArgsPtrInput + InstanceCategories LabelSelectorArgsPtrInput + InstanceCpus LabelSelectorArgsPtrInput + InstanceFamilies LabelSelectorArgsPtrInput + InstanceGenerations LabelSelectorArgsPtrInput + InstanceHypervisors LabelSelectorArgsPtrInput + InstanceLocalNvme LabelSelectorArgsPtrInput + InstanceSizes LabelSelectorArgsPtrInput + InstanceTypes LabelSelectorArgsPtrInput + Labels pulumi.StringMapInput + Limits ResourceLimitsArgsPtrInput + MasterOverrideRoleName pulumi.StringPtrInput + Name pulumi.StringInput + NodeClassName pulumi.StringPtrInput + NodePoolName pulumi.StringPtrInput + OperatingSystems LabelSelectorArgsPtrInput + Raw RawKarpenterSpecArgsArrayInput + StartupTaints TaintArgsArrayInput + Taints TaintArgsArrayInput + Weight pulumi.IntPtrInput + ZonalShift ZonalShiftConfigArgsPtrInput + Zones LabelSelectorArgsPtrInput } func (NodePolicyArgs) ElementType() reflect.Type { @@ -265,6 +280,10 @@ func (o NodePolicyOutput) CapacityTypes() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.CapacityTypes }).(LabelSelectorArgsPtrOutput) } +func (o NodePolicyOutput) CloudProviderId() pulumi.IntPtrOutput { + return o.ApplyT(func(v *NodePolicy) pulumi.IntPtrOutput { return v.CloudProviderId }).(pulumi.IntPtrOutput) +} + // Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. func (o NodePolicyOutput) Description() pulumi.StringPtrOutput { return o.ApplyT(func(v *NodePolicy) pulumi.StringPtrOutput { return v.Description }).(pulumi.StringPtrOutput) @@ -300,6 +319,10 @@ func (o NodePolicyOutput) InstanceHypervisors() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceHypervisors }).(LabelSelectorArgsPtrOutput) } +func (o NodePolicyOutput) InstanceLocalNvme() LabelSelectorArgsPtrOutput { + return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceLocalNvme }).(LabelSelectorArgsPtrOutput) +} + // Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. func (o NodePolicyOutput) InstanceSizes() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.InstanceSizes }).(LabelSelectorArgsPtrOutput) @@ -320,6 +343,10 @@ func (o NodePolicyOutput) Limits() ResourceLimitsArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) ResourceLimitsArgsPtrOutput { return v.Limits }).(ResourceLimitsArgsPtrOutput) } +func (o NodePolicyOutput) MasterOverrideRoleName() pulumi.StringPtrOutput { + return o.ApplyT(func(v *NodePolicy) pulumi.StringPtrOutput { return v.MasterOverrideRoleName }).(pulumi.StringPtrOutput) +} + // Human-friendly name for the node policy. Example: 'prod-spot-policy'. func (o NodePolicyOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *NodePolicy) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) @@ -345,6 +372,10 @@ func (o NodePolicyOutput) Raw() RawKarpenterSpecArgsArrayOutput { return o.ApplyT(func(v *NodePolicy) RawKarpenterSpecArgsArrayOutput { return v.Raw }).(RawKarpenterSpecArgsArrayOutput) } +func (o NodePolicyOutput) StartupTaints() TaintArgsArrayOutput { + return o.ApplyT(func(v *NodePolicy) TaintArgsArrayOutput { return v.StartupTaints }).(TaintArgsArrayOutput) +} + // Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. func (o NodePolicyOutput) Taints() TaintArgsArrayOutput { return o.ApplyT(func(v *NodePolicy) TaintArgsArrayOutput { return v.Taints }).(TaintArgsArrayOutput) @@ -355,6 +386,10 @@ func (o NodePolicyOutput) Weight() pulumi.IntPtrOutput { return o.ApplyT(func(v *NodePolicy) pulumi.IntPtrOutput { return v.Weight }).(pulumi.IntPtrOutput) } +func (o NodePolicyOutput) ZonalShift() ZonalShiftConfigArgsPtrOutput { + return o.ApplyT(func(v *NodePolicy) ZonalShiftConfigArgsPtrOutput { return v.ZonalShift }).(ZonalShiftConfigArgsPtrOutput) +} + // Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. func (o NodePolicyOutput) Zones() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *NodePolicy) LabelSelectorArgsPtrOutput { return v.Zones }).(LabelSelectorArgsPtrOutput) diff --git a/sdk/go/devzero/resources/nodePolicyTarget.go b/sdk/go/devzero/resources/nodePolicyTarget.go index 14acc17..8f3fd7a 100644 --- a/sdk/go/devzero/resources/nodePolicyTarget.go +++ b/sdk/go/devzero/resources/nodePolicyTarget.go @@ -15,7 +15,7 @@ import ( type NodePolicyTarget struct { pulumi.CustomResourceState - // Cluster IDs where this node policy applies. + // Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. ClusterIds pulumi.StringArrayOutput `pulumi:"clusterIds"` // Free-form description of the target. Description pulumi.StringPtrOutput `pulumi:"description"` @@ -179,7 +179,7 @@ func (o NodePolicyTargetOutput) ToNodePolicyTargetOutputWithContext(ctx context. return o } -// Cluster IDs where this node policy applies. +// Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. func (o NodePolicyTargetOutput) ClusterIds() pulumi.StringArrayOutput { return o.ApplyT(func(v *NodePolicyTarget) pulumi.StringArrayOutput { return v.ClusterIds }).(pulumi.StringArrayOutput) } diff --git a/sdk/go/devzero/resources/pulumiTypes.go b/sdk/go/devzero/resources/pulumiTypes.go index e8810ec..1e62fc5 100644 --- a/sdk/go/devzero/resources/pulumiTypes.go +++ b/sdk/go/devzero/resources/pulumiTypes.go @@ -891,7 +891,8 @@ type AzureNodeClassSpecArgs struct { // FIPS 140-2 compliance mode for the node. One of: 'Enabled', 'Disabled'. Example: 'Disabled'. FipsMode *string `pulumi:"fipsMode"` // Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. - ImageFamily *string `pulumi:"imageFamily"` + ImageFamily *string `pulumi:"imageFamily"` + ImageVersion *string `pulumi:"imageVersion"` // Kubelet configuration overrides for Azure nodes. Kubelet *AzureKubeletConfigurationArgs `pulumi:"kubelet"` // Maximum pods per node, overrides the AKS cluster default. Example: 110. @@ -919,7 +920,8 @@ type AzureNodeClassSpecArgsArgs struct { // FIPS 140-2 compliance mode for the node. One of: 'Enabled', 'Disabled'. Example: 'Disabled'. FipsMode pulumi.StringPtrInput `pulumi:"fipsMode"` // Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. - ImageFamily pulumi.StringPtrInput `pulumi:"imageFamily"` + ImageFamily pulumi.StringPtrInput `pulumi:"imageFamily"` + ImageVersion pulumi.StringPtrInput `pulumi:"imageVersion"` // Kubelet configuration overrides for Azure nodes. Kubelet AzureKubeletConfigurationArgsPtrInput `pulumi:"kubelet"` // Maximum pods per node, overrides the AKS cluster default. Example: 110. @@ -1019,6 +1021,10 @@ func (o AzureNodeClassSpecArgsOutput) ImageFamily() pulumi.StringPtrOutput { return o.ApplyT(func(v AzureNodeClassSpecArgs) *string { return v.ImageFamily }).(pulumi.StringPtrOutput) } +func (o AzureNodeClassSpecArgsOutput) ImageVersion() pulumi.StringPtrOutput { + return o.ApplyT(func(v AzureNodeClassSpecArgs) *string { return v.ImageVersion }).(pulumi.StringPtrOutput) +} + // Kubelet configuration overrides for Azure nodes. func (o AzureNodeClassSpecArgsOutput) Kubelet() AzureKubeletConfigurationArgsPtrOutput { return o.ApplyT(func(v AzureNodeClassSpecArgs) *AzureKubeletConfigurationArgs { return v.Kubelet }).(AzureKubeletConfigurationArgsPtrOutput) @@ -1088,6 +1094,15 @@ func (o AzureNodeClassSpecArgsPtrOutput) ImageFamily() pulumi.StringPtrOutput { }).(pulumi.StringPtrOutput) } +func (o AzureNodeClassSpecArgsPtrOutput) ImageVersion() pulumi.StringPtrOutput { + return o.ApplyT(func(v *AzureNodeClassSpecArgs) *string { + if v == nil { + return nil + } + return v.ImageVersion + }).(pulumi.StringPtrOutput) +} + // Kubelet configuration overrides for Azure nodes. func (o AzureNodeClassSpecArgsPtrOutput) Kubelet() AzureKubeletConfigurationArgsPtrOutput { return o.ApplyT(func(v *AzureNodeClassSpecArgs) *AzureKubeletConfigurationArgs { @@ -2720,6 +2735,7 @@ func (o HPAFallbackArgsPtrOutput) Replicas() pulumi.IntPtrOutput { } type HPAMetricTriggerArgs struct { + ConnectorId *string `pulumi:"connectorId"` // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. Metadata map[string]string `pulumi:"metadata"` // PromQL query string. Shorthand — packed into metadata by the service layer. Example: 'sum(rate(http_requests_total[2m]))'. @@ -2748,6 +2764,7 @@ type HPAMetricTriggerArgsInput interface { } type HPAMetricTriggerArgsArgs struct { + ConnectorId pulumi.StringPtrInput `pulumi:"connectorId"` // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. Metadata pulumi.StringMapInput `pulumi:"metadata"` // PromQL query string. Shorthand — packed into metadata by the service layer. Example: 'sum(rate(http_requests_total[2m]))'. @@ -2815,6 +2832,10 @@ func (o HPAMetricTriggerArgsOutput) ToHPAMetricTriggerArgsOutputWithContext(ctx return o } +func (o HPAMetricTriggerArgsOutput) ConnectorId() pulumi.StringPtrOutput { + return o.ApplyT(func(v HPAMetricTriggerArgs) *string { return v.ConnectorId }).(pulumi.StringPtrOutput) +} + // Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. func (o HPAMetricTriggerArgsOutput) Metadata() pulumi.StringMapOutput { return o.ApplyT(func(v HPAMetricTriggerArgs) map[string]string { return v.Metadata }).(pulumi.StringMapOutput) @@ -2883,18 +2904,12 @@ type HPARuleConfigArgs struct { MaxReplicaChangePercent *float64 `pulumi:"maxReplicaChangePercent"` // Maximum number of replicas. Example: 10. MaxReplicas *int `pulumi:"maxReplicas"` - // Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + // HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. Metrics []HPAMetricTriggerArgs `pulumi:"metrics"` // Minimum number of replicas. Example: 2. MinReplicas *int `pulumi:"minReplicas"` - // Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric *string `pulumi:"primaryMetric"` // Seconds to wait between scale-down events. Example: 300. ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds"` - // Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization"` - // Target CPU utilization ratio (0-1). Example: 0.7. - TargetUtilization *float64 `pulumi:"targetUtilization"` } // HPARuleConfigArgsInput is an input type that accepts HPARuleConfigArgsArgs and HPARuleConfigArgsOutput values. @@ -2921,18 +2936,12 @@ type HPARuleConfigArgsArgs struct { MaxReplicaChangePercent pulumi.Float64PtrInput `pulumi:"maxReplicaChangePercent"` // Maximum number of replicas. Example: 10. MaxReplicas pulumi.IntPtrInput `pulumi:"maxReplicas"` - // Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + // HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. Metrics HPAMetricTriggerArgsArrayInput `pulumi:"metrics"` // Minimum number of replicas. Example: 2. MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` - // Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` // Seconds to wait between scale-down events. Example: 300. ScaleDownCooldownSeconds pulumi.IntPtrInput `pulumi:"scaleDownCooldownSeconds"` - // Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - TargetMemoryUtilization pulumi.Float64PtrInput `pulumi:"targetMemoryUtilization"` - // Target CPU utilization ratio (0-1). Example: 0.7. - TargetUtilization pulumi.Float64PtrInput `pulumi:"targetUtilization"` } func (HPARuleConfigArgsArgs) ElementType() reflect.Type { @@ -3042,7 +3051,7 @@ func (o HPARuleConfigArgsOutput) MaxReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.MaxReplicas }).(pulumi.IntPtrOutput) } -// Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. +// HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. func (o HPARuleConfigArgsOutput) Metrics() HPAMetricTriggerArgsArrayOutput { return o.ApplyT(func(v HPARuleConfigArgs) []HPAMetricTriggerArgs { return v.Metrics }).(HPAMetricTriggerArgsArrayOutput) } @@ -3052,26 +3061,11 @@ func (o HPARuleConfigArgsOutput) MinReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.MinReplicas }).(pulumi.IntPtrOutput) } -// Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. -func (o HPARuleConfigArgsOutput) PrimaryMetric() pulumi.StringPtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *string { return v.PrimaryMetric }).(pulumi.StringPtrOutput) -} - // Seconds to wait between scale-down events. Example: 300. func (o HPARuleConfigArgsOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v HPARuleConfigArgs) *int { return v.ScaleDownCooldownSeconds }).(pulumi.IntPtrOutput) } -// Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. -func (o HPARuleConfigArgsOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *float64 { return v.TargetMemoryUtilization }).(pulumi.Float64PtrOutput) -} - -// Target CPU utilization ratio (0-1). Example: 0.7. -func (o HPARuleConfigArgsOutput) TargetUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v HPARuleConfigArgs) *float64 { return v.TargetUtilization }).(pulumi.Float64PtrOutput) -} - type HPARuleConfigArgsPtrOutput struct{ *pulumi.OutputState } func (HPARuleConfigArgsPtrOutput) ElementType() reflect.Type { @@ -3156,7 +3150,7 @@ func (o HPARuleConfigArgsPtrOutput) MaxReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } -// Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. +// HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. func (o HPARuleConfigArgsPtrOutput) Metrics() HPAMetricTriggerArgsArrayOutput { return o.ApplyT(func(v *HPARuleConfigArgs) []HPAMetricTriggerArgs { if v == nil { @@ -3176,16 +3170,6 @@ func (o HPARuleConfigArgsPtrOutput) MinReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } -// Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. -func (o HPARuleConfigArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *string { - if v == nil { - return nil - } - return v.PrimaryMetric - }).(pulumi.StringPtrOutput) -} - // Seconds to wait between scale-down events. Example: 300. func (o HPARuleConfigArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v *HPARuleConfigArgs) *int { @@ -3196,26 +3180,6 @@ func (o HPARuleConfigArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutp }).(pulumi.IntPtrOutput) } -// Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. -func (o HPARuleConfigArgsPtrOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *float64 { - if v == nil { - return nil - } - return v.TargetMemoryUtilization - }).(pulumi.Float64PtrOutput) -} - -// Target CPU utilization ratio (0-1). Example: 0.7. -func (o HPARuleConfigArgsPtrOutput) TargetUtilization() pulumi.Float64PtrOutput { - return o.ApplyT(func(v *HPARuleConfigArgs) *float64 { - if v == nil { - return nil - } - return v.TargetUtilization - }).(pulumi.Float64PtrOutput) -} - type HPAScalingPolicyArgs struct { // Period over which the policy applies in seconds. Example: 60. PeriodSeconds int `pulumi:"periodSeconds"` @@ -3507,6 +3471,7 @@ func (o HPAScalingRulesArgsPtrOutput) StabilizationWindowSeconds() pulumi.IntPtr } type HorizontalScalingArgs struct { + CompositeFormula *string `pulumi:"compositeFormula"` // Enable horizontal (replica) scaling. Example: true. Enabled *bool `pulumi:"enabled"` // Maximum percentage change in replica count per recommendation cycle. Example: 50.0 allows up to 50% change. @@ -3516,9 +3481,12 @@ type HorizontalScalingArgs struct { // Minimum data points required before a recommendation is emitted. Example: 20. MinDataPoints *int `pulumi:"minDataPoints"` // Minimum number of replicas to maintain. Example: 2. - MinReplicas *int `pulumi:"minReplicas"` + MinReplicas *int `pulumi:"minReplicas"` + NetworkTargetThroughputBytesPerSec *int `pulumi:"networkTargetThroughputBytesPerSec"` // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric *string `pulumi:"primaryMetric"` + PrimaryMetric *string `pulumi:"primaryMetric"` + ScaleDownCooldownSeconds *int `pulumi:"scaleDownCooldownSeconds"` + TargetMemoryUtilization *float64 `pulumi:"targetMemoryUtilization"` // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. TargetUtilization *float64 `pulumi:"targetUtilization"` } @@ -3535,6 +3503,7 @@ type HorizontalScalingArgsInput interface { } type HorizontalScalingArgsArgs struct { + CompositeFormula pulumi.StringPtrInput `pulumi:"compositeFormula"` // Enable horizontal (replica) scaling. Example: true. Enabled pulumi.BoolPtrInput `pulumi:"enabled"` // Maximum percentage change in replica count per recommendation cycle. Example: 50.0 allows up to 50% change. @@ -3544,9 +3513,12 @@ type HorizontalScalingArgsArgs struct { // Minimum data points required before a recommendation is emitted. Example: 20. MinDataPoints pulumi.IntPtrInput `pulumi:"minDataPoints"` // Minimum number of replicas to maintain. Example: 2. - MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` + MinReplicas pulumi.IntPtrInput `pulumi:"minReplicas"` + NetworkTargetThroughputBytesPerSec pulumi.IntPtrInput `pulumi:"networkTargetThroughputBytesPerSec"` // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` + PrimaryMetric pulumi.StringPtrInput `pulumi:"primaryMetric"` + ScaleDownCooldownSeconds pulumi.IntPtrInput `pulumi:"scaleDownCooldownSeconds"` + TargetMemoryUtilization pulumi.Float64PtrInput `pulumi:"targetMemoryUtilization"` // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. TargetUtilization pulumi.Float64PtrInput `pulumi:"targetUtilization"` } @@ -3628,6 +3600,10 @@ func (o HorizontalScalingArgsOutput) ToHorizontalScalingArgsPtrOutputWithContext }).(HorizontalScalingArgsPtrOutput) } +func (o HorizontalScalingArgsOutput) CompositeFormula() pulumi.StringPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *string { return v.CompositeFormula }).(pulumi.StringPtrOutput) +} + // Enable horizontal (replica) scaling. Example: true. func (o HorizontalScalingArgsOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *bool { return v.Enabled }).(pulumi.BoolPtrOutput) @@ -3653,11 +3629,23 @@ func (o HorizontalScalingArgsOutput) MinReplicas() pulumi.IntPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.MinReplicas }).(pulumi.IntPtrOutput) } +func (o HorizontalScalingArgsOutput) NetworkTargetThroughputBytesPerSec() pulumi.IntPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.NetworkTargetThroughputBytesPerSec }).(pulumi.IntPtrOutput) +} + // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. func (o HorizontalScalingArgsOutput) PrimaryMetric() pulumi.StringPtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *string { return v.PrimaryMetric }).(pulumi.StringPtrOutput) } +func (o HorizontalScalingArgsOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *int { return v.ScaleDownCooldownSeconds }).(pulumi.IntPtrOutput) +} + +func (o HorizontalScalingArgsOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { + return o.ApplyT(func(v HorizontalScalingArgs) *float64 { return v.TargetMemoryUtilization }).(pulumi.Float64PtrOutput) +} + // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. func (o HorizontalScalingArgsOutput) TargetUtilization() pulumi.Float64PtrOutput { return o.ApplyT(func(v HorizontalScalingArgs) *float64 { return v.TargetUtilization }).(pulumi.Float64PtrOutput) @@ -3687,6 +3675,15 @@ func (o HorizontalScalingArgsPtrOutput) Elem() HorizontalScalingArgsOutput { }).(HorizontalScalingArgsOutput) } +func (o HorizontalScalingArgsPtrOutput) CompositeFormula() pulumi.StringPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *string { + if v == nil { + return nil + } + return v.CompositeFormula + }).(pulumi.StringPtrOutput) +} + // Enable horizontal (replica) scaling. Example: true. func (o HorizontalScalingArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *bool { @@ -3737,6 +3734,15 @@ func (o HorizontalScalingArgsPtrOutput) MinReplicas() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } +func (o HorizontalScalingArgsPtrOutput) NetworkTargetThroughputBytesPerSec() pulumi.IntPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *int { + if v == nil { + return nil + } + return v.NetworkTargetThroughputBytesPerSec + }).(pulumi.IntPtrOutput) +} + // Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. func (o HorizontalScalingArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *string { @@ -3747,6 +3753,24 @@ func (o HorizontalScalingArgsPtrOutput) PrimaryMetric() pulumi.StringPtrOutput { }).(pulumi.StringPtrOutput) } +func (o HorizontalScalingArgsPtrOutput) ScaleDownCooldownSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *int { + if v == nil { + return nil + } + return v.ScaleDownCooldownSeconds + }).(pulumi.IntPtrOutput) +} + +func (o HorizontalScalingArgsPtrOutput) TargetMemoryUtilization() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *HorizontalScalingArgs) *float64 { + if v == nil { + return nil + } + return v.TargetMemoryUtilization + }).(pulumi.Float64PtrOutput) +} + // Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. func (o HorizontalScalingArgsPtrOutput) TargetUtilization() pulumi.Float64PtrOutput { return o.ApplyT(func(v *HorizontalScalingArgs) *float64 { @@ -4987,10 +5011,17 @@ func (o ResourceLimitsArgsPtrOutput) Memory() pulumi.StringPtrOutput { } type ResourceRuleConfigArgs struct { + CeilingPercent *int `pulumi:"ceilingPercent"` // Enable this resource axis rule. Example: true. - Enabled *bool `pulumi:"enabled"` + Enabled *bool `pulumi:"enabled"` + FloorPercent *int `pulumi:"floorPercent"` + InitialLimit *int `pulumi:"initialLimit"` + InitialRequest *int `pulumi:"initialRequest"` + LimitCeilingPercent *int `pulumi:"limitCeilingPercent"` + LimitFloorPercent *int `pulumi:"limitFloorPercent"` // Multiplier applied to the request to derive the resource limit. Example: 1.5. LimitMultiplier *float64 `pulumi:"limitMultiplier"` + LimitUseRss *bool `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled *bool `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads. Example: false. @@ -5002,7 +5033,8 @@ type ResourceRuleConfigArgs struct { // Maximum percentage increase allowed in a single cycle. Example: 50.0. MaxScaleUpPercent *float64 `pulumi:"maxScaleUpPercent"` // Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. - MinRequest *int `pulumi:"minRequest"` + MinRequest *int `pulumi:"minRequest"` + RequestUseRss *bool `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. TargetPercentile *float64 `pulumi:"targetPercentile"` } @@ -5019,10 +5051,17 @@ type ResourceRuleConfigArgsInput interface { } type ResourceRuleConfigArgsArgs struct { + CeilingPercent pulumi.IntPtrInput `pulumi:"ceilingPercent"` // Enable this resource axis rule. Example: true. - Enabled pulumi.BoolPtrInput `pulumi:"enabled"` + Enabled pulumi.BoolPtrInput `pulumi:"enabled"` + FloorPercent pulumi.IntPtrInput `pulumi:"floorPercent"` + InitialLimit pulumi.IntPtrInput `pulumi:"initialLimit"` + InitialRequest pulumi.IntPtrInput `pulumi:"initialRequest"` + LimitCeilingPercent pulumi.IntPtrInput `pulumi:"limitCeilingPercent"` + LimitFloorPercent pulumi.IntPtrInput `pulumi:"limitFloorPercent"` // Multiplier applied to the request to derive the resource limit. Example: 1.5. LimitMultiplier pulumi.Float64PtrInput `pulumi:"limitMultiplier"` + LimitUseRss pulumi.BoolPtrInput `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled pulumi.BoolPtrInput `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads. Example: false. @@ -5034,7 +5073,8 @@ type ResourceRuleConfigArgsArgs struct { // Maximum percentage increase allowed in a single cycle. Example: 50.0. MaxScaleUpPercent pulumi.Float64PtrInput `pulumi:"maxScaleUpPercent"` // Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. - MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` + MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` + RequestUseRss pulumi.BoolPtrInput `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. TargetPercentile pulumi.Float64PtrInput `pulumi:"targetPercentile"` } @@ -5116,16 +5156,44 @@ func (o ResourceRuleConfigArgsOutput) ToResourceRuleConfigArgsPtrOutputWithConte }).(ResourceRuleConfigArgsPtrOutput) } +func (o ResourceRuleConfigArgsOutput) CeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.CeilingPercent }).(pulumi.IntPtrOutput) +} + // Enable this resource axis rule. Example: true. func (o ResourceRuleConfigArgsOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.Enabled }).(pulumi.BoolPtrOutput) } +func (o ResourceRuleConfigArgsOutput) FloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.FloorPercent }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) InitialLimit() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.InitialLimit }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) InitialRequest() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.InitialRequest }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) LimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.LimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsOutput) LimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.LimitFloorPercent }).(pulumi.IntPtrOutput) +} + // Multiplier applied to the request to derive the resource limit. Example: 1.5. func (o ResourceRuleConfigArgsOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *float64 { return v.LimitMultiplier }).(pulumi.Float64PtrOutput) } +func (o ResourceRuleConfigArgsOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.LimitUseRss }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o ResourceRuleConfigArgsOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.LimitsAdjustmentEnabled }).(pulumi.BoolPtrOutput) @@ -5156,6 +5224,10 @@ func (o ResourceRuleConfigArgsOutput) MinRequest() pulumi.IntPtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *int { return v.MinRequest }).(pulumi.IntPtrOutput) } +func (o ResourceRuleConfigArgsOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ResourceRuleConfigArgs) *bool { return v.RequestUseRss }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. func (o ResourceRuleConfigArgsOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v ResourceRuleConfigArgs) *float64 { return v.TargetPercentile }).(pulumi.Float64PtrOutput) @@ -5185,6 +5257,15 @@ func (o ResourceRuleConfigArgsPtrOutput) Elem() ResourceRuleConfigArgsOutput { }).(ResourceRuleConfigArgsOutput) } +func (o ResourceRuleConfigArgsPtrOutput) CeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.CeilingPercent + }).(pulumi.IntPtrOutput) +} + // Enable this resource axis rule. Example: true. func (o ResourceRuleConfigArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { @@ -5195,6 +5276,51 @@ func (o ResourceRuleConfigArgsPtrOutput) Enabled() pulumi.BoolPtrOutput { }).(pulumi.BoolPtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) FloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.FloorPercent + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) InitialLimit() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.InitialLimit + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) InitialRequest() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.InitialRequest + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) LimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.LimitCeilingPercent + }).(pulumi.IntPtrOutput) +} + +func (o ResourceRuleConfigArgsPtrOutput) LimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *int { + if v == nil { + return nil + } + return v.LimitFloorPercent + }).(pulumi.IntPtrOutput) +} + // Multiplier applied to the request to derive the resource limit. Example: 1.5. func (o ResourceRuleConfigArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *float64 { @@ -5205,6 +5331,15 @@ func (o ResourceRuleConfigArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutp }).(pulumi.Float64PtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { + if v == nil { + return nil + } + return v.LimitUseRss + }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o ResourceRuleConfigArgsPtrOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { @@ -5265,6 +5400,15 @@ func (o ResourceRuleConfigArgsPtrOutput) MinRequest() pulumi.IntPtrOutput { }).(pulumi.IntPtrOutput) } +func (o ResourceRuleConfigArgsPtrOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ResourceRuleConfigArgs) *bool { + if v == nil { + return nil + } + return v.RequestUseRss + }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95. func (o ResourceRuleConfigArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v *ResourceRuleConfigArgs) *float64 { @@ -5618,6 +5762,7 @@ type VerticalScalingArgs struct { Enabled *bool `pulumi:"enabled"` // Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. LimitMultiplier *float64 `pulumi:"limitMultiplier"` + LimitUseRss *bool `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled *bool `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads (CPU axis only — memory limits removal is not supported). Takes precedence over limitsAdjustmentEnabled when set. Default: false. @@ -5634,6 +5779,7 @@ type VerticalScalingArgs struct { MinRequest *int `pulumi:"minRequest"` // Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. OverheadMultiplier *float64 `pulumi:"overheadMultiplier"` + RequestUseRss *bool `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. TargetPercentile *float64 `pulumi:"targetPercentile"` } @@ -5677,6 +5823,7 @@ type VerticalScalingArgsArgs struct { Enabled pulumi.BoolPtrInput `pulumi:"enabled"` // Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. LimitMultiplier pulumi.Float64PtrInput `pulumi:"limitMultiplier"` + LimitUseRss pulumi.BoolPtrInput `pulumi:"limitUseRss"` // Whether to also adjust resource limits alongside requests. Example: true. LimitsAdjustmentEnabled pulumi.BoolPtrInput `pulumi:"limitsAdjustmentEnabled"` // Actively remove limits from workloads (CPU axis only — memory limits removal is not supported). Takes precedence over limitsAdjustmentEnabled when set. Default: false. @@ -5693,6 +5840,7 @@ type VerticalScalingArgsArgs struct { MinRequest pulumi.IntPtrInput `pulumi:"minRequest"` // Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. OverheadMultiplier pulumi.Float64PtrInput `pulumi:"overheadMultiplier"` + RequestUseRss pulumi.BoolPtrInput `pulumi:"requestUseRss"` // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. TargetPercentile pulumi.Float64PtrInput `pulumi:"targetPercentile"` } @@ -5806,6 +5954,10 @@ func (o VerticalScalingArgsOutput) LimitMultiplier() pulumi.Float64PtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.LimitMultiplier }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.LimitUseRss }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o VerticalScalingArgsOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.LimitsAdjustmentEnabled }).(pulumi.BoolPtrOutput) @@ -5846,6 +5998,10 @@ func (o VerticalScalingArgsOutput) OverheadMultiplier() pulumi.Float64PtrOutput return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.OverheadMultiplier }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v VerticalScalingArgs) *bool { return v.RequestUseRss }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. func (o VerticalScalingArgsOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v VerticalScalingArgs) *float64 { return v.TargetPercentile }).(pulumi.Float64PtrOutput) @@ -5905,6 +6061,15 @@ func (o VerticalScalingArgsPtrOutput) LimitMultiplier() pulumi.Float64PtrOutput }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsPtrOutput) LimitUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *VerticalScalingArgs) *bool { + if v == nil { + return nil + } + return v.LimitUseRss + }).(pulumi.BoolPtrOutput) +} + // Whether to also adjust resource limits alongside requests. Example: true. func (o VerticalScalingArgsPtrOutput) LimitsAdjustmentEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *VerticalScalingArgs) *bool { @@ -5985,6 +6150,15 @@ func (o VerticalScalingArgsPtrOutput) OverheadMultiplier() pulumi.Float64PtrOutp }).(pulumi.Float64PtrOutput) } +func (o VerticalScalingArgsPtrOutput) RequestUseRss() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *VerticalScalingArgs) *bool { + if v == nil { + return nil + } + return v.RequestUseRss + }).(pulumi.BoolPtrOutput) +} + // Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. func (o VerticalScalingArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput { return o.ApplyT(func(v *VerticalScalingArgs) *float64 { @@ -5995,6 +6169,169 @@ func (o VerticalScalingArgsPtrOutput) TargetPercentile() pulumi.Float64PtrOutput }).(pulumi.Float64PtrOutput) } +type ZonalShiftConfigArgs struct { + AllowZoneFallback *bool `pulumi:"allowZoneFallback"` + EvictImpactedNodes *bool `pulumi:"evictImpactedNodes"` + RespectZonalShift *bool `pulumi:"respectZonalShift"` +} + +// ZonalShiftConfigArgsInput is an input type that accepts ZonalShiftConfigArgsArgs and ZonalShiftConfigArgsOutput values. +// You can construct a concrete instance of `ZonalShiftConfigArgsInput` via: +// +// ZonalShiftConfigArgsArgs{...} +type ZonalShiftConfigArgsInput interface { + pulumi.Input + + ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput + ToZonalShiftConfigArgsOutputWithContext(context.Context) ZonalShiftConfigArgsOutput +} + +type ZonalShiftConfigArgsArgs struct { + AllowZoneFallback pulumi.BoolPtrInput `pulumi:"allowZoneFallback"` + EvictImpactedNodes pulumi.BoolPtrInput `pulumi:"evictImpactedNodes"` + RespectZonalShift pulumi.BoolPtrInput `pulumi:"respectZonalShift"` +} + +func (ZonalShiftConfigArgsArgs) ElementType() reflect.Type { + return reflect.TypeOf((*ZonalShiftConfigArgs)(nil)).Elem() +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput { + return i.ToZonalShiftConfigArgsOutputWithContext(context.Background()) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsOutputWithContext(ctx context.Context) ZonalShiftConfigArgsOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsOutput) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return i.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (i ZonalShiftConfigArgsArgs) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsOutput).ToZonalShiftConfigArgsPtrOutputWithContext(ctx) +} + +// ZonalShiftConfigArgsPtrInput is an input type that accepts ZonalShiftConfigArgsArgs, ZonalShiftConfigArgsPtr and ZonalShiftConfigArgsPtrOutput values. +// You can construct a concrete instance of `ZonalShiftConfigArgsPtrInput` via: +// +// ZonalShiftConfigArgsArgs{...} +// +// or: +// +// nil +type ZonalShiftConfigArgsPtrInput interface { + pulumi.Input + + ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput + ToZonalShiftConfigArgsPtrOutputWithContext(context.Context) ZonalShiftConfigArgsPtrOutput +} + +type zonalShiftConfigArgsPtrType ZonalShiftConfigArgsArgs + +func ZonalShiftConfigArgsPtr(v *ZonalShiftConfigArgsArgs) ZonalShiftConfigArgsPtrInput { + return (*zonalShiftConfigArgsPtrType)(v) +} + +func (*zonalShiftConfigArgsPtrType) ElementType() reflect.Type { + return reflect.TypeOf((**ZonalShiftConfigArgs)(nil)).Elem() +} + +func (i *zonalShiftConfigArgsPtrType) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return i.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (i *zonalShiftConfigArgsPtrType) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return pulumi.ToOutputWithContext(ctx, i).(ZonalShiftConfigArgsPtrOutput) +} + +type ZonalShiftConfigArgsOutput struct{ *pulumi.OutputState } + +func (ZonalShiftConfigArgsOutput) ElementType() reflect.Type { + return reflect.TypeOf((*ZonalShiftConfigArgs)(nil)).Elem() +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsOutput() ZonalShiftConfigArgsOutput { + return o +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsOutputWithContext(ctx context.Context) ZonalShiftConfigArgsOutput { + return o +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return o.ToZonalShiftConfigArgsPtrOutputWithContext(context.Background()) +} + +func (o ZonalShiftConfigArgsOutput) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return o.ApplyTWithContext(ctx, func(_ context.Context, v ZonalShiftConfigArgs) *ZonalShiftConfigArgs { + return &v + }).(ZonalShiftConfigArgsPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) AllowZoneFallback() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.AllowZoneFallback }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) EvictImpactedNodes() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.EvictImpactedNodes }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsOutput) RespectZonalShift() pulumi.BoolPtrOutput { + return o.ApplyT(func(v ZonalShiftConfigArgs) *bool { return v.RespectZonalShift }).(pulumi.BoolPtrOutput) +} + +type ZonalShiftConfigArgsPtrOutput struct{ *pulumi.OutputState } + +func (ZonalShiftConfigArgsPtrOutput) ElementType() reflect.Type { + return reflect.TypeOf((**ZonalShiftConfigArgs)(nil)).Elem() +} + +func (o ZonalShiftConfigArgsPtrOutput) ToZonalShiftConfigArgsPtrOutput() ZonalShiftConfigArgsPtrOutput { + return o +} + +func (o ZonalShiftConfigArgsPtrOutput) ToZonalShiftConfigArgsPtrOutputWithContext(ctx context.Context) ZonalShiftConfigArgsPtrOutput { + return o +} + +func (o ZonalShiftConfigArgsPtrOutput) Elem() ZonalShiftConfigArgsOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) ZonalShiftConfigArgs { + if v != nil { + return *v + } + var ret ZonalShiftConfigArgs + return ret + }).(ZonalShiftConfigArgsOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) AllowZoneFallback() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.AllowZoneFallback + }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) EvictImpactedNodes() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.EvictImpactedNodes + }).(pulumi.BoolPtrOutput) +} + +func (o ZonalShiftConfigArgsPtrOutput) RespectZonalShift() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *ZonalShiftConfigArgs) *bool { + if v == nil { + return nil + } + return v.RespectZonalShift + }).(pulumi.BoolPtrOutput) +} + func init() { pulumi.RegisterInputType(reflect.TypeOf((*AMISelectorTermArgsInput)(nil)).Elem(), AMISelectorTermArgsArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*AMISelectorTermArgsArrayInput)(nil)).Elem(), AMISelectorTermArgsArray{}) @@ -6056,6 +6393,8 @@ func init() { pulumi.RegisterInputType(reflect.TypeOf((*TaintArgsArrayInput)(nil)).Elem(), TaintArgsArray{}) pulumi.RegisterInputType(reflect.TypeOf((*VerticalScalingArgsInput)(nil)).Elem(), VerticalScalingArgsArgs{}) pulumi.RegisterInputType(reflect.TypeOf((*VerticalScalingArgsPtrInput)(nil)).Elem(), VerticalScalingArgsArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ZonalShiftConfigArgsInput)(nil)).Elem(), ZonalShiftConfigArgsArgs{}) + pulumi.RegisterInputType(reflect.TypeOf((*ZonalShiftConfigArgsPtrInput)(nil)).Elem(), ZonalShiftConfigArgsArgs{}) pulumi.RegisterOutputType(AMISelectorTermArgsOutput{}) pulumi.RegisterOutputType(AMISelectorTermArgsArrayOutput{}) pulumi.RegisterOutputType(AWSNodeClassSpecArgsOutput{}) @@ -6116,4 +6455,6 @@ func init() { pulumi.RegisterOutputType(TaintArgsArrayOutput{}) pulumi.RegisterOutputType(VerticalScalingArgsOutput{}) pulumi.RegisterOutputType(VerticalScalingArgsPtrOutput{}) + pulumi.RegisterOutputType(ZonalShiftConfigArgsOutput{}) + pulumi.RegisterOutputType(ZonalShiftConfigArgsPtrOutput{}) } diff --git a/sdk/go/devzero/resources/workloadPolicy.go b/sdk/go/devzero/resources/workloadPolicy.go index ef1662c..c429865 100644 --- a/sdk/go/devzero/resources/workloadPolicy.go +++ b/sdk/go/devzero/resources/workloadPolicy.go @@ -16,10 +16,15 @@ type WorkloadPolicy struct { pulumi.CustomResourceState // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers pulumi.StringArrayOutput `pulumi:"actionTriggers"` + ActionTriggers pulumi.StringArrayOutput `pulumi:"actionTriggers"` + AllowInPlaceMemoryLimitDecrease pulumi.BoolPtrOutput `pulumi:"allowInPlaceMemoryLimitDecrease"` // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes pulumi.IntPtrOutput `pulumi:"cooldownMinutes"` - CpuVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"cpuVerticalScaling"` + CooldownMinutes pulumi.IntPtrOutput `pulumi:"cooldownMinutes"` + CpuCeilingPercent pulumi.IntPtrOutput `pulumi:"cpuCeilingPercent"` + CpuFloorPercent pulumi.IntPtrOutput `pulumi:"cpuFloorPercent"` + CpuLimitCeilingPercent pulumi.IntPtrOutput `pulumi:"cpuLimitCeilingPercent"` + CpuLimitFloorPercent pulumi.IntPtrOutput `pulumi:"cpuLimitFloorPercent"` + CpuVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"cpuVerticalScaling"` // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule pulumi.StringPtrOutput `pulumi:"cronSchedule"` // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -29,7 +34,8 @@ type WorkloadPolicy struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers pulumi.StringArrayOutput `pulumi:"detectionTriggers"` // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent pulumi.Float64PtrOutput `pulumi:"driftDeltaPercent"` + DriftDeltaPercent pulumi.Float64PtrOutput `pulumi:"driftDeltaPercent"` + EnableInPlaceVerticalScaling pulumi.BoolPtrOutput `pulumi:"enableInPlaceVerticalScaling"` // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection pulumi.BoolPtrOutput `pulumi:"enablePmaxProtection"` // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -38,12 +44,25 @@ type WorkloadPolicy struct { GpuVramVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"gpuVramVerticalScaling"` HorizontalScaling HorizontalScalingArgsPtrOutput `pulumi:"horizontalScaling"` // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget pulumi.Float64PtrOutput `pulumi:"hysteresisVsTarget"` + HysteresisVsTarget pulumi.Float64PtrOutput `pulumi:"hysteresisVsTarget"` + JvmCpuStartupFloorMillicores pulumi.IntPtrOutput `pulumi:"jvmCpuStartupFloorMillicores"` + JvmHeapHeadroomMultiplier pulumi.Float64PtrOutput `pulumi:"jvmHeapHeadroomMultiplier"` + JvmHeapOptimizationEnabled pulumi.BoolPtrOutput `pulumi:"jvmHeapOptimizationEnabled"` + JvmHeapTargetPercentile pulumi.Float64PtrOutput `pulumi:"jvmHeapTargetPercentile"` + JvmMaxHeapBytes pulumi.IntPtrOutput `pulumi:"jvmMaxHeapBytes"` + JvmMinHeapBytes pulumi.IntPtrOutput `pulumi:"jvmMinHeapBytes"` + JvmNonHeapOverheadBytes pulumi.IntPtrOutput `pulumi:"jvmNonHeapOverheadBytes"` + JvmNonHeapOverheadPercent pulumi.Float64PtrOutput `pulumi:"jvmNonHeapOverheadPercent"` + JvmPreferContainerSupport pulumi.BoolPtrOutput `pulumi:"jvmPreferContainerSupport"` // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"loopbackPeriodSeconds"` - MemoryVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"memoryVerticalScaling"` + LoopbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"loopbackPeriodSeconds"` + MemoryCeilingPercent pulumi.IntPtrOutput `pulumi:"memoryCeilingPercent"` + MemoryFloorPercent pulumi.IntPtrOutput `pulumi:"memoryFloorPercent"` + MemoryLimitCeilingPercent pulumi.IntPtrOutput `pulumi:"memoryLimitCeilingPercent"` + MemoryLimitFloorPercent pulumi.IntPtrOutput `pulumi:"memoryLimitFloorPercent"` + MemoryVerticalScaling VerticalScalingArgsPtrOutput `pulumi:"memoryVerticalScaling"` // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent pulumi.Float64PtrOutput `pulumi:"minChangePercent"` // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -51,7 +70,8 @@ type WorkloadPolicy struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints pulumi.IntPtrOutput `pulumi:"minVpaWindowDataPoints"` // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name pulumi.StringOutput `pulumi:"name"` + Name pulumi.StringOutput `pulumi:"name"` + PdbEnabled pulumi.BoolPtrOutput `pulumi:"pdbEnabled"` // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold pulumi.Float64PtrOutput `pulumi:"pmaxRatioThreshold"` // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -136,10 +156,15 @@ func (WorkloadPolicyState) ElementType() reflect.Type { type workloadPolicyArgs struct { // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers []string `pulumi:"actionTriggers"` + ActionTriggers []string `pulumi:"actionTriggers"` + AllowInPlaceMemoryLimitDecrease *bool `pulumi:"allowInPlaceMemoryLimitDecrease"` // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes *int `pulumi:"cooldownMinutes"` - CpuVerticalScaling *VerticalScalingArgs `pulumi:"cpuVerticalScaling"` + CooldownMinutes *int `pulumi:"cooldownMinutes"` + CpuCeilingPercent *int `pulumi:"cpuCeilingPercent"` + CpuFloorPercent *int `pulumi:"cpuFloorPercent"` + CpuLimitCeilingPercent *int `pulumi:"cpuLimitCeilingPercent"` + CpuLimitFloorPercent *int `pulumi:"cpuLimitFloorPercent"` + CpuVerticalScaling *VerticalScalingArgs `pulumi:"cpuVerticalScaling"` // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule *string `pulumi:"cronSchedule"` // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -149,7 +174,8 @@ type workloadPolicyArgs struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers []string `pulumi:"detectionTriggers"` // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent *float64 `pulumi:"driftDeltaPercent"` + DriftDeltaPercent *float64 `pulumi:"driftDeltaPercent"` + EnableInPlaceVerticalScaling *bool `pulumi:"enableInPlaceVerticalScaling"` // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection *bool `pulumi:"enablePmaxProtection"` // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -158,12 +184,25 @@ type workloadPolicyArgs struct { GpuVramVerticalScaling *VerticalScalingArgs `pulumi:"gpuVramVerticalScaling"` HorizontalScaling *HorizontalScalingArgs `pulumi:"horizontalScaling"` // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget *float64 `pulumi:"hysteresisVsTarget"` + HysteresisVsTarget *float64 `pulumi:"hysteresisVsTarget"` + JvmCpuStartupFloorMillicores *int `pulumi:"jvmCpuStartupFloorMillicores"` + JvmHeapHeadroomMultiplier *float64 `pulumi:"jvmHeapHeadroomMultiplier"` + JvmHeapOptimizationEnabled *bool `pulumi:"jvmHeapOptimizationEnabled"` + JvmHeapTargetPercentile *float64 `pulumi:"jvmHeapTargetPercentile"` + JvmMaxHeapBytes *int `pulumi:"jvmMaxHeapBytes"` + JvmMinHeapBytes *int `pulumi:"jvmMinHeapBytes"` + JvmNonHeapOverheadBytes *int `pulumi:"jvmNonHeapOverheadBytes"` + JvmNonHeapOverheadPercent *float64 `pulumi:"jvmNonHeapOverheadPercent"` + JvmPreferContainerSupport *bool `pulumi:"jvmPreferContainerSupport"` // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds *int `pulumi:"loopbackPeriodSeconds"` - MemoryVerticalScaling *VerticalScalingArgs `pulumi:"memoryVerticalScaling"` + LoopbackPeriodSeconds *int `pulumi:"loopbackPeriodSeconds"` + MemoryCeilingPercent *int `pulumi:"memoryCeilingPercent"` + MemoryFloorPercent *int `pulumi:"memoryFloorPercent"` + MemoryLimitCeilingPercent *int `pulumi:"memoryLimitCeilingPercent"` + MemoryLimitFloorPercent *int `pulumi:"memoryLimitFloorPercent"` + MemoryVerticalScaling *VerticalScalingArgs `pulumi:"memoryVerticalScaling"` // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent *float64 `pulumi:"minChangePercent"` // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -171,7 +210,8 @@ type workloadPolicyArgs struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints *int `pulumi:"minVpaWindowDataPoints"` // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name string `pulumi:"name"` + Name string `pulumi:"name"` + PdbEnabled *bool `pulumi:"pdbEnabled"` // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold *float64 `pulumi:"pmaxRatioThreshold"` // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -185,10 +225,15 @@ type workloadPolicyArgs struct { // The set of arguments for constructing a WorkloadPolicy resource. type WorkloadPolicyArgs struct { // When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. - ActionTriggers pulumi.StringArrayInput + ActionTriggers pulumi.StringArrayInput + AllowInPlaceMemoryLimitDecrease pulumi.BoolPtrInput // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). - CooldownMinutes pulumi.IntPtrInput - CpuVerticalScaling VerticalScalingArgsPtrInput + CooldownMinutes pulumi.IntPtrInput + CpuCeilingPercent pulumi.IntPtrInput + CpuFloorPercent pulumi.IntPtrInput + CpuLimitCeilingPercent pulumi.IntPtrInput + CpuLimitFloorPercent pulumi.IntPtrInput + CpuVerticalScaling VerticalScalingArgsPtrInput // Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). CronSchedule pulumi.StringPtrInput // Cron expression for background node defragmentation. Example: '0 3 * * 0' (weekly Sunday at 3 am). @@ -198,7 +243,8 @@ type WorkloadPolicyArgs struct { // Events that trigger a new recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation", "pod_reschedule"]. DetectionTriggers pulumi.StringArrayInput // Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. - DriftDeltaPercent pulumi.Float64PtrInput + DriftDeltaPercent pulumi.Float64PtrInput + EnableInPlaceVerticalScaling pulumi.BoolPtrInput // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. EnablePmaxProtection pulumi.BoolPtrInput // Vertical scaling configuration for GPU cores. Uses the same fields as cpuVerticalScaling; units are GPU cores (millicores). @@ -207,12 +253,25 @@ type WorkloadPolicyArgs struct { GpuVramVerticalScaling VerticalScalingArgsPtrInput HorizontalScaling HorizontalScalingArgsPtrInput // Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). - HysteresisVsTarget pulumi.Float64PtrInput + HysteresisVsTarget pulumi.Float64PtrInput + JvmCpuStartupFloorMillicores pulumi.IntPtrInput + JvmHeapHeadroomMultiplier pulumi.Float64PtrInput + JvmHeapOptimizationEnabled pulumi.BoolPtrInput + JvmHeapTargetPercentile pulumi.Float64PtrInput + JvmMaxHeapBytes pulumi.IntPtrInput + JvmMinHeapBytes pulumi.IntPtrInput + JvmNonHeapOverheadBytes pulumi.IntPtrInput + JvmNonHeapOverheadPercent pulumi.Float64PtrInput + JvmPreferContainerSupport pulumi.BoolPtrInput // Allow live pod migration when applying recommendations without restart. Example: false. LiveMigrationEnabled pulumi.BoolPtrInput // Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). - LoopbackPeriodSeconds pulumi.IntPtrInput - MemoryVerticalScaling VerticalScalingArgsPtrInput + LoopbackPeriodSeconds pulumi.IntPtrInput + MemoryCeilingPercent pulumi.IntPtrInput + MemoryFloorPercent pulumi.IntPtrInput + MemoryLimitCeilingPercent pulumi.IntPtrInput + MemoryLimitFloorPercent pulumi.IntPtrInput + MemoryVerticalScaling VerticalScalingArgsPtrInput // Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). MinChangePercent pulumi.Float64PtrInput // Global minimum number of usage data points needed before any recommendation is emitted. Example: 15 (default). @@ -220,7 +279,8 @@ type WorkloadPolicyArgs struct { // Minimum data points inside the VPA analysis window before a recommendation is generated. Example: 30 (default). MinVpaWindowDataPoints pulumi.IntPtrInput // Human-friendly name for the policy. Example: 'production-vpa-policy'. - Name pulumi.StringInput + Name pulumi.StringInput + PdbEnabled pulumi.BoolPtrInput // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. PmaxRatioThreshold pulumi.Float64PtrInput // Kubernetes scheduler plugins to activate for this policy. Example: ["binpacking"]. @@ -323,11 +383,31 @@ func (o WorkloadPolicyOutput) ActionTriggers() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.StringArrayOutput { return v.ActionTriggers }).(pulumi.StringArrayOutput) } +func (o WorkloadPolicyOutput) AllowInPlaceMemoryLimitDecrease() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.AllowInPlaceMemoryLimitDecrease }).(pulumi.BoolPtrOutput) +} + // Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). func (o WorkloadPolicyOutput) CooldownMinutes() pulumi.IntPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CooldownMinutes }).(pulumi.IntPtrOutput) } +func (o WorkloadPolicyOutput) CpuCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuFloorPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuLimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuLimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) CpuLimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.CpuLimitFloorPercent }).(pulumi.IntPtrOutput) +} + func (o WorkloadPolicyOutput) CpuVerticalScaling() VerticalScalingArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) VerticalScalingArgsPtrOutput { return v.CpuVerticalScaling }).(VerticalScalingArgsPtrOutput) } @@ -357,6 +437,10 @@ func (o WorkloadPolicyOutput) DriftDeltaPercent() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.DriftDeltaPercent }).(pulumi.Float64PtrOutput) } +func (o WorkloadPolicyOutput) EnableInPlaceVerticalScaling() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.EnableInPlaceVerticalScaling }).(pulumi.BoolPtrOutput) +} + // Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. func (o WorkloadPolicyOutput) EnablePmaxProtection() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.EnablePmaxProtection }).(pulumi.BoolPtrOutput) @@ -381,6 +465,42 @@ func (o WorkloadPolicyOutput) HysteresisVsTarget() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.HysteresisVsTarget }).(pulumi.Float64PtrOutput) } +func (o WorkloadPolicyOutput) JvmCpuStartupFloorMillicores() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmCpuStartupFloorMillicores }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapHeadroomMultiplier() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmHeapHeadroomMultiplier }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapOptimizationEnabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.JvmHeapOptimizationEnabled }).(pulumi.BoolPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmHeapTargetPercentile() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmHeapTargetPercentile }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmMaxHeapBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmMaxHeapBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmMinHeapBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmMinHeapBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmNonHeapOverheadBytes() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.JvmNonHeapOverheadBytes }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) JvmNonHeapOverheadPercent() pulumi.Float64PtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.JvmNonHeapOverheadPercent }).(pulumi.Float64PtrOutput) +} + +func (o WorkloadPolicyOutput) JvmPreferContainerSupport() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.JvmPreferContainerSupport }).(pulumi.BoolPtrOutput) +} + // Allow live pod migration when applying recommendations without restart. Example: false. func (o WorkloadPolicyOutput) LiveMigrationEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.LiveMigrationEnabled }).(pulumi.BoolPtrOutput) @@ -391,6 +511,22 @@ func (o WorkloadPolicyOutput) LoopbackPeriodSeconds() pulumi.IntPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.LoopbackPeriodSeconds }).(pulumi.IntPtrOutput) } +func (o WorkloadPolicyOutput) MemoryCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryFloorPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryLimitCeilingPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryLimitCeilingPercent }).(pulumi.IntPtrOutput) +} + +func (o WorkloadPolicyOutput) MemoryLimitFloorPercent() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.IntPtrOutput { return v.MemoryLimitFloorPercent }).(pulumi.IntPtrOutput) +} + func (o WorkloadPolicyOutput) MemoryVerticalScaling() VerticalScalingArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicy) VerticalScalingArgsPtrOutput { return v.MemoryVerticalScaling }).(VerticalScalingArgsPtrOutput) } @@ -415,6 +551,10 @@ func (o WorkloadPolicyOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) } +func (o WorkloadPolicyOutput) PdbEnabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadPolicy) pulumi.BoolPtrOutput { return v.PdbEnabled }).(pulumi.BoolPtrOutput) +} + // Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. func (o WorkloadPolicyOutput) PmaxRatioThreshold() pulumi.Float64PtrOutput { return o.ApplyT(func(v *WorkloadPolicy) pulumi.Float64PtrOutput { return v.PmaxRatioThreshold }).(pulumi.Float64PtrOutput) diff --git a/sdk/go/devzero/resources/workloadPolicyTarget.go b/sdk/go/devzero/resources/workloadPolicyTarget.go index 70f7a91..213f147 100644 --- a/sdk/go/devzero/resources/workloadPolicyTarget.go +++ b/sdk/go/devzero/resources/workloadPolicyTarget.go @@ -15,14 +15,18 @@ import ( type WorkloadPolicyTarget struct { pulumi.CustomResourceState + // Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + AnnotationSelector LabelSelectorArgsPtrOutput `pulumi:"annotationSelector"` // Cluster IDs where this target applies. ClusterIds pulumi.StringArrayOutput `pulumi:"clusterIds"` // Free-form description of the target. Description pulumi.StringPtrOutput `pulumi:"description"` - // Enable or disable this target. + // Enable or disable this target. Defaults to true. Enabled pulumi.BoolPtrOutput `pulumi:"enabled"` // Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod). KindFilter pulumi.StringArrayOutput `pulumi:"kindFilter"` + // Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + KindFilterNotIn pulumi.StringArrayOutput `pulumi:"kindFilterNotIn"` // Human-friendly name for this target. Name pulumi.StringOutput `pulumi:"name"` // Regex to match workload names. @@ -31,7 +35,9 @@ type WorkloadPolicyTarget struct { NamespacePattern NamePatternArgsPtrOutput `pulumi:"namespacePattern"` // Select namespaces by labels. NamespaceSelector LabelSelectorArgsPtrOutput `pulumi:"namespaceSelector"` - // Restrict matching to specific node groups by name. + // DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. + // + // Deprecated: node_group_names is deprecated by the DevZero API and no longer evaluated. NodeGroupNames pulumi.StringArrayOutput `pulumi:"nodeGroupNames"` // Workload policy ID this target is attached to. PolicyId pulumi.StringOutput `pulumi:"policyId"` @@ -39,6 +45,8 @@ type WorkloadPolicyTarget struct { Priority pulumi.IntPtrOutput `pulumi:"priority"` // Explicit list of workload names to include. WorkloadNames pulumi.StringArrayOutput `pulumi:"workloadNames"` + // Explicit list of workload names to exclude. + WorkloadNamesNotIn pulumi.StringArrayOutput `pulumi:"workloadNamesNotIn"` // Select workloads by labels. WorkloadSelector LabelSelectorArgsPtrOutput `pulumi:"workloadSelector"` } @@ -92,36 +100,42 @@ func (WorkloadPolicyTargetState) ElementType() reflect.Type { } type workloadPolicyTargetArgs struct { - ClusterIds []string `pulumi:"clusterIds"` - Description *string `pulumi:"description"` - Enabled *bool `pulumi:"enabled"` - KindFilter []string `pulumi:"kindFilter"` - Name string `pulumi:"name"` - NamePattern *NamePatternArgs `pulumi:"namePattern"` - NamespacePattern *NamePatternArgs `pulumi:"namespacePattern"` - NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector"` - NodeGroupNames []string `pulumi:"nodeGroupNames"` - PolicyId string `pulumi:"policyId"` - Priority *int `pulumi:"priority"` - WorkloadNames []string `pulumi:"workloadNames"` - WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector"` + AnnotationSelector *LabelSelectorArgs `pulumi:"annotationSelector"` + ClusterIds []string `pulumi:"clusterIds"` + Description *string `pulumi:"description"` + Enabled *bool `pulumi:"enabled"` + KindFilter []string `pulumi:"kindFilter"` + KindFilterNotIn []string `pulumi:"kindFilterNotIn"` + Name string `pulumi:"name"` + NamePattern *NamePatternArgs `pulumi:"namePattern"` + NamespacePattern *NamePatternArgs `pulumi:"namespacePattern"` + NamespaceSelector *LabelSelectorArgs `pulumi:"namespaceSelector"` + NodeGroupNames []string `pulumi:"nodeGroupNames"` + PolicyId string `pulumi:"policyId"` + Priority *int `pulumi:"priority"` + WorkloadNames []string `pulumi:"workloadNames"` + WorkloadNamesNotIn []string `pulumi:"workloadNamesNotIn"` + WorkloadSelector *LabelSelectorArgs `pulumi:"workloadSelector"` } // The set of arguments for constructing a WorkloadPolicyTarget resource. type WorkloadPolicyTargetArgs struct { - ClusterIds pulumi.StringArrayInput - Description pulumi.StringPtrInput - Enabled pulumi.BoolPtrInput - KindFilter pulumi.StringArrayInput - Name pulumi.StringInput - NamePattern NamePatternArgsPtrInput - NamespacePattern NamePatternArgsPtrInput - NamespaceSelector LabelSelectorArgsPtrInput - NodeGroupNames pulumi.StringArrayInput - PolicyId pulumi.StringInput - Priority pulumi.IntPtrInput - WorkloadNames pulumi.StringArrayInput - WorkloadSelector LabelSelectorArgsPtrInput + AnnotationSelector LabelSelectorArgsPtrInput + ClusterIds pulumi.StringArrayInput + Description pulumi.StringPtrInput + Enabled pulumi.BoolPtrInput + KindFilter pulumi.StringArrayInput + KindFilterNotIn pulumi.StringArrayInput + Name pulumi.StringInput + NamePattern NamePatternArgsPtrInput + NamespacePattern NamePatternArgsPtrInput + NamespaceSelector LabelSelectorArgsPtrInput + NodeGroupNames pulumi.StringArrayInput + PolicyId pulumi.StringInput + Priority pulumi.IntPtrInput + WorkloadNames pulumi.StringArrayInput + WorkloadNamesNotIn pulumi.StringArrayInput + WorkloadSelector LabelSelectorArgsPtrInput } func (WorkloadPolicyTargetArgs) ElementType() reflect.Type { @@ -211,6 +225,11 @@ func (o WorkloadPolicyTargetOutput) ToWorkloadPolicyTargetOutputWithContext(ctx return o } +// Select workloads by annotations (same semantics as label selectors, evaluated against annotations). +func (o WorkloadPolicyTargetOutput) AnnotationSelector() LabelSelectorArgsPtrOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.AnnotationSelector }).(LabelSelectorArgsPtrOutput) +} + // Cluster IDs where this target applies. func (o WorkloadPolicyTargetOutput) ClusterIds() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.ClusterIds }).(pulumi.StringArrayOutput) @@ -221,7 +240,7 @@ func (o WorkloadPolicyTargetOutput) Description() pulumi.StringPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringPtrOutput { return v.Description }).(pulumi.StringPtrOutput) } -// Enable or disable this target. +// Enable or disable this target. Defaults to true. func (o WorkloadPolicyTargetOutput) Enabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.BoolPtrOutput { return v.Enabled }).(pulumi.BoolPtrOutput) } @@ -231,6 +250,11 @@ func (o WorkloadPolicyTargetOutput) KindFilter() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.KindFilter }).(pulumi.StringArrayOutput) } +// Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. +func (o WorkloadPolicyTargetOutput) KindFilterNotIn() pulumi.StringArrayOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.KindFilterNotIn }).(pulumi.StringArrayOutput) +} + // Human-friendly name for this target. func (o WorkloadPolicyTargetOutput) Name() pulumi.StringOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringOutput { return v.Name }).(pulumi.StringOutput) @@ -251,7 +275,9 @@ func (o WorkloadPolicyTargetOutput) NamespaceSelector() LabelSelectorArgsPtrOutp return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.NamespaceSelector }).(LabelSelectorArgsPtrOutput) } -// Restrict matching to specific node groups by name. +// DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. +// +// Deprecated: node_group_names is deprecated by the DevZero API and no longer evaluated. func (o WorkloadPolicyTargetOutput) NodeGroupNames() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.NodeGroupNames }).(pulumi.StringArrayOutput) } @@ -271,6 +297,11 @@ func (o WorkloadPolicyTargetOutput) WorkloadNames() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.WorkloadNames }).(pulumi.StringArrayOutput) } +// Explicit list of workload names to exclude. +func (o WorkloadPolicyTargetOutput) WorkloadNamesNotIn() pulumi.StringArrayOutput { + return o.ApplyT(func(v *WorkloadPolicyTarget) pulumi.StringArrayOutput { return v.WorkloadNamesNotIn }).(pulumi.StringArrayOutput) +} + // Select workloads by labels. func (o WorkloadPolicyTargetOutput) WorkloadSelector() LabelSelectorArgsPtrOutput { return o.ApplyT(func(v *WorkloadPolicyTarget) LabelSelectorArgsPtrOutput { return v.WorkloadSelector }).(LabelSelectorArgsPtrOutput) diff --git a/sdk/go/devzero/resources/workloadRule.go b/sdk/go/devzero/resources/workloadRule.go index 8773c09..9404561 100644 --- a/sdk/go/devzero/resources/workloadRule.go +++ b/sdk/go/devzero/resources/workloadRule.go @@ -33,6 +33,7 @@ type WorkloadRule struct { DefragmentationSchedule pulumi.StringPtrOutput `pulumi:"defragmentationSchedule"` // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers pulumi.StringArrayOutput `pulumi:"detectionTriggers"` + Disabled pulumi.BoolPtrOutput `pulumi:"disabled"` // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse EmergencyResponseConfigArgsPtrOutput `pulumi:"emergencyResponse"` // GPU vertical scaling rule configuration. @@ -42,7 +43,8 @@ type WorkloadRule struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind pulumi.StringOutput `pulumi:"kind"` // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` + LiveMigrationEnabled pulumi.BoolPtrOutput `pulumi:"liveMigrationEnabled"` + LookbackPeriodSeconds pulumi.IntPtrOutput `pulumi:"lookbackPeriodSeconds"` // Memory vertical scaling rule configuration. MemoryRule ResourceRuleConfigArgsPtrOutput `pulumi:"memoryRule"` // Name of the Kubernetes workload. Example: 'my-api'. @@ -127,6 +129,7 @@ type workloadRuleArgs struct { DefragmentationSchedule *string `pulumi:"defragmentationSchedule"` // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers []string `pulumi:"detectionTriggers"` + Disabled *bool `pulumi:"disabled"` // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse *EmergencyResponseConfigArgs `pulumi:"emergencyResponse"` // GPU vertical scaling rule configuration. @@ -136,7 +139,8 @@ type workloadRuleArgs struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind string `pulumi:"kind"` // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` + LiveMigrationEnabled *bool `pulumi:"liveMigrationEnabled"` + LookbackPeriodSeconds *int `pulumi:"lookbackPeriodSeconds"` // Memory vertical scaling rule configuration. MemoryRule *ResourceRuleConfigArgs `pulumi:"memoryRule"` // Name of the Kubernetes workload. Example: 'my-api'. @@ -171,6 +175,7 @@ type WorkloadRuleArgs struct { DefragmentationSchedule pulumi.StringPtrInput // Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. DetectionTriggers pulumi.StringArrayInput + Disabled pulumi.BoolPtrInput // Emergency response configuration for OOM and CPU throttle events. EmergencyResponse EmergencyResponseConfigArgsPtrInput // GPU vertical scaling rule configuration. @@ -180,7 +185,8 @@ type WorkloadRuleArgs struct { // Kubernetes workload kind. One of: 'Deployment', 'StatefulSet', 'DaemonSet', 'CronJob', 'Job'. Example: 'Deployment'. Kind pulumi.StringInput // Allow live pod migration when applying recommendations. Example: false. - LiveMigrationEnabled pulumi.BoolPtrInput + LiveMigrationEnabled pulumi.BoolPtrInput + LookbackPeriodSeconds pulumi.IntPtrInput // Memory vertical scaling rule configuration. MemoryRule ResourceRuleConfigArgsPtrInput // Name of the Kubernetes workload. Example: 'my-api'. @@ -327,6 +333,10 @@ func (o WorkloadRuleOutput) DetectionTriggers() pulumi.StringArrayOutput { return o.ApplyT(func(v *WorkloadRule) pulumi.StringArrayOutput { return v.DetectionTriggers }).(pulumi.StringArrayOutput) } +func (o WorkloadRuleOutput) Disabled() pulumi.BoolPtrOutput { + return o.ApplyT(func(v *WorkloadRule) pulumi.BoolPtrOutput { return v.Disabled }).(pulumi.BoolPtrOutput) +} + // Emergency response configuration for OOM and CPU throttle events. func (o WorkloadRuleOutput) EmergencyResponse() EmergencyResponseConfigArgsPtrOutput { return o.ApplyT(func(v *WorkloadRule) EmergencyResponseConfigArgsPtrOutput { return v.EmergencyResponse }).(EmergencyResponseConfigArgsPtrOutput) @@ -352,6 +362,10 @@ func (o WorkloadRuleOutput) LiveMigrationEnabled() pulumi.BoolPtrOutput { return o.ApplyT(func(v *WorkloadRule) pulumi.BoolPtrOutput { return v.LiveMigrationEnabled }).(pulumi.BoolPtrOutput) } +func (o WorkloadRuleOutput) LookbackPeriodSeconds() pulumi.IntPtrOutput { + return o.ApplyT(func(v *WorkloadRule) pulumi.IntPtrOutput { return v.LookbackPeriodSeconds }).(pulumi.IntPtrOutput) +} + // Memory vertical scaling rule configuration. func (o WorkloadRuleOutput) MemoryRule() ResourceRuleConfigArgsPtrOutput { return o.ApplyT(func(v *WorkloadRule) ResourceRuleConfigArgsPtrOutput { return v.MemoryRule }).(ResourceRuleConfigArgsPtrOutput) diff --git a/sdk/nodejs/resources/nodePolicy.ts b/sdk/nodejs/resources/nodePolicy.ts index 1d9395d..ece94f2 100644 --- a/sdk/nodejs/resources/nodePolicy.ts +++ b/sdk/nodejs/resources/nodePolicy.ts @@ -49,6 +49,7 @@ export class NodePolicy extends pulumi.CustomResource { * Capacity purchasing types. Valid values: 'spot', 'on-demand', 'reserved'. Example: {in: ["spot", "on-demand"]}. */ declare public readonly capacityTypes: pulumi.Output; + declare public readonly cloudProviderId: pulumi.Output; /** * Free-form description of the node policy. Example: 'Spot instance policy for production batch workloads'. */ @@ -77,6 +78,7 @@ export class NodePolicy extends pulumi.CustomResource { * Filter instances by hypervisor type. Example: {in: ["nitro"]}. */ declare public readonly instanceHypervisors: pulumi.Output; + declare public readonly instanceLocalNvme: pulumi.Output; /** * Filter instances by size label. Example: {in: ["large", "xlarge", "2xlarge"]}. */ @@ -93,6 +95,7 @@ export class NodePolicy extends pulumi.CustomResource { * Resource limits on total capacity managed by this policy. Example: {cpu: "1000", memory: "1000Gi"}. */ declare public readonly limits: pulumi.Output; + declare public readonly masterOverrideRoleName: pulumi.Output; /** * Human-friendly name for the node policy. Example: 'prod-spot-policy'. */ @@ -113,6 +116,7 @@ export class NodePolicy extends pulumi.CustomResource { * Raw Karpenter YAML for full NodePool/NodeClass customization — use only when structured fields are insufficient. */ declare public readonly raw: pulumi.Output; + declare public readonly startupTaints: pulumi.Output; /** * Taints applied to provisioned nodes to control pod scheduling. Example: [{key: "dedicated", value: "gpu", effect: "NoSchedule"}]. */ @@ -121,6 +125,7 @@ export class NodePolicy extends pulumi.CustomResource { * Priority weight; higher values take precedence when multiple policies match. Example: 100. */ declare public readonly weight: pulumi.Output; + declare public readonly zonalShift: pulumi.Output; /** * Availability zones where nodes may be provisioned. Example: {in: ["us-east-1a", "us-east-1b"]}. */ @@ -144,6 +149,7 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["aws"] = args?.aws; resourceInputs["azure"] = args?.azure; resourceInputs["capacityTypes"] = args?.capacityTypes; + resourceInputs["cloudProviderId"] = args?.cloudProviderId; resourceInputs["description"] = args?.description; resourceInputs["disruption"] = args?.disruption; resourceInputs["instanceCategories"] = args?.instanceCategories; @@ -151,23 +157,28 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["instanceFamilies"] = args?.instanceFamilies; resourceInputs["instanceGenerations"] = args?.instanceGenerations; resourceInputs["instanceHypervisors"] = args?.instanceHypervisors; + resourceInputs["instanceLocalNvme"] = args?.instanceLocalNvme; resourceInputs["instanceSizes"] = args?.instanceSizes; resourceInputs["instanceTypes"] = args?.instanceTypes; resourceInputs["labels"] = args?.labels; resourceInputs["limits"] = args?.limits; + resourceInputs["masterOverrideRoleName"] = args?.masterOverrideRoleName; resourceInputs["name"] = args?.name; resourceInputs["nodeClassName"] = args?.nodeClassName; resourceInputs["nodePoolName"] = args?.nodePoolName; resourceInputs["operatingSystems"] = args?.operatingSystems; resourceInputs["raw"] = args?.raw; + resourceInputs["startupTaints"] = args?.startupTaints; resourceInputs["taints"] = args?.taints; resourceInputs["weight"] = args?.weight; + resourceInputs["zonalShift"] = args?.zonalShift; resourceInputs["zones"] = args?.zones; } else { resourceInputs["architectures"] = undefined /*out*/; resourceInputs["aws"] = undefined /*out*/; resourceInputs["azure"] = undefined /*out*/; resourceInputs["capacityTypes"] = undefined /*out*/; + resourceInputs["cloudProviderId"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["disruption"] = undefined /*out*/; resourceInputs["instanceCategories"] = undefined /*out*/; @@ -175,17 +186,21 @@ export class NodePolicy extends pulumi.CustomResource { resourceInputs["instanceFamilies"] = undefined /*out*/; resourceInputs["instanceGenerations"] = undefined /*out*/; resourceInputs["instanceHypervisors"] = undefined /*out*/; + resourceInputs["instanceLocalNvme"] = undefined /*out*/; resourceInputs["instanceSizes"] = undefined /*out*/; resourceInputs["instanceTypes"] = undefined /*out*/; resourceInputs["labels"] = undefined /*out*/; resourceInputs["limits"] = undefined /*out*/; + resourceInputs["masterOverrideRoleName"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["nodeClassName"] = undefined /*out*/; resourceInputs["nodePoolName"] = undefined /*out*/; resourceInputs["operatingSystems"] = undefined /*out*/; resourceInputs["raw"] = undefined /*out*/; + resourceInputs["startupTaints"] = undefined /*out*/; resourceInputs["taints"] = undefined /*out*/; resourceInputs["weight"] = undefined /*out*/; + resourceInputs["zonalShift"] = undefined /*out*/; resourceInputs["zones"] = undefined /*out*/; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); @@ -201,6 +216,7 @@ export interface NodePolicyArgs { aws?: pulumi.Input; azure?: pulumi.Input; capacityTypes?: pulumi.Input; + cloudProviderId?: pulumi.Input; description?: pulumi.Input; disruption?: pulumi.Input; instanceCategories?: pulumi.Input; @@ -208,16 +224,20 @@ export interface NodePolicyArgs { instanceFamilies?: pulumi.Input; instanceGenerations?: pulumi.Input; instanceHypervisors?: pulumi.Input; + instanceLocalNvme?: pulumi.Input; instanceSizes?: pulumi.Input; instanceTypes?: pulumi.Input; labels?: pulumi.Input<{[key: string]: pulumi.Input}>; limits?: pulumi.Input; + masterOverrideRoleName?: pulumi.Input; name: pulumi.Input; nodeClassName?: pulumi.Input; nodePoolName?: pulumi.Input; operatingSystems?: pulumi.Input; raw?: pulumi.Input[]>; + startupTaints?: pulumi.Input[]>; taints?: pulumi.Input[]>; weight?: pulumi.Input; + zonalShift?: pulumi.Input; zones?: pulumi.Input; } diff --git a/sdk/nodejs/resources/nodePolicyTarget.ts b/sdk/nodejs/resources/nodePolicyTarget.ts index 1ccac84..6381f9c 100644 --- a/sdk/nodejs/resources/nodePolicyTarget.ts +++ b/sdk/nodejs/resources/nodePolicyTarget.ts @@ -32,7 +32,7 @@ export class NodePolicyTarget extends pulumi.CustomResource { } /** - * Cluster IDs where this node policy applies. + * Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. */ declare public readonly clusterIds: pulumi.Output; /** diff --git a/sdk/nodejs/resources/workloadPolicy.ts b/sdk/nodejs/resources/workloadPolicy.ts index c85085f..1a3cf33 100644 --- a/sdk/nodejs/resources/workloadPolicy.ts +++ b/sdk/nodejs/resources/workloadPolicy.ts @@ -37,10 +37,15 @@ export class WorkloadPolicy extends pulumi.CustomResource { * When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. */ declare public readonly actionTriggers: pulumi.Output; + declare public readonly allowInPlaceMemoryLimitDecrease: pulumi.Output; /** * Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). */ declare public readonly cooldownMinutes: pulumi.Output; + declare public readonly cpuCeilingPercent: pulumi.Output; + declare public readonly cpuFloorPercent: pulumi.Output; + declare public readonly cpuLimitCeilingPercent: pulumi.Output; + declare public readonly cpuLimitFloorPercent: pulumi.Output; declare public readonly cpuVerticalScaling: pulumi.Output; /** * Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). @@ -62,6 +67,7 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. */ declare public readonly driftDeltaPercent: pulumi.Output; + declare public readonly enableInPlaceVerticalScaling: pulumi.Output; /** * Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. */ @@ -79,6 +85,15 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). */ declare public readonly hysteresisVsTarget: pulumi.Output; + declare public readonly jvmCpuStartupFloorMillicores: pulumi.Output; + declare public readonly jvmHeapHeadroomMultiplier: pulumi.Output; + declare public readonly jvmHeapOptimizationEnabled: pulumi.Output; + declare public readonly jvmHeapTargetPercentile: pulumi.Output; + declare public readonly jvmMaxHeapBytes: pulumi.Output; + declare public readonly jvmMinHeapBytes: pulumi.Output; + declare public readonly jvmNonHeapOverheadBytes: pulumi.Output; + declare public readonly jvmNonHeapOverheadPercent: pulumi.Output; + declare public readonly jvmPreferContainerSupport: pulumi.Output; /** * Allow live pod migration when applying recommendations without restart. Example: false. */ @@ -87,6 +102,10 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). */ declare public readonly loopbackPeriodSeconds: pulumi.Output; + declare public readonly memoryCeilingPercent: pulumi.Output; + declare public readonly memoryFloorPercent: pulumi.Output; + declare public readonly memoryLimitCeilingPercent: pulumi.Output; + declare public readonly memoryLimitFloorPercent: pulumi.Output; declare public readonly memoryVerticalScaling: pulumi.Output; /** * Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). @@ -104,6 +123,7 @@ export class WorkloadPolicy extends pulumi.CustomResource { * Human-friendly name for the policy. Example: 'production-vpa-policy'. */ declare public readonly name: pulumi.Output; + declare public readonly pdbEnabled: pulumi.Output; /** * Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. */ @@ -136,50 +156,90 @@ export class WorkloadPolicy extends pulumi.CustomResource { throw new Error("Missing required property 'name'"); } resourceInputs["actionTriggers"] = args?.actionTriggers; + resourceInputs["allowInPlaceMemoryLimitDecrease"] = args?.allowInPlaceMemoryLimitDecrease; resourceInputs["cooldownMinutes"] = (args?.cooldownMinutes) ?? 300; + resourceInputs["cpuCeilingPercent"] = args?.cpuCeilingPercent; + resourceInputs["cpuFloorPercent"] = args?.cpuFloorPercent; + resourceInputs["cpuLimitCeilingPercent"] = args?.cpuLimitCeilingPercent; + resourceInputs["cpuLimitFloorPercent"] = args?.cpuLimitFloorPercent; resourceInputs["cpuVerticalScaling"] = args ? (args.cpuVerticalScaling ? pulumi.output(args.cpuVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["cronSchedule"] = args?.cronSchedule; resourceInputs["defragmentationSchedule"] = args?.defragmentationSchedule; resourceInputs["description"] = args?.description; resourceInputs["detectionTriggers"] = args?.detectionTriggers; resourceInputs["driftDeltaPercent"] = args?.driftDeltaPercent; + resourceInputs["enableInPlaceVerticalScaling"] = args?.enableInPlaceVerticalScaling; resourceInputs["enablePmaxProtection"] = args?.enablePmaxProtection; resourceInputs["gpuVerticalScaling"] = args ? (args.gpuVerticalScaling ? pulumi.output(args.gpuVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["gpuVramVerticalScaling"] = args ? (args.gpuVramVerticalScaling ? pulumi.output(args.gpuVramVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["horizontalScaling"] = args?.horizontalScaling; resourceInputs["hysteresisVsTarget"] = args?.hysteresisVsTarget; + resourceInputs["jvmCpuStartupFloorMillicores"] = args?.jvmCpuStartupFloorMillicores; + resourceInputs["jvmHeapHeadroomMultiplier"] = args?.jvmHeapHeadroomMultiplier; + resourceInputs["jvmHeapOptimizationEnabled"] = args?.jvmHeapOptimizationEnabled; + resourceInputs["jvmHeapTargetPercentile"] = args?.jvmHeapTargetPercentile; + resourceInputs["jvmMaxHeapBytes"] = args?.jvmMaxHeapBytes; + resourceInputs["jvmMinHeapBytes"] = args?.jvmMinHeapBytes; + resourceInputs["jvmNonHeapOverheadBytes"] = args?.jvmNonHeapOverheadBytes; + resourceInputs["jvmNonHeapOverheadPercent"] = args?.jvmNonHeapOverheadPercent; + resourceInputs["jvmPreferContainerSupport"] = args?.jvmPreferContainerSupport; resourceInputs["liveMigrationEnabled"] = args?.liveMigrationEnabled; resourceInputs["loopbackPeriodSeconds"] = (args?.loopbackPeriodSeconds) ?? 86400; + resourceInputs["memoryCeilingPercent"] = args?.memoryCeilingPercent; + resourceInputs["memoryFloorPercent"] = args?.memoryFloorPercent; + resourceInputs["memoryLimitCeilingPercent"] = args?.memoryLimitCeilingPercent; + resourceInputs["memoryLimitFloorPercent"] = args?.memoryLimitFloorPercent; resourceInputs["memoryVerticalScaling"] = args ? (args.memoryVerticalScaling ? pulumi.output(args.memoryVerticalScaling).apply(inputs.resources.verticalScalingArgsArgsProvideDefaults) : undefined) : undefined; resourceInputs["minChangePercent"] = (args?.minChangePercent) ?? 0.2; resourceInputs["minDataPoints"] = (args?.minDataPoints) ?? 15; resourceInputs["minVpaWindowDataPoints"] = (args?.minVpaWindowDataPoints) ?? 30; resourceInputs["name"] = args?.name; + resourceInputs["pdbEnabled"] = args?.pdbEnabled; resourceInputs["pmaxRatioThreshold"] = (args?.pmaxRatioThreshold) ?? 3; resourceInputs["schedulerPlugins"] = args?.schedulerPlugins; resourceInputs["stabilityCvMax"] = args?.stabilityCvMax; resourceInputs["startupPeriodSeconds"] = args?.startupPeriodSeconds; } else { resourceInputs["actionTriggers"] = undefined /*out*/; + resourceInputs["allowInPlaceMemoryLimitDecrease"] = undefined /*out*/; resourceInputs["cooldownMinutes"] = undefined /*out*/; + resourceInputs["cpuCeilingPercent"] = undefined /*out*/; + resourceInputs["cpuFloorPercent"] = undefined /*out*/; + resourceInputs["cpuLimitCeilingPercent"] = undefined /*out*/; + resourceInputs["cpuLimitFloorPercent"] = undefined /*out*/; resourceInputs["cpuVerticalScaling"] = undefined /*out*/; resourceInputs["cronSchedule"] = undefined /*out*/; resourceInputs["defragmentationSchedule"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["detectionTriggers"] = undefined /*out*/; resourceInputs["driftDeltaPercent"] = undefined /*out*/; + resourceInputs["enableInPlaceVerticalScaling"] = undefined /*out*/; resourceInputs["enablePmaxProtection"] = undefined /*out*/; resourceInputs["gpuVerticalScaling"] = undefined /*out*/; resourceInputs["gpuVramVerticalScaling"] = undefined /*out*/; resourceInputs["horizontalScaling"] = undefined /*out*/; resourceInputs["hysteresisVsTarget"] = undefined /*out*/; + resourceInputs["jvmCpuStartupFloorMillicores"] = undefined /*out*/; + resourceInputs["jvmHeapHeadroomMultiplier"] = undefined /*out*/; + resourceInputs["jvmHeapOptimizationEnabled"] = undefined /*out*/; + resourceInputs["jvmHeapTargetPercentile"] = undefined /*out*/; + resourceInputs["jvmMaxHeapBytes"] = undefined /*out*/; + resourceInputs["jvmMinHeapBytes"] = undefined /*out*/; + resourceInputs["jvmNonHeapOverheadBytes"] = undefined /*out*/; + resourceInputs["jvmNonHeapOverheadPercent"] = undefined /*out*/; + resourceInputs["jvmPreferContainerSupport"] = undefined /*out*/; resourceInputs["liveMigrationEnabled"] = undefined /*out*/; resourceInputs["loopbackPeriodSeconds"] = undefined /*out*/; + resourceInputs["memoryCeilingPercent"] = undefined /*out*/; + resourceInputs["memoryFloorPercent"] = undefined /*out*/; + resourceInputs["memoryLimitCeilingPercent"] = undefined /*out*/; + resourceInputs["memoryLimitFloorPercent"] = undefined /*out*/; resourceInputs["memoryVerticalScaling"] = undefined /*out*/; resourceInputs["minChangePercent"] = undefined /*out*/; resourceInputs["minDataPoints"] = undefined /*out*/; resourceInputs["minVpaWindowDataPoints"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; + resourceInputs["pdbEnabled"] = undefined /*out*/; resourceInputs["pmaxRatioThreshold"] = undefined /*out*/; resourceInputs["schedulerPlugins"] = undefined /*out*/; resourceInputs["stabilityCvMax"] = undefined /*out*/; @@ -198,10 +258,15 @@ export interface WorkloadPolicyArgs { * When to apply recommendations. Valid values: 'on_detection', 'on_schedule'. Example: ["on_detection"]. */ actionTriggers?: pulumi.Input[]>; + allowInPlaceMemoryLimitDecrease?: pulumi.Input; /** * Minimum minutes to wait between consecutive recommendation applications. Example: 300 (5 h, default). */ cooldownMinutes?: pulumi.Input; + cpuCeilingPercent?: pulumi.Input; + cpuFloorPercent?: pulumi.Input; + cpuLimitCeilingPercent?: pulumi.Input; + cpuLimitFloorPercent?: pulumi.Input; cpuVerticalScaling?: pulumi.Input; /** * Cron expression for scheduled application (5-field UTC format). Required when actionTriggers includes 'on_schedule'. Example: '0 2 * * *' (daily at 2 am UTC). @@ -223,6 +288,7 @@ export interface WorkloadPolicyArgs { * Percentage change from the baseline recommendation that triggers a VPA refresh. Example: 20.0. */ driftDeltaPercent?: pulumi.Input; + enableInPlaceVerticalScaling?: pulumi.Input; /** * Raise requests to cover observed peak usage when the peak/recommendation ratio exceeds pmaxRatioThreshold. Default: false. */ @@ -240,6 +306,15 @@ export interface WorkloadPolicyArgs { * Dead-band ratio around the HPA target to suppress oscillation between VPA and HPA. Example: 0.1 (10% band). */ hysteresisVsTarget?: pulumi.Input; + jvmCpuStartupFloorMillicores?: pulumi.Input; + jvmHeapHeadroomMultiplier?: pulumi.Input; + jvmHeapOptimizationEnabled?: pulumi.Input; + jvmHeapTargetPercentile?: pulumi.Input; + jvmMaxHeapBytes?: pulumi.Input; + jvmMinHeapBytes?: pulumi.Input; + jvmNonHeapOverheadBytes?: pulumi.Input; + jvmNonHeapOverheadPercent?: pulumi.Input; + jvmPreferContainerSupport?: pulumi.Input; /** * Allow live pod migration when applying recommendations without restart. Example: false. */ @@ -248,6 +323,10 @@ export interface WorkloadPolicyArgs { * Seconds of historical usage data considered per recommendation. Example: 86400 (24 h, default). */ loopbackPeriodSeconds?: pulumi.Input; + memoryCeilingPercent?: pulumi.Input; + memoryFloorPercent?: pulumi.Input; + memoryLimitCeilingPercent?: pulumi.Input; + memoryLimitFloorPercent?: pulumi.Input; memoryVerticalScaling?: pulumi.Input; /** * Minimum relative change (0-1) required before a recommendation is applied globally. Example: 0.2 means 20% change needed (default). @@ -265,6 +344,7 @@ export interface WorkloadPolicyArgs { * Human-friendly name for the policy. Example: 'production-vpa-policy'. */ name: pulumi.Input; + pdbEnabled?: pulumi.Input; /** * Peak-to-recommendation ratio above which pmax protection activates. Example: 3.0 (default) — triggers when peak is 3× the recommendation. */ diff --git a/sdk/nodejs/resources/workloadPolicyTarget.ts b/sdk/nodejs/resources/workloadPolicyTarget.ts index 05433ca..a449863 100644 --- a/sdk/nodejs/resources/workloadPolicyTarget.ts +++ b/sdk/nodejs/resources/workloadPolicyTarget.ts @@ -33,6 +33,10 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { return obj['__pulumiType'] === WorkloadPolicyTarget.__pulumiType; } + /** + * Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + */ + declare public readonly annotationSelector: pulumi.Output; /** * Cluster IDs where this target applies. */ @@ -42,13 +46,17 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { */ declare public readonly description: pulumi.Output; /** - * Enable or disable this target. + * Enable or disable this target. Defaults to true. */ declare public readonly enabled: pulumi.Output; /** * Restrict matching to specific Kubernetes kinds (e.g. Deployment, Pod). */ declare public readonly kindFilter: pulumi.Output; + /** + * Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + */ + declare public readonly kindFilterNotIn: pulumi.Output; /** * Human-friendly name for this target. */ @@ -66,7 +74,9 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { */ declare public readonly namespaceSelector: pulumi.Output; /** - * Restrict matching to specific node groups by name. + * DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. + * + * @deprecated node_group_names is deprecated by the DevZero API and no longer evaluated. */ declare public readonly nodeGroupNames: pulumi.Output; /** @@ -81,6 +91,10 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { * Explicit list of workload names to include. */ declare public readonly workloadNames: pulumi.Output; + /** + * Explicit list of workload names to exclude. + */ + declare public readonly workloadNamesNotIn: pulumi.Output; /** * Select workloads by labels. */ @@ -106,10 +120,12 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { if (args?.policyId === undefined && !opts.urn) { throw new Error("Missing required property 'policyId'"); } + resourceInputs["annotationSelector"] = args?.annotationSelector; resourceInputs["clusterIds"] = args?.clusterIds; resourceInputs["description"] = args?.description; resourceInputs["enabled"] = args?.enabled; resourceInputs["kindFilter"] = args?.kindFilter; + resourceInputs["kindFilterNotIn"] = args?.kindFilterNotIn; resourceInputs["name"] = args?.name; resourceInputs["namePattern"] = args?.namePattern; resourceInputs["namespacePattern"] = args?.namespacePattern; @@ -118,12 +134,15 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { resourceInputs["policyId"] = args?.policyId; resourceInputs["priority"] = args?.priority; resourceInputs["workloadNames"] = args?.workloadNames; + resourceInputs["workloadNamesNotIn"] = args?.workloadNamesNotIn; resourceInputs["workloadSelector"] = args?.workloadSelector; } else { + resourceInputs["annotationSelector"] = undefined /*out*/; resourceInputs["clusterIds"] = undefined /*out*/; resourceInputs["description"] = undefined /*out*/; resourceInputs["enabled"] = undefined /*out*/; resourceInputs["kindFilter"] = undefined /*out*/; + resourceInputs["kindFilterNotIn"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["namePattern"] = undefined /*out*/; resourceInputs["namespacePattern"] = undefined /*out*/; @@ -132,6 +151,7 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { resourceInputs["policyId"] = undefined /*out*/; resourceInputs["priority"] = undefined /*out*/; resourceInputs["workloadNames"] = undefined /*out*/; + resourceInputs["workloadNamesNotIn"] = undefined /*out*/; resourceInputs["workloadSelector"] = undefined /*out*/; } opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts); @@ -143,10 +163,12 @@ export class WorkloadPolicyTarget extends pulumi.CustomResource { * The set of arguments for constructing a WorkloadPolicyTarget resource. */ export interface WorkloadPolicyTargetArgs { + annotationSelector?: pulumi.Input; clusterIds: pulumi.Input[]>; description?: pulumi.Input; enabled?: pulumi.Input; kindFilter?: pulumi.Input[]>; + kindFilterNotIn?: pulumi.Input[]>; name: pulumi.Input; namePattern?: pulumi.Input; namespacePattern?: pulumi.Input; @@ -155,5 +177,6 @@ export interface WorkloadPolicyTargetArgs { policyId: pulumi.Input; priority?: pulumi.Input; workloadNames?: pulumi.Input[]>; + workloadNamesNotIn?: pulumi.Input[]>; workloadSelector?: pulumi.Input; } diff --git a/sdk/nodejs/resources/workloadRule.ts b/sdk/nodejs/resources/workloadRule.ts index 778eee9..36f13a6 100644 --- a/sdk/nodejs/resources/workloadRule.ts +++ b/sdk/nodejs/resources/workloadRule.ts @@ -69,6 +69,7 @@ export class WorkloadRule extends pulumi.CustomResource { * Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. */ declare public readonly detectionTriggers: pulumi.Output; + declare public readonly disabled: pulumi.Output; /** * Emergency response configuration for OOM and CPU throttle events. */ @@ -89,6 +90,7 @@ export class WorkloadRule extends pulumi.CustomResource { * Allow live pod migration when applying recommendations. Example: false. */ declare public readonly liveMigrationEnabled: pulumi.Output; + declare public readonly lookbackPeriodSeconds: pulumi.Output; /** * Memory vertical scaling rule configuration. */ @@ -146,11 +148,13 @@ export class WorkloadRule extends pulumi.CustomResource { resourceInputs["cronSchedule"] = args?.cronSchedule; resourceInputs["defragmentationSchedule"] = args?.defragmentationSchedule; resourceInputs["detectionTriggers"] = args?.detectionTriggers; + resourceInputs["disabled"] = args?.disabled; resourceInputs["emergencyResponse"] = args?.emergencyResponse; resourceInputs["gpuRule"] = args?.gpuRule; resourceInputs["hpaRule"] = args?.hpaRule; resourceInputs["kind"] = args?.kind; resourceInputs["liveMigrationEnabled"] = args?.liveMigrationEnabled; + resourceInputs["lookbackPeriodSeconds"] = args?.lookbackPeriodSeconds; resourceInputs["memoryRule"] = args?.memoryRule; resourceInputs["name"] = args?.name; resourceInputs["namespace"] = args?.namespace; @@ -167,11 +171,13 @@ export class WorkloadRule extends pulumi.CustomResource { resourceInputs["cronSchedule"] = undefined /*out*/; resourceInputs["defragmentationSchedule"] = undefined /*out*/; resourceInputs["detectionTriggers"] = undefined /*out*/; + resourceInputs["disabled"] = undefined /*out*/; resourceInputs["emergencyResponse"] = undefined /*out*/; resourceInputs["gpuRule"] = undefined /*out*/; resourceInputs["hpaRule"] = undefined /*out*/; resourceInputs["kind"] = undefined /*out*/; resourceInputs["liveMigrationEnabled"] = undefined /*out*/; + resourceInputs["lookbackPeriodSeconds"] = undefined /*out*/; resourceInputs["memoryRule"] = undefined /*out*/; resourceInputs["name"] = undefined /*out*/; resourceInputs["namespace"] = undefined /*out*/; @@ -224,6 +230,7 @@ export interface WorkloadRuleArgs { * Events that trigger a recommendation. Valid values: 'pod_creation', 'pod_update', 'pod_reschedule'. Example: ["pod_creation"]. */ detectionTriggers?: pulumi.Input[]>; + disabled?: pulumi.Input; /** * Emergency response configuration for OOM and CPU throttle events. */ @@ -244,6 +251,7 @@ export interface WorkloadRuleArgs { * Allow live pod migration when applying recommendations. Example: false. */ liveMigrationEnabled?: pulumi.Input; + lookbackPeriodSeconds?: pulumi.Input; /** * Memory vertical scaling rule configuration. */ diff --git a/sdk/nodejs/types/input.ts b/sdk/nodejs/types/input.ts index 33c640c..b539699 100644 --- a/sdk/nodejs/types/input.ts +++ b/sdk/nodejs/types/input.ts @@ -154,6 +154,7 @@ export namespace resources { * Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. */ imageFamily?: pulumi.Input; + imageVersion?: pulumi.Input; /** * Kubelet configuration overrides for Azure nodes. */ @@ -368,6 +369,7 @@ export namespace resources { } export interface HPAMetricTriggerArgsArgs { + connectorId?: pulumi.Input; /** * Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. */ @@ -424,29 +426,17 @@ export namespace resources { */ maxReplicas?: pulumi.Input; /** - * Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + * HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. */ metrics?: pulumi.Input[]>; /** * Minimum number of replicas. Example: 2. */ minReplicas?: pulumi.Input; - /** - * Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - */ - primaryMetric?: pulumi.Input; /** * Seconds to wait between scale-down events. Example: 300. */ scaleDownCooldownSeconds?: pulumi.Input; - /** - * Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - */ - targetMemoryUtilization?: pulumi.Input; - /** - * Target CPU utilization ratio (0-1). Example: 0.7. - */ - targetUtilization?: pulumi.Input; } export interface HPAScalingPolicyArgsArgs { @@ -480,6 +470,7 @@ export namespace resources { } export interface HorizontalScalingArgsArgs { + compositeFormula?: pulumi.Input; /** * Enable horizontal (replica) scaling. Example: true. */ @@ -500,10 +491,13 @@ export namespace resources { * Minimum number of replicas to maintain. Example: 2. */ minReplicas?: pulumi.Input; + networkTargetThroughputBytesPerSec?: pulumi.Input; /** * Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. */ primaryMetric?: pulumi.Input; + scaleDownCooldownSeconds?: pulumi.Input; + targetMemoryUtilization?: pulumi.Input; /** * Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. */ @@ -640,14 +634,21 @@ export namespace resources { } export interface ResourceRuleConfigArgsArgs { + ceilingPercent?: pulumi.Input; /** * Enable this resource axis rule. Example: true. */ enabled?: pulumi.Input; + floorPercent?: pulumi.Input; + initialLimit?: pulumi.Input; + initialRequest?: pulumi.Input; + limitCeilingPercent?: pulumi.Input; + limitFloorPercent?: pulumi.Input; /** * Multiplier applied to the request to derive the resource limit. Example: 1.5. */ limitMultiplier?: pulumi.Input; + limitUseRss?: pulumi.Input; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -672,6 +673,7 @@ export namespace resources { * Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. */ minRequest?: pulumi.Input; + requestUseRss?: pulumi.Input; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95. */ @@ -732,6 +734,7 @@ export namespace resources { * Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. */ limitMultiplier?: pulumi.Input; + limitUseRss?: pulumi.Input; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -764,6 +767,7 @@ export namespace resources { * Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. */ overheadMultiplier?: pulumi.Input; + requestUseRss?: pulumi.Input; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. */ @@ -780,4 +784,10 @@ export namespace resources { minDataPoints: (val.minDataPoints) ?? 20, }; } + + export interface ZonalShiftConfigArgsArgs { + allowZoneFallback?: pulumi.Input; + evictImpactedNodes?: pulumi.Input; + respectZonalShift?: pulumi.Input; + } } diff --git a/sdk/nodejs/types/output.ts b/sdk/nodejs/types/output.ts index 7ace181..b9cf08b 100644 --- a/sdk/nodejs/types/output.ts +++ b/sdk/nodejs/types/output.ts @@ -154,6 +154,7 @@ export namespace resources { * Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. */ imageFamily?: string; + imageVersion?: string; /** * Kubelet configuration overrides for Azure nodes. */ @@ -368,6 +369,7 @@ export namespace resources { } export interface HPAMetricTriggerArgs { + connectorId?: string; /** * Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. */ @@ -424,29 +426,17 @@ export namespace resources { */ maxReplicas?: number; /** - * Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + * HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. */ metrics?: outputs.resources.HPAMetricTriggerArgs[]; /** * Minimum number of replicas. Example: 2. */ minReplicas?: number; - /** - * Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - */ - primaryMetric?: string; /** * Seconds to wait between scale-down events. Example: 300. */ scaleDownCooldownSeconds?: number; - /** - * Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - */ - targetMemoryUtilization?: number; - /** - * Target CPU utilization ratio (0-1). Example: 0.7. - */ - targetUtilization?: number; } export interface HPAScalingPolicyArgs { @@ -480,6 +470,7 @@ export namespace resources { } export interface HorizontalScalingArgs { + compositeFormula?: string; /** * Enable horizontal (replica) scaling. Example: true. */ @@ -500,10 +491,13 @@ export namespace resources { * Minimum number of replicas to maintain. Example: 2. */ minReplicas?: number; + networkTargetThroughputBytesPerSec?: number; /** * Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. */ primaryMetric?: string; + scaleDownCooldownSeconds?: number; + targetMemoryUtilization?: number; /** * Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. */ @@ -640,14 +634,21 @@ export namespace resources { } export interface ResourceRuleConfigArgs { + ceilingPercent?: number; /** * Enable this resource axis rule. Example: true. */ enabled?: boolean; + floorPercent?: number; + initialLimit?: number; + initialRequest?: number; + limitCeilingPercent?: number; + limitFloorPercent?: number; /** * Multiplier applied to the request to derive the resource limit. Example: 1.5. */ limitMultiplier?: number; + limitUseRss?: boolean; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -672,6 +673,7 @@ export namespace resources { * Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. */ minRequest?: number; + requestUseRss?: boolean; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95. */ @@ -732,6 +734,7 @@ export namespace resources { * Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. */ limitMultiplier?: number; + limitUseRss?: boolean; /** * Whether to also adjust resource limits alongside requests. Example: true. */ @@ -764,6 +767,7 @@ export namespace resources { * Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. */ overheadMultiplier?: number; + requestUseRss?: boolean; /** * Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. */ @@ -781,4 +785,10 @@ export namespace resources { }; } + export interface ZonalShiftConfigArgs { + allowZoneFallback?: boolean; + evictImpactedNodes?: boolean; + respectZonalShift?: boolean; + } + } diff --git a/sdk/python/pulumi_devzero/resources/_inputs.py b/sdk/python/pulumi_devzero/resources/_inputs.py index 99073b9..4dc3c12 100644 --- a/sdk/python/pulumi_devzero/resources/_inputs.py +++ b/sdk/python/pulumi_devzero/resources/_inputs.py @@ -75,6 +75,8 @@ 'TaintArgsArgsDict', 'VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict', + 'ZonalShiftConfigArgsArgs', + 'ZonalShiftConfigArgsArgsDict', ] class AMISelectorTermArgsArgsDict(TypedDict): @@ -753,6 +755,7 @@ class AzureNodeClassSpecArgsArgsDict(TypedDict): """ Azure node image family. One of: 'AzureLinux', 'Ubuntu2204'. Example: 'AzureLinux'. """ + image_version: NotRequired[pulumi.Input[_builtins.str]] kubelet: NotRequired[pulumi.Input['AzureKubeletConfigurationArgsArgsDict']] """ Kubelet configuration overrides for Azure nodes. @@ -779,6 +782,7 @@ class AzureNodeClassSpecArgsArgs: def __init__(__self__, *, fips_mode: Optional[pulumi.Input[_builtins.str]] = None, image_family: Optional[pulumi.Input[_builtins.str]] = None, + image_version: Optional[pulumi.Input[_builtins.str]] = None, kubelet: Optional[pulumi.Input['AzureKubeletConfigurationArgsArgs']] = None, max_pods: Optional[pulumi.Input[_builtins.int]] = None, os_disk_size_gb: Optional[pulumi.Input[_builtins.int]] = None, @@ -797,6 +801,8 @@ def __init__(__self__, *, pulumi.set(__self__, "fips_mode", fips_mode) if image_family is not None: pulumi.set(__self__, "image_family", image_family) + if image_version is not None: + pulumi.set(__self__, "image_version", image_version) if kubelet is not None: pulumi.set(__self__, "kubelet", kubelet) if max_pods is not None: @@ -832,6 +838,15 @@ def image_family(self) -> Optional[pulumi.Input[_builtins.str]]: def image_family(self, value: Optional[pulumi.Input[_builtins.str]]): pulumi.set(self, "image_family", value) + @_builtins.property + @pulumi.getter(name="imageVersion") + def image_version(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "image_version") + + @image_version.setter + def image_version(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "image_version", value) + @_builtins.property @pulumi.getter def kubelet(self) -> Optional[pulumi.Input['AzureKubeletConfigurationArgsArgs']]: @@ -1797,6 +1812,7 @@ class HPAMetricTriggerArgsArgsDict(TypedDict): """ Metric source type. Built-in: 'CPU', 'Memory', 'NetworkIngress', 'NetworkEgress'. External: 'prometheus'. Example: 'prometheus'. """ + connector_id: NotRequired[pulumi.Input[_builtins.str]] metadata: NotRequired[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] """ Free-form key-value pairs for external scalers. For Prometheus use serverAddress and query instead. @@ -1826,6 +1842,7 @@ class HPAMetricTriggerArgsArgsDict(TypedDict): class HPAMetricTriggerArgsArgs: def __init__(__self__, *, type: pulumi.Input[_builtins.str], + connector_id: Optional[pulumi.Input[_builtins.str]] = None, metadata: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, query: Optional[pulumi.Input[_builtins.str]] = None, server_address: Optional[pulumi.Input[_builtins.str]] = None, @@ -1842,6 +1859,8 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.str] weight: Weight for composite formula scaling (0-1 decimal string). Example: '0.5'. """ pulumi.set(__self__, "type", type) + if connector_id is not None: + pulumi.set(__self__, "connector_id", connector_id) if metadata is not None: pulumi.set(__self__, "metadata", metadata) if query is not None: @@ -1867,6 +1886,15 @@ def type(self) -> pulumi.Input[_builtins.str]: def type(self, value: pulumi.Input[_builtins.str]): pulumi.set(self, "type", value) + @_builtins.property + @pulumi.getter(name="connectorId") + def connector_id(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "connector_id") + + @connector_id.setter + def connector_id(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "connector_id", value) + @_builtins.property @pulumi.getter def metadata(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]]: @@ -1967,28 +1995,16 @@ class HPARuleConfigArgsArgsDict(TypedDict): """ metrics: NotRequired[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgsDict']]]] """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ min_replicas: NotRequired[pulumi.Input[_builtins.int]] """ Minimum number of replicas. Example: 2. """ - primary_metric: NotRequired[pulumi.Input[_builtins.str]] - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ scale_down_cooldown_seconds: NotRequired[pulumi.Input[_builtins.int]] """ Seconds to wait between scale-down events. Example: 300. """ - target_memory_utilization: NotRequired[pulumi.Input[_builtins.float]] - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - target_utilization: NotRequired[pulumi.Input[_builtins.float]] - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ @pulumi.input_type class HPARuleConfigArgsArgs: @@ -2001,10 +2017,7 @@ def __init__(__self__, *, max_replicas: Optional[pulumi.Input[_builtins.int]] = None, metrics: Optional[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]]] = None, min_replicas: Optional[pulumi.Input[_builtins.int]] = None, - primary_metric: Optional[pulumi.Input[_builtins.str]] = None, - scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None, - target_memory_utilization: Optional[pulumi.Input[_builtins.float]] = None, - target_utilization: Optional[pulumi.Input[_builtins.float]] = None): + scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None): """ :param pulumi.Input['HPABehaviorArgsArgs'] behavior: Fine-grained scale-up and scale-down behavior policies. :param pulumi.Input[_builtins.str] composite_formula: Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'. @@ -2012,12 +2025,9 @@ def __init__(__self__, *, :param pulumi.Input['HPAFallbackArgsArgs'] fallback: Replica fallback configuration when metrics are unavailable. :param pulumi.Input[_builtins.float] max_replica_change_percent: Maximum percentage change in replica count per cycle. Example: 50.0. :param pulumi.Input[_builtins.int] max_replicas: Maximum number of replicas. Example: 10. - :param pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]] metrics: Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + :param pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]] metrics: HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. :param pulumi.Input[_builtins.int] min_replicas: Minimum number of replicas. Example: 2. - :param pulumi.Input[_builtins.str] primary_metric: Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param pulumi.Input[_builtins.int] scale_down_cooldown_seconds: Seconds to wait between scale-down events. Example: 300. - :param pulumi.Input[_builtins.float] target_memory_utilization: Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - :param pulumi.Input[_builtins.float] target_utilization: Target CPU utilization ratio (0-1). Example: 0.7. """ if behavior is not None: pulumi.set(__self__, "behavior", behavior) @@ -2035,14 +2045,8 @@ def __init__(__self__, *, pulumi.set(__self__, "metrics", metrics) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) - if primary_metric is not None: - pulumi.set(__self__, "primary_metric", primary_metric) if scale_down_cooldown_seconds is not None: pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) - if target_memory_utilization is not None: - pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) - if target_utilization is not None: - pulumi.set(__self__, "target_utilization", target_utilization) @_builtins.property @pulumi.getter @@ -2120,7 +2124,7 @@ def max_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): @pulumi.getter def metrics(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['HPAMetricTriggerArgsArgs']]]]: """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ return pulumi.get(self, "metrics") @@ -2140,18 +2144,6 @@ def min_replicas(self) -> Optional[pulumi.Input[_builtins.int]]: def min_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_replicas", value) - @_builtins.property - @pulumi.getter(name="primaryMetric") - def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ - return pulumi.get(self, "primary_metric") - - @primary_metric.setter - def primary_metric(self, value: Optional[pulumi.Input[_builtins.str]]): - pulumi.set(self, "primary_metric", value) - @_builtins.property @pulumi.getter(name="scaleDownCooldownSeconds") def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: @@ -2164,30 +2156,6 @@ def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: def scale_down_cooldown_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "scale_down_cooldown_seconds", value) - @_builtins.property - @pulumi.getter(name="targetMemoryUtilization") - def target_memory_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - return pulumi.get(self, "target_memory_utilization") - - @target_memory_utilization.setter - def target_memory_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): - pulumi.set(self, "target_memory_utilization", value) - - @_builtins.property - @pulumi.getter(name="targetUtilization") - def target_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ - return pulumi.get(self, "target_utilization") - - @target_utilization.setter - def target_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): - pulumi.set(self, "target_utilization", value) - class HPAScalingPolicyArgsArgsDict(TypedDict): period_seconds: pulumi.Input[_builtins.int] @@ -2325,6 +2293,7 @@ def stabilization_window_seconds(self, value: Optional[pulumi.Input[_builtins.in class HorizontalScalingArgsArgsDict(TypedDict): + composite_formula: NotRequired[pulumi.Input[_builtins.str]] enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Enable horizontal (replica) scaling. Example: true. @@ -2345,10 +2314,13 @@ class HorizontalScalingArgsArgsDict(TypedDict): """ Minimum number of replicas to maintain. Example: 2. """ + network_target_throughput_bytes_per_sec: NotRequired[pulumi.Input[_builtins.int]] primary_metric: NotRequired[pulumi.Input[_builtins.str]] """ Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. """ + scale_down_cooldown_seconds: NotRequired[pulumi.Input[_builtins.int]] + target_memory_utilization: NotRequired[pulumi.Input[_builtins.float]] target_utilization: NotRequired[pulumi.Input[_builtins.float]] """ Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. @@ -2357,12 +2329,16 @@ class HorizontalScalingArgsArgsDict(TypedDict): @pulumi.input_type class HorizontalScalingArgsArgs: def __init__(__self__, *, + composite_formula: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_replica_change_percent: Optional[pulumi.Input[_builtins.float]] = None, max_replicas: Optional[pulumi.Input[_builtins.int]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_replicas: Optional[pulumi.Input[_builtins.int]] = None, + network_target_throughput_bytes_per_sec: Optional[pulumi.Input[_builtins.int]] = None, primary_metric: Optional[pulumi.Input[_builtins.str]] = None, + scale_down_cooldown_seconds: Optional[pulumi.Input[_builtins.int]] = None, + target_memory_utilization: Optional[pulumi.Input[_builtins.float]] = None, target_utilization: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] enabled: Enable horizontal (replica) scaling. Example: true. @@ -2373,6 +2349,8 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.str] primary_metric: Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param pulumi.Input[_builtins.float] target_utilization: Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. """ + if composite_formula is not None: + pulumi.set(__self__, "composite_formula", composite_formula) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if max_replica_change_percent is not None: @@ -2383,11 +2361,26 @@ def __init__(__self__, *, pulumi.set(__self__, "min_data_points", min_data_points) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) + if network_target_throughput_bytes_per_sec is not None: + pulumi.set(__self__, "network_target_throughput_bytes_per_sec", network_target_throughput_bytes_per_sec) if primary_metric is not None: pulumi.set(__self__, "primary_metric", primary_metric) + if scale_down_cooldown_seconds is not None: + pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) + if target_memory_utilization is not None: + pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) if target_utilization is not None: pulumi.set(__self__, "target_utilization", target_utilization) + @_builtins.property + @pulumi.getter(name="compositeFormula") + def composite_formula(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "composite_formula") + + @composite_formula.setter + def composite_formula(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "composite_formula", value) + @_builtins.property @pulumi.getter def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -2448,6 +2441,15 @@ def min_replicas(self) -> Optional[pulumi.Input[_builtins.int]]: def min_replicas(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_replicas", value) + @_builtins.property + @pulumi.getter(name="networkTargetThroughputBytesPerSec") + def network_target_throughput_bytes_per_sec(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "network_target_throughput_bytes_per_sec") + + @network_target_throughput_bytes_per_sec.setter + def network_target_throughput_bytes_per_sec(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "network_target_throughput_bytes_per_sec", value) + @_builtins.property @pulumi.getter(name="primaryMetric") def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -2460,6 +2462,24 @@ def primary_metric(self) -> Optional[pulumi.Input[_builtins.str]]: def primary_metric(self, value: Optional[pulumi.Input[_builtins.str]]): pulumi.set(self, "primary_metric", value) + @_builtins.property + @pulumi.getter(name="scaleDownCooldownSeconds") + def scale_down_cooldown_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "scale_down_cooldown_seconds") + + @scale_down_cooldown_seconds.setter + def scale_down_cooldown_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "scale_down_cooldown_seconds", value) + + @_builtins.property + @pulumi.getter(name="targetMemoryUtilization") + def target_memory_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "target_memory_utilization") + + @target_memory_utilization.setter + def target_memory_utilization(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "target_memory_utilization", value) + @_builtins.property @pulumi.getter(name="targetUtilization") def target_utilization(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3077,14 +3097,21 @@ def memory(self, value: Optional[pulumi.Input[_builtins.str]]): class ResourceRuleConfigArgsArgsDict(TypedDict): + ceiling_percent: NotRequired[pulumi.Input[_builtins.int]] enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Enable this resource axis rule. Example: true. """ + floor_percent: NotRequired[pulumi.Input[_builtins.int]] + initial_limit: NotRequired[pulumi.Input[_builtins.int]] + initial_request: NotRequired[pulumi.Input[_builtins.int]] + limit_ceiling_percent: NotRequired[pulumi.Input[_builtins.int]] + limit_floor_percent: NotRequired[pulumi.Input[_builtins.int]] limit_multiplier: NotRequired[pulumi.Input[_builtins.float]] """ Multiplier applied to the request to derive the resource limit. Example: 1.5. """ + limit_use_rss: NotRequired[pulumi.Input[_builtins.bool]] limits_adjustment_enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Whether to also adjust resource limits alongside requests. Example: true. @@ -3109,6 +3136,7 @@ class ResourceRuleConfigArgsArgsDict(TypedDict): """ Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. """ + request_use_rss: NotRequired[pulumi.Input[_builtins.bool]] target_percentile: NotRequired[pulumi.Input[_builtins.float]] """ Percentile of usage data used as the recommendation target (0-1). Example: 0.95. @@ -3117,14 +3145,22 @@ class ResourceRuleConfigArgsArgsDict(TypedDict): @pulumi.input_type class ResourceRuleConfigArgsArgs: def __init__(__self__, *, + ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, + floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + initial_limit: Optional[pulumi.Input[_builtins.int]] = None, + initial_request: Optional[pulumi.Input[_builtins.int]] = None, + limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, limit_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + limit_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, limits_adjustment_enabled: Optional[pulumi.Input[_builtins.bool]] = None, limits_removal_enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_request: Optional[pulumi.Input[_builtins.int]] = None, max_scale_down_percent: Optional[pulumi.Input[_builtins.float]] = None, max_scale_up_percent: Optional[pulumi.Input[_builtins.float]] = None, min_request: Optional[pulumi.Input[_builtins.int]] = None, + request_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, target_percentile: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] enabled: Enable this resource axis rule. Example: true. @@ -3137,10 +3173,24 @@ def __init__(__self__, *, :param pulumi.Input[_builtins.int] min_request: Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. :param pulumi.Input[_builtins.float] target_percentile: Percentile of usage data used as the recommendation target (0-1). Example: 0.95. """ + if ceiling_percent is not None: + pulumi.set(__self__, "ceiling_percent", ceiling_percent) if enabled is not None: pulumi.set(__self__, "enabled", enabled) + if floor_percent is not None: + pulumi.set(__self__, "floor_percent", floor_percent) + if initial_limit is not None: + pulumi.set(__self__, "initial_limit", initial_limit) + if initial_request is not None: + pulumi.set(__self__, "initial_request", initial_request) + if limit_ceiling_percent is not None: + pulumi.set(__self__, "limit_ceiling_percent", limit_ceiling_percent) + if limit_floor_percent is not None: + pulumi.set(__self__, "limit_floor_percent", limit_floor_percent) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -3153,9 +3203,20 @@ def __init__(__self__, *, pulumi.set(__self__, "max_scale_up_percent", max_scale_up_percent) if min_request is not None: pulumi.set(__self__, "min_request", min_request) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) + @_builtins.property + @pulumi.getter(name="ceilingPercent") + def ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "ceiling_percent") + + @ceiling_percent.setter + def ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "ceiling_percent", value) + @_builtins.property @pulumi.getter def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3168,6 +3229,51 @@ def enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: def enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): pulumi.set(self, "enabled", value) + @_builtins.property + @pulumi.getter(name="floorPercent") + def floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "floor_percent") + + @floor_percent.setter + def floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "floor_percent", value) + + @_builtins.property + @pulumi.getter(name="initialLimit") + def initial_limit(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "initial_limit") + + @initial_limit.setter + def initial_limit(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "initial_limit", value) + + @_builtins.property + @pulumi.getter(name="initialRequest") + def initial_request(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "initial_request") + + @initial_request.setter + def initial_request(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "initial_request", value) + + @_builtins.property + @pulumi.getter(name="limitCeilingPercent") + def limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "limit_ceiling_percent") + + @limit_ceiling_percent.setter + def limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="limitFloorPercent") + def limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "limit_floor_percent") + + @limit_floor_percent.setter + def limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="limitMultiplier") def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3180,6 +3286,15 @@ def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def limit_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "limit_multiplier", value) + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "limit_use_rss") + + @limit_use_rss.setter + def limit_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "limit_use_rss", value) + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3252,6 +3367,15 @@ def min_request(self) -> Optional[pulumi.Input[_builtins.int]]: def min_request(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_request", value) + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "request_use_rss") + + @request_use_rss.setter + def request_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "request_use_rss", value) + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3463,6 +3587,7 @@ class VerticalScalingArgsArgsDict(TypedDict): """ Multiplier applied to the request to derive the resource limit. Example: 1.5 sets limit to 150% of request. """ + limit_use_rss: NotRequired[pulumi.Input[_builtins.bool]] limits_adjustment_enabled: NotRequired[pulumi.Input[_builtins.bool]] """ Whether to also adjust resource limits alongside requests. Example: true. @@ -3495,6 +3620,7 @@ class VerticalScalingArgsArgsDict(TypedDict): """ Multiplier applied on top of the recommendation to add headroom. Example: 1.15 adds 15% overhead. """ + request_use_rss: NotRequired[pulumi.Input[_builtins.bool]] target_percentile: NotRequired[pulumi.Input[_builtins.float]] """ Percentile of usage data used as the recommendation target (0-1). Example: 0.95 targets the 95th percentile. @@ -3506,6 +3632,7 @@ def __init__(__self__, *, adjust_req_even_if_not_set: Optional[pulumi.Input[_builtins.bool]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, limit_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + limit_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, limits_adjustment_enabled: Optional[pulumi.Input[_builtins.bool]] = None, limits_removal_enabled: Optional[pulumi.Input[_builtins.bool]] = None, max_request: Optional[pulumi.Input[_builtins.int]] = None, @@ -3514,6 +3641,7 @@ def __init__(__self__, *, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_request: Optional[pulumi.Input[_builtins.int]] = None, overhead_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + request_use_rss: Optional[pulumi.Input[_builtins.bool]] = None, target_percentile: Optional[pulumi.Input[_builtins.float]] = None): """ :param pulumi.Input[_builtins.bool] adjust_req_even_if_not_set: Recommend requests even when the workload has no existing requests set. Default: false. @@ -3535,6 +3663,8 @@ def __init__(__self__, *, pulumi.set(__self__, "enabled", enabled) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -3557,6 +3687,8 @@ def __init__(__self__, *, pulumi.set(__self__, "min_request", min_request) if overhead_multiplier is not None: pulumi.set(__self__, "overhead_multiplier", overhead_multiplier) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) @@ -3596,6 +3728,15 @@ def limit_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def limit_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "limit_multiplier", value) + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "limit_use_rss") + + @limit_use_rss.setter + def limit_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "limit_use_rss", value) + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -3692,6 +3833,15 @@ def overhead_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: def overhead_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "overhead_multiplier", value) + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "request_use_rss") + + @request_use_rss.setter + def request_use_rss(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "request_use_rss", value) + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -3705,3 +3855,49 @@ def target_percentile(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "target_percentile", value) +class ZonalShiftConfigArgsArgsDict(TypedDict): + allow_zone_fallback: NotRequired[pulumi.Input[_builtins.bool]] + evict_impacted_nodes: NotRequired[pulumi.Input[_builtins.bool]] + respect_zonal_shift: NotRequired[pulumi.Input[_builtins.bool]] + +@pulumi.input_type +class ZonalShiftConfigArgsArgs: + def __init__(__self__, *, + allow_zone_fallback: Optional[pulumi.Input[_builtins.bool]] = None, + evict_impacted_nodes: Optional[pulumi.Input[_builtins.bool]] = None, + respect_zonal_shift: Optional[pulumi.Input[_builtins.bool]] = None): + if allow_zone_fallback is not None: + pulumi.set(__self__, "allow_zone_fallback", allow_zone_fallback) + if evict_impacted_nodes is not None: + pulumi.set(__self__, "evict_impacted_nodes", evict_impacted_nodes) + if respect_zonal_shift is not None: + pulumi.set(__self__, "respect_zonal_shift", respect_zonal_shift) + + @_builtins.property + @pulumi.getter(name="allowZoneFallback") + def allow_zone_fallback(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "allow_zone_fallback") + + @allow_zone_fallback.setter + def allow_zone_fallback(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "allow_zone_fallback", value) + + @_builtins.property + @pulumi.getter(name="evictImpactedNodes") + def evict_impacted_nodes(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "evict_impacted_nodes") + + @evict_impacted_nodes.setter + def evict_impacted_nodes(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "evict_impacted_nodes", value) + + @_builtins.property + @pulumi.getter(name="respectZonalShift") + def respect_zonal_shift(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "respect_zonal_shift") + + @respect_zonal_shift.setter + def respect_zonal_shift(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "respect_zonal_shift", value) + + diff --git a/sdk/python/pulumi_devzero/resources/node_policy.py b/sdk/python/pulumi_devzero/resources/node_policy.py index b99148f..ca6d5a0 100644 --- a/sdk/python/pulumi_devzero/resources/node_policy.py +++ b/sdk/python/pulumi_devzero/resources/node_policy.py @@ -26,6 +26,7 @@ def __init__(__self__, *, aws: Optional[pulumi.Input['AWSNodeClassSpecArgsArgs']] = None, azure: Optional[pulumi.Input['AzureNodeClassSpecArgsArgs']] = None, capacity_types: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input['DisruptionPolicyArgsArgs']] = None, instance_categories: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, @@ -33,16 +34,20 @@ def __init__(__self__, *, instance_families: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_generations: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_hypervisors: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, + instance_local_nvme: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_sizes: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, instance_types: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input['ResourceLimitsArgsArgs']] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecArgsArgs']]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input['ZonalShiftConfigArgsArgs']] = None, zones: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None): """ The set of arguments for constructing a NodePolicy resource. @@ -56,6 +61,8 @@ def __init__(__self__, *, pulumi.set(__self__, "azure", azure) if capacity_types is not None: pulumi.set(__self__, "capacity_types", capacity_types) + if cloud_provider_id is not None: + pulumi.set(__self__, "cloud_provider_id", cloud_provider_id) if description is not None: pulumi.set(__self__, "description", description) if disruption is not None: @@ -70,6 +77,8 @@ def __init__(__self__, *, pulumi.set(__self__, "instance_generations", instance_generations) if instance_hypervisors is not None: pulumi.set(__self__, "instance_hypervisors", instance_hypervisors) + if instance_local_nvme is not None: + pulumi.set(__self__, "instance_local_nvme", instance_local_nvme) if instance_sizes is not None: pulumi.set(__self__, "instance_sizes", instance_sizes) if instance_types is not None: @@ -78,6 +87,8 @@ def __init__(__self__, *, pulumi.set(__self__, "labels", labels) if limits is not None: pulumi.set(__self__, "limits", limits) + if master_override_role_name is not None: + pulumi.set(__self__, "master_override_role_name", master_override_role_name) if node_class_name is not None: pulumi.set(__self__, "node_class_name", node_class_name) if node_pool_name is not None: @@ -86,10 +97,14 @@ def __init__(__self__, *, pulumi.set(__self__, "operating_systems", operating_systems) if raw is not None: pulumi.set(__self__, "raw", raw) + if startup_taints is not None: + pulumi.set(__self__, "startup_taints", startup_taints) if taints is not None: pulumi.set(__self__, "taints", taints) if weight is not None: pulumi.set(__self__, "weight", weight) + if zonal_shift is not None: + pulumi.set(__self__, "zonal_shift", zonal_shift) if zones is not None: pulumi.set(__self__, "zones", zones) @@ -138,6 +153,15 @@ def capacity_types(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: def capacity_types(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): pulumi.set(self, "capacity_types", value) + @_builtins.property + @pulumi.getter(name="cloudProviderId") + def cloud_provider_id(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cloud_provider_id") + + @cloud_provider_id.setter + def cloud_provider_id(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cloud_provider_id", value) + @_builtins.property @pulumi.getter def description(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -201,6 +225,15 @@ def instance_hypervisors(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs'] def instance_hypervisors(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): pulumi.set(self, "instance_hypervisors", value) + @_builtins.property + @pulumi.getter(name="instanceLocalNvme") + def instance_local_nvme(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: + return pulumi.get(self, "instance_local_nvme") + + @instance_local_nvme.setter + def instance_local_nvme(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): + pulumi.set(self, "instance_local_nvme", value) + @_builtins.property @pulumi.getter(name="instanceSizes") def instance_sizes(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -237,6 +270,15 @@ def limits(self) -> Optional[pulumi.Input['ResourceLimitsArgsArgs']]: def limits(self, value: Optional[pulumi.Input['ResourceLimitsArgsArgs']]): pulumi.set(self, "limits", value) + @_builtins.property + @pulumi.getter(name="masterOverrideRoleName") + def master_override_role_name(self) -> Optional[pulumi.Input[_builtins.str]]: + return pulumi.get(self, "master_override_role_name") + + @master_override_role_name.setter + def master_override_role_name(self, value: Optional[pulumi.Input[_builtins.str]]): + pulumi.set(self, "master_override_role_name", value) + @_builtins.property @pulumi.getter(name="nodeClassName") def node_class_name(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -273,6 +315,15 @@ def raw(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecAr def raw(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['RawKarpenterSpecArgsArgs']]]]): pulumi.set(self, "raw", value) + @_builtins.property + @pulumi.getter(name="startupTaints") + def startup_taints(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]: + return pulumi.get(self, "startup_taints") + + @startup_taints.setter + def startup_taints(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]): + pulumi.set(self, "startup_taints", value) + @_builtins.property @pulumi.getter def taints(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['TaintArgsArgs']]]]: @@ -291,6 +342,15 @@ def weight(self) -> Optional[pulumi.Input[_builtins.int]]: def weight(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "weight", value) + @_builtins.property + @pulumi.getter(name="zonalShift") + def zonal_shift(self) -> Optional[pulumi.Input['ZonalShiftConfigArgsArgs']]: + return pulumi.get(self, "zonal_shift") + + @zonal_shift.setter + def zonal_shift(self, value: Optional[pulumi.Input['ZonalShiftConfigArgsArgs']]): + pulumi.set(self, "zonal_shift", value) + @_builtins.property @pulumi.getter def zones(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -311,6 +371,7 @@ def __init__(__self__, aws: Optional[pulumi.Input[Union['AWSNodeClassSpecArgsArgs', 'AWSNodeClassSpecArgsArgsDict']]] = None, azure: Optional[pulumi.Input[Union['AzureNodeClassSpecArgsArgs', 'AzureNodeClassSpecArgsArgsDict']]] = None, capacity_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input[Union['DisruptionPolicyArgsArgs', 'DisruptionPolicyArgsArgsDict']]] = None, instance_categories: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, @@ -318,17 +379,21 @@ def __init__(__self__, instance_families: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_generations: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_hypervisors: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + instance_local_nvme: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_sizes: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input[Union['ResourceLimitsArgsArgs', 'ResourceLimitsArgsArgsDict']]] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input[Union['RawKarpenterSpecArgsArgs', 'RawKarpenterSpecArgsArgsDict']]]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input[Union['ZonalShiftConfigArgsArgs', 'ZonalShiftConfigArgsArgsDict']]] = None, zones: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): """ @@ -365,6 +430,7 @@ def _internal_init(__self__, aws: Optional[pulumi.Input[Union['AWSNodeClassSpecArgsArgs', 'AWSNodeClassSpecArgsArgsDict']]] = None, azure: Optional[pulumi.Input[Union['AzureNodeClassSpecArgsArgs', 'AzureNodeClassSpecArgsArgsDict']]] = None, capacity_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + cloud_provider_id: Optional[pulumi.Input[_builtins.int]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, disruption: Optional[pulumi.Input[Union['DisruptionPolicyArgsArgs', 'DisruptionPolicyArgsArgsDict']]] = None, instance_categories: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, @@ -372,17 +438,21 @@ def _internal_init(__self__, instance_families: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_generations: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_hypervisors: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, + instance_local_nvme: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_sizes: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, instance_types: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[_builtins.str]]]] = None, limits: Optional[pulumi.Input[Union['ResourceLimitsArgsArgs', 'ResourceLimitsArgsArgsDict']]] = None, + master_override_role_name: Optional[pulumi.Input[_builtins.str]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, node_class_name: Optional[pulumi.Input[_builtins.str]] = None, node_pool_name: Optional[pulumi.Input[_builtins.str]] = None, operating_systems: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, raw: Optional[pulumi.Input[Sequence[pulumi.Input[Union['RawKarpenterSpecArgsArgs', 'RawKarpenterSpecArgsArgsDict']]]]] = None, + startup_taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, taints: Optional[pulumi.Input[Sequence[pulumi.Input[Union['TaintArgsArgs', 'TaintArgsArgsDict']]]]] = None, weight: Optional[pulumi.Input[_builtins.int]] = None, + zonal_shift: Optional[pulumi.Input[Union['ZonalShiftConfigArgsArgs', 'ZonalShiftConfigArgsArgsDict']]] = None, zones: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) @@ -397,6 +467,7 @@ def _internal_init(__self__, __props__.__dict__["aws"] = aws __props__.__dict__["azure"] = azure __props__.__dict__["capacity_types"] = capacity_types + __props__.__dict__["cloud_provider_id"] = cloud_provider_id __props__.__dict__["description"] = description __props__.__dict__["disruption"] = disruption __props__.__dict__["instance_categories"] = instance_categories @@ -404,10 +475,12 @@ def _internal_init(__self__, __props__.__dict__["instance_families"] = instance_families __props__.__dict__["instance_generations"] = instance_generations __props__.__dict__["instance_hypervisors"] = instance_hypervisors + __props__.__dict__["instance_local_nvme"] = instance_local_nvme __props__.__dict__["instance_sizes"] = instance_sizes __props__.__dict__["instance_types"] = instance_types __props__.__dict__["labels"] = labels __props__.__dict__["limits"] = limits + __props__.__dict__["master_override_role_name"] = master_override_role_name if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name @@ -415,8 +488,10 @@ def _internal_init(__self__, __props__.__dict__["node_pool_name"] = node_pool_name __props__.__dict__["operating_systems"] = operating_systems __props__.__dict__["raw"] = raw + __props__.__dict__["startup_taints"] = startup_taints __props__.__dict__["taints"] = taints __props__.__dict__["weight"] = weight + __props__.__dict__["zonal_shift"] = zonal_shift __props__.__dict__["zones"] = zones super(NodePolicy, __self__).__init__( 'devzero:resources:NodePolicy', @@ -444,6 +519,7 @@ def get(resource_name: str, __props__.__dict__["aws"] = None __props__.__dict__["azure"] = None __props__.__dict__["capacity_types"] = None + __props__.__dict__["cloud_provider_id"] = None __props__.__dict__["description"] = None __props__.__dict__["disruption"] = None __props__.__dict__["instance_categories"] = None @@ -451,17 +527,21 @@ def get(resource_name: str, __props__.__dict__["instance_families"] = None __props__.__dict__["instance_generations"] = None __props__.__dict__["instance_hypervisors"] = None + __props__.__dict__["instance_local_nvme"] = None __props__.__dict__["instance_sizes"] = None __props__.__dict__["instance_types"] = None __props__.__dict__["labels"] = None __props__.__dict__["limits"] = None + __props__.__dict__["master_override_role_name"] = None __props__.__dict__["name"] = None __props__.__dict__["node_class_name"] = None __props__.__dict__["node_pool_name"] = None __props__.__dict__["operating_systems"] = None __props__.__dict__["raw"] = None + __props__.__dict__["startup_taints"] = None __props__.__dict__["taints"] = None __props__.__dict__["weight"] = None + __props__.__dict__["zonal_shift"] = None __props__.__dict__["zones"] = None return NodePolicy(resource_name, opts=opts, __props__=__props__) @@ -497,6 +577,11 @@ def capacity_types(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']] """ return pulumi.get(self, "capacity_types") + @_builtins.property + @pulumi.getter(name="cloudProviderId") + def cloud_provider_id(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cloud_provider_id") + @_builtins.property @pulumi.getter def description(self) -> pulumi.Output[Optional[_builtins.str]]: @@ -553,6 +638,11 @@ def instance_hypervisors(self) -> pulumi.Output[Optional['outputs.LabelSelectorA """ return pulumi.get(self, "instance_hypervisors") + @_builtins.property + @pulumi.getter(name="instanceLocalNvme") + def instance_local_nvme(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: + return pulumi.get(self, "instance_local_nvme") + @_builtins.property @pulumi.getter(name="instanceSizes") def instance_sizes(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: @@ -585,6 +675,11 @@ def limits(self) -> pulumi.Output[Optional['outputs.ResourceLimitsArgs']]: """ return pulumi.get(self, "limits") + @_builtins.property + @pulumi.getter(name="masterOverrideRoleName") + def master_override_role_name(self) -> pulumi.Output[Optional[_builtins.str]]: + return pulumi.get(self, "master_override_role_name") + @_builtins.property @pulumi.getter def name(self) -> pulumi.Output[_builtins.str]: @@ -625,6 +720,11 @@ def raw(self) -> pulumi.Output[Optional[Sequence['outputs.RawKarpenterSpecArgs'] """ return pulumi.get(self, "raw") + @_builtins.property + @pulumi.getter(name="startupTaints") + def startup_taints(self) -> pulumi.Output[Optional[Sequence['outputs.TaintArgs']]]: + return pulumi.get(self, "startup_taints") + @_builtins.property @pulumi.getter def taints(self) -> pulumi.Output[Optional[Sequence['outputs.TaintArgs']]]: @@ -641,6 +741,11 @@ def weight(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "weight") + @_builtins.property + @pulumi.getter(name="zonalShift") + def zonal_shift(self) -> pulumi.Output[Optional['outputs.ZonalShiftConfigArgs']]: + return pulumi.get(self, "zonal_shift") + @_builtins.property @pulumi.getter def zones(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: diff --git a/sdk/python/pulumi_devzero/resources/node_policy_target.py b/sdk/python/pulumi_devzero/resources/node_policy_target.py index 2584889..87d921d 100644 --- a/sdk/python/pulumi_devzero/resources/node_policy_target.py +++ b/sdk/python/pulumi_devzero/resources/node_policy_target.py @@ -181,7 +181,7 @@ def get(resource_name: str, @pulumi.getter(name="clusterIds") def cluster_ids(self) -> pulumi.Output[Sequence[_builtins.str]]: """ - Cluster IDs where this node policy applies. + Cluster ID where this node policy applies. The API accepts at most one cluster per target; create one target per cluster. """ return pulumi.get(self, "cluster_ids") diff --git a/sdk/python/pulumi_devzero/resources/outputs.py b/sdk/python/pulumi_devzero/resources/outputs.py index 3127543..1841343 100644 --- a/sdk/python/pulumi_devzero/resources/outputs.py +++ b/sdk/python/pulumi_devzero/resources/outputs.py @@ -46,6 +46,7 @@ 'SubnetSelectorTermArgs', 'TaintArgs', 'VerticalScalingArgs', + 'ZonalShiftConfigArgs', ] @pulumi.output_type @@ -553,6 +554,8 @@ def __key_warning(key: str): suggest = "fips_mode" elif key == "imageFamily": suggest = "image_family" + elif key == "imageVersion": + suggest = "image_version" elif key == "maxPods": suggest = "max_pods" elif key == "osDiskSizeGb": @@ -574,6 +577,7 @@ def get(self, key: str, default = None) -> Any: def __init__(__self__, *, fips_mode: Optional[_builtins.str] = None, image_family: Optional[_builtins.str] = None, + image_version: Optional[_builtins.str] = None, kubelet: Optional['outputs.AzureKubeletConfigurationArgs'] = None, max_pods: Optional[_builtins.int] = None, os_disk_size_gb: Optional[_builtins.int] = None, @@ -592,6 +596,8 @@ def __init__(__self__, *, pulumi.set(__self__, "fips_mode", fips_mode) if image_family is not None: pulumi.set(__self__, "image_family", image_family) + if image_version is not None: + pulumi.set(__self__, "image_version", image_version) if kubelet is not None: pulumi.set(__self__, "kubelet", kubelet) if max_pods is not None: @@ -619,6 +625,11 @@ def image_family(self) -> Optional[_builtins.str]: """ return pulumi.get(self, "image_family") + @_builtins.property + @pulumi.getter(name="imageVersion") + def image_version(self) -> Optional[_builtins.str]: + return pulumi.get(self, "image_version") + @_builtins.property @pulumi.getter def kubelet(self) -> Optional['outputs.AzureKubeletConfigurationArgs']: @@ -1394,7 +1405,9 @@ class HPAMetricTriggerArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "serverAddress": + if key == "connectorId": + suggest = "connector_id" + elif key == "serverAddress": suggest = "server_address" elif key == "targetUtilization": suggest = "target_utilization" @@ -1414,6 +1427,7 @@ def get(self, key: str, default = None) -> Any: def __init__(__self__, *, type: _builtins.str, + connector_id: Optional[_builtins.str] = None, metadata: Optional[Mapping[str, _builtins.str]] = None, query: Optional[_builtins.str] = None, server_address: Optional[_builtins.str] = None, @@ -1430,6 +1444,8 @@ def __init__(__self__, *, :param _builtins.str weight: Weight for composite formula scaling (0-1 decimal string). Example: '0.5'. """ pulumi.set(__self__, "type", type) + if connector_id is not None: + pulumi.set(__self__, "connector_id", connector_id) if metadata is not None: pulumi.set(__self__, "metadata", metadata) if query is not None: @@ -1451,6 +1467,11 @@ def type(self) -> _builtins.str: """ return pulumi.get(self, "type") + @_builtins.property + @pulumi.getter(name="connectorId") + def connector_id(self) -> Optional[_builtins.str]: + return pulumi.get(self, "connector_id") + @_builtins.property @pulumi.getter def metadata(self) -> Optional[Mapping[str, _builtins.str]]: @@ -1513,14 +1534,8 @@ def __key_warning(key: str): suggest = "max_replicas" elif key == "minReplicas": suggest = "min_replicas" - elif key == "primaryMetric": - suggest = "primary_metric" elif key == "scaleDownCooldownSeconds": suggest = "scale_down_cooldown_seconds" - elif key == "targetMemoryUtilization": - suggest = "target_memory_utilization" - elif key == "targetUtilization": - suggest = "target_utilization" if suggest: pulumi.log.warn(f"Key '{key}' not found in HPARuleConfigArgs. Access the value via the '{suggest}' property getter instead.") @@ -1542,10 +1557,7 @@ def __init__(__self__, *, max_replicas: Optional[_builtins.int] = None, metrics: Optional[Sequence['outputs.HPAMetricTriggerArgs']] = None, min_replicas: Optional[_builtins.int] = None, - primary_metric: Optional[_builtins.str] = None, - scale_down_cooldown_seconds: Optional[_builtins.int] = None, - target_memory_utilization: Optional[_builtins.float] = None, - target_utilization: Optional[_builtins.float] = None): + scale_down_cooldown_seconds: Optional[_builtins.int] = None): """ :param 'HPABehaviorArgs' behavior: Fine-grained scale-up and scale-down behavior policies. :param _builtins.str composite_formula: Formula combining multiple metric weights into a single scaling signal. Example: '0.6*cpu + 0.4*memory'. @@ -1553,12 +1565,9 @@ def __init__(__self__, *, :param 'HPAFallbackArgs' fallback: Replica fallback configuration when metrics are unavailable. :param _builtins.float max_replica_change_percent: Maximum percentage change in replica count per cycle. Example: 50.0. :param _builtins.int max_replicas: Maximum number of replicas. Example: 10. - :param Sequence['HPAMetricTriggerArgs'] metrics: Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + :param Sequence['HPAMetricTriggerArgs'] metrics: HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. :param _builtins.int min_replicas: Minimum number of replicas. Example: 2. - :param _builtins.str primary_metric: Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param _builtins.int scale_down_cooldown_seconds: Seconds to wait between scale-down events. Example: 300. - :param _builtins.float target_memory_utilization: Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - :param _builtins.float target_utilization: Target CPU utilization ratio (0-1). Example: 0.7. """ if behavior is not None: pulumi.set(__self__, "behavior", behavior) @@ -1576,14 +1585,8 @@ def __init__(__self__, *, pulumi.set(__self__, "metrics", metrics) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) - if primary_metric is not None: - pulumi.set(__self__, "primary_metric", primary_metric) if scale_down_cooldown_seconds is not None: pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) - if target_memory_utilization is not None: - pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) - if target_utilization is not None: - pulumi.set(__self__, "target_utilization", target_utilization) @_builtins.property @pulumi.getter @@ -1637,7 +1640,7 @@ def max_replicas(self) -> Optional[_builtins.int]: @pulumi.getter def metrics(self) -> Optional[Sequence['outputs.HPAMetricTriggerArgs']]: """ - Additional metric triggers (e.g. Prometheus). CPU/Memory/Network triggers are auto-generated from primaryMetric — do not redeclare them here. + HPA metric triggers (CPU, Memory, Network*, or external such as prometheus/kafka). Replaces the removed targetUtilization/primaryMetric fields. """ return pulumi.get(self, "metrics") @@ -1649,14 +1652,6 @@ def min_replicas(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_replicas") - @_builtins.property - @pulumi.getter(name="primaryMetric") - def primary_metric(self) -> Optional[_builtins.str]: - """ - Primary metric driving HPA. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. - """ - return pulumi.get(self, "primary_metric") - @_builtins.property @pulumi.getter(name="scaleDownCooldownSeconds") def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: @@ -1665,22 +1660,6 @@ def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "scale_down_cooldown_seconds") - @_builtins.property - @pulumi.getter(name="targetMemoryUtilization") - def target_memory_utilization(self) -> Optional[_builtins.float]: - """ - Target memory utilization ratio (0-1), tuned independently of CPU. Example: 0.8. - """ - return pulumi.get(self, "target_memory_utilization") - - @_builtins.property - @pulumi.getter(name="targetUtilization") - def target_utilization(self) -> Optional[_builtins.float]: - """ - Target CPU utilization ratio (0-1). Example: 0.7. - """ - return pulumi.get(self, "target_utilization") - @pulumi.output_type class HPAScalingPolicyArgs(dict): @@ -1806,7 +1785,9 @@ class HorizontalScalingArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "maxReplicaChangePercent": + if key == "compositeFormula": + suggest = "composite_formula" + elif key == "maxReplicaChangePercent": suggest = "max_replica_change_percent" elif key == "maxReplicas": suggest = "max_replicas" @@ -1814,8 +1795,14 @@ def __key_warning(key: str): suggest = "min_data_points" elif key == "minReplicas": suggest = "min_replicas" + elif key == "networkTargetThroughputBytesPerSec": + suggest = "network_target_throughput_bytes_per_sec" elif key == "primaryMetric": suggest = "primary_metric" + elif key == "scaleDownCooldownSeconds": + suggest = "scale_down_cooldown_seconds" + elif key == "targetMemoryUtilization": + suggest = "target_memory_utilization" elif key == "targetUtilization": suggest = "target_utilization" @@ -1831,12 +1818,16 @@ def get(self, key: str, default = None) -> Any: return super().get(key, default) def __init__(__self__, *, + composite_formula: Optional[_builtins.str] = None, enabled: Optional[_builtins.bool] = None, max_replica_change_percent: Optional[_builtins.float] = None, max_replicas: Optional[_builtins.int] = None, min_data_points: Optional[_builtins.int] = None, min_replicas: Optional[_builtins.int] = None, + network_target_throughput_bytes_per_sec: Optional[_builtins.int] = None, primary_metric: Optional[_builtins.str] = None, + scale_down_cooldown_seconds: Optional[_builtins.int] = None, + target_memory_utilization: Optional[_builtins.float] = None, target_utilization: Optional[_builtins.float] = None): """ :param _builtins.bool enabled: Enable horizontal (replica) scaling. Example: true. @@ -1847,6 +1838,8 @@ def __init__(__self__, *, :param _builtins.str primary_metric: Primary metric for HPA decisions. One of: 'cpu', 'memory', 'gpu', 'network_ingress', 'network_egress'. Example: 'cpu'. :param _builtins.float target_utilization: Target utilization ratio (0-1) for the primary metric. Example: 0.7 targets 70% utilization. """ + if composite_formula is not None: + pulumi.set(__self__, "composite_formula", composite_formula) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if max_replica_change_percent is not None: @@ -1857,11 +1850,22 @@ def __init__(__self__, *, pulumi.set(__self__, "min_data_points", min_data_points) if min_replicas is not None: pulumi.set(__self__, "min_replicas", min_replicas) + if network_target_throughput_bytes_per_sec is not None: + pulumi.set(__self__, "network_target_throughput_bytes_per_sec", network_target_throughput_bytes_per_sec) if primary_metric is not None: pulumi.set(__self__, "primary_metric", primary_metric) + if scale_down_cooldown_seconds is not None: + pulumi.set(__self__, "scale_down_cooldown_seconds", scale_down_cooldown_seconds) + if target_memory_utilization is not None: + pulumi.set(__self__, "target_memory_utilization", target_memory_utilization) if target_utilization is not None: pulumi.set(__self__, "target_utilization", target_utilization) + @_builtins.property + @pulumi.getter(name="compositeFormula") + def composite_formula(self) -> Optional[_builtins.str]: + return pulumi.get(self, "composite_formula") + @_builtins.property @pulumi.getter def enabled(self) -> Optional[_builtins.bool]: @@ -1902,6 +1906,11 @@ def min_replicas(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_replicas") + @_builtins.property + @pulumi.getter(name="networkTargetThroughputBytesPerSec") + def network_target_throughput_bytes_per_sec(self) -> Optional[_builtins.int]: + return pulumi.get(self, "network_target_throughput_bytes_per_sec") + @_builtins.property @pulumi.getter(name="primaryMetric") def primary_metric(self) -> Optional[_builtins.str]: @@ -1910,6 +1919,16 @@ def primary_metric(self) -> Optional[_builtins.str]: """ return pulumi.get(self, "primary_metric") + @_builtins.property + @pulumi.getter(name="scaleDownCooldownSeconds") + def scale_down_cooldown_seconds(self) -> Optional[_builtins.int]: + return pulumi.get(self, "scale_down_cooldown_seconds") + + @_builtins.property + @pulumi.getter(name="targetMemoryUtilization") + def target_memory_utilization(self) -> Optional[_builtins.float]: + return pulumi.get(self, "target_memory_utilization") + @_builtins.property @pulumi.getter(name="targetUtilization") def target_utilization(self) -> Optional[_builtins.float]: @@ -2397,8 +2416,22 @@ class ResourceRuleConfigArgs(dict): @staticmethod def __key_warning(key: str): suggest = None - if key == "limitMultiplier": + if key == "ceilingPercent": + suggest = "ceiling_percent" + elif key == "floorPercent": + suggest = "floor_percent" + elif key == "initialLimit": + suggest = "initial_limit" + elif key == "initialRequest": + suggest = "initial_request" + elif key == "limitCeilingPercent": + suggest = "limit_ceiling_percent" + elif key == "limitFloorPercent": + suggest = "limit_floor_percent" + elif key == "limitMultiplier": suggest = "limit_multiplier" + elif key == "limitUseRss": + suggest = "limit_use_rss" elif key == "limitsAdjustmentEnabled": suggest = "limits_adjustment_enabled" elif key == "limitsRemovalEnabled": @@ -2411,6 +2444,8 @@ def __key_warning(key: str): suggest = "max_scale_up_percent" elif key == "minRequest": suggest = "min_request" + elif key == "requestUseRss": + suggest = "request_use_rss" elif key == "targetPercentile": suggest = "target_percentile" @@ -2426,14 +2461,22 @@ def get(self, key: str, default = None) -> Any: return super().get(key, default) def __init__(__self__, *, + ceiling_percent: Optional[_builtins.int] = None, enabled: Optional[_builtins.bool] = None, + floor_percent: Optional[_builtins.int] = None, + initial_limit: Optional[_builtins.int] = None, + initial_request: Optional[_builtins.int] = None, + limit_ceiling_percent: Optional[_builtins.int] = None, + limit_floor_percent: Optional[_builtins.int] = None, limit_multiplier: Optional[_builtins.float] = None, + limit_use_rss: Optional[_builtins.bool] = None, limits_adjustment_enabled: Optional[_builtins.bool] = None, limits_removal_enabled: Optional[_builtins.bool] = None, max_request: Optional[_builtins.int] = None, max_scale_down_percent: Optional[_builtins.float] = None, max_scale_up_percent: Optional[_builtins.float] = None, min_request: Optional[_builtins.int] = None, + request_use_rss: Optional[_builtins.bool] = None, target_percentile: Optional[_builtins.float] = None): """ :param _builtins.bool enabled: Enable this resource axis rule. Example: true. @@ -2446,10 +2489,24 @@ def __init__(__self__, *, :param _builtins.int min_request: Minimum resource request (millicores for CPU, bytes for memory/GPU). Example: 100. :param _builtins.float target_percentile: Percentile of usage data used as the recommendation target (0-1). Example: 0.95. """ + if ceiling_percent is not None: + pulumi.set(__self__, "ceiling_percent", ceiling_percent) if enabled is not None: pulumi.set(__self__, "enabled", enabled) + if floor_percent is not None: + pulumi.set(__self__, "floor_percent", floor_percent) + if initial_limit is not None: + pulumi.set(__self__, "initial_limit", initial_limit) + if initial_request is not None: + pulumi.set(__self__, "initial_request", initial_request) + if limit_ceiling_percent is not None: + pulumi.set(__self__, "limit_ceiling_percent", limit_ceiling_percent) + if limit_floor_percent is not None: + pulumi.set(__self__, "limit_floor_percent", limit_floor_percent) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -2462,9 +2519,16 @@ def __init__(__self__, *, pulumi.set(__self__, "max_scale_up_percent", max_scale_up_percent) if min_request is not None: pulumi.set(__self__, "min_request", min_request) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) + @_builtins.property + @pulumi.getter(name="ceilingPercent") + def ceiling_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "ceiling_percent") + @_builtins.property @pulumi.getter def enabled(self) -> Optional[_builtins.bool]: @@ -2473,6 +2537,31 @@ def enabled(self) -> Optional[_builtins.bool]: """ return pulumi.get(self, "enabled") + @_builtins.property + @pulumi.getter(name="floorPercent") + def floor_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "floor_percent") + + @_builtins.property + @pulumi.getter(name="initialLimit") + def initial_limit(self) -> Optional[_builtins.int]: + return pulumi.get(self, "initial_limit") + + @_builtins.property + @pulumi.getter(name="initialRequest") + def initial_request(self) -> Optional[_builtins.int]: + return pulumi.get(self, "initial_request") + + @_builtins.property + @pulumi.getter(name="limitCeilingPercent") + def limit_ceiling_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="limitFloorPercent") + def limit_floor_percent(self) -> Optional[_builtins.int]: + return pulumi.get(self, "limit_floor_percent") + @_builtins.property @pulumi.getter(name="limitMultiplier") def limit_multiplier(self) -> Optional[_builtins.float]: @@ -2481,6 +2570,11 @@ def limit_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "limit_multiplier") + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "limit_use_rss") + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[_builtins.bool]: @@ -2529,6 +2623,11 @@ def min_request(self) -> Optional[_builtins.int]: """ return pulumi.get(self, "min_request") + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "request_use_rss") + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[_builtins.float]: @@ -2662,6 +2761,8 @@ def __key_warning(key: str): suggest = "adjust_req_even_if_not_set" elif key == "limitMultiplier": suggest = "limit_multiplier" + elif key == "limitUseRss": + suggest = "limit_use_rss" elif key == "limitsAdjustmentEnabled": suggest = "limits_adjustment_enabled" elif key == "limitsRemovalEnabled": @@ -2678,6 +2779,8 @@ def __key_warning(key: str): suggest = "min_request" elif key == "overheadMultiplier": suggest = "overhead_multiplier" + elif key == "requestUseRss": + suggest = "request_use_rss" elif key == "targetPercentile": suggest = "target_percentile" @@ -2696,6 +2799,7 @@ def __init__(__self__, *, adjust_req_even_if_not_set: Optional[_builtins.bool] = None, enabled: Optional[_builtins.bool] = None, limit_multiplier: Optional[_builtins.float] = None, + limit_use_rss: Optional[_builtins.bool] = None, limits_adjustment_enabled: Optional[_builtins.bool] = None, limits_removal_enabled: Optional[_builtins.bool] = None, max_request: Optional[_builtins.int] = None, @@ -2704,6 +2808,7 @@ def __init__(__self__, *, min_data_points: Optional[_builtins.int] = None, min_request: Optional[_builtins.int] = None, overhead_multiplier: Optional[_builtins.float] = None, + request_use_rss: Optional[_builtins.bool] = None, target_percentile: Optional[_builtins.float] = None): """ :param _builtins.bool adjust_req_even_if_not_set: Recommend requests even when the workload has no existing requests set. Default: false. @@ -2725,6 +2830,8 @@ def __init__(__self__, *, pulumi.set(__self__, "enabled", enabled) if limit_multiplier is not None: pulumi.set(__self__, "limit_multiplier", limit_multiplier) + if limit_use_rss is not None: + pulumi.set(__self__, "limit_use_rss", limit_use_rss) if limits_adjustment_enabled is not None: pulumi.set(__self__, "limits_adjustment_enabled", limits_adjustment_enabled) if limits_removal_enabled is not None: @@ -2747,6 +2854,8 @@ def __init__(__self__, *, pulumi.set(__self__, "min_request", min_request) if overhead_multiplier is not None: pulumi.set(__self__, "overhead_multiplier", overhead_multiplier) + if request_use_rss is not None: + pulumi.set(__self__, "request_use_rss", request_use_rss) if target_percentile is not None: pulumi.set(__self__, "target_percentile", target_percentile) @@ -2774,6 +2883,11 @@ def limit_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "limit_multiplier") + @_builtins.property + @pulumi.getter(name="limitUseRss") + def limit_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "limit_use_rss") + @_builtins.property @pulumi.getter(name="limitsAdjustmentEnabled") def limits_adjustment_enabled(self) -> Optional[_builtins.bool]: @@ -2838,6 +2952,11 @@ def overhead_multiplier(self) -> Optional[_builtins.float]: """ return pulumi.get(self, "overhead_multiplier") + @_builtins.property + @pulumi.getter(name="requestUseRss") + def request_use_rss(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "request_use_rss") + @_builtins.property @pulumi.getter(name="targetPercentile") def target_percentile(self) -> Optional[_builtins.float]: @@ -2847,3 +2966,53 @@ def target_percentile(self) -> Optional[_builtins.float]: return pulumi.get(self, "target_percentile") +@pulumi.output_type +class ZonalShiftConfigArgs(dict): + @staticmethod + def __key_warning(key: str): + suggest = None + if key == "allowZoneFallback": + suggest = "allow_zone_fallback" + elif key == "evictImpactedNodes": + suggest = "evict_impacted_nodes" + elif key == "respectZonalShift": + suggest = "respect_zonal_shift" + + if suggest: + pulumi.log.warn(f"Key '{key}' not found in ZonalShiftConfigArgs. Access the value via the '{suggest}' property getter instead.") + + def __getitem__(self, key: str) -> Any: + ZonalShiftConfigArgs.__key_warning(key) + return super().__getitem__(key) + + def get(self, key: str, default = None) -> Any: + ZonalShiftConfigArgs.__key_warning(key) + return super().get(key, default) + + def __init__(__self__, *, + allow_zone_fallback: Optional[_builtins.bool] = None, + evict_impacted_nodes: Optional[_builtins.bool] = None, + respect_zonal_shift: Optional[_builtins.bool] = None): + if allow_zone_fallback is not None: + pulumi.set(__self__, "allow_zone_fallback", allow_zone_fallback) + if evict_impacted_nodes is not None: + pulumi.set(__self__, "evict_impacted_nodes", evict_impacted_nodes) + if respect_zonal_shift is not None: + pulumi.set(__self__, "respect_zonal_shift", respect_zonal_shift) + + @_builtins.property + @pulumi.getter(name="allowZoneFallback") + def allow_zone_fallback(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "allow_zone_fallback") + + @_builtins.property + @pulumi.getter(name="evictImpactedNodes") + def evict_impacted_nodes(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "evict_impacted_nodes") + + @_builtins.property + @pulumi.getter(name="respectZonalShift") + def respect_zonal_shift(self) -> Optional[_builtins.bool]: + return pulumi.get(self, "respect_zonal_shift") + + diff --git a/sdk/python/pulumi_devzero/resources/workload_policy.py b/sdk/python/pulumi_devzero/resources/workload_policy.py index c230fb2..839ff38 100644 --- a/sdk/python/pulumi_devzero/resources/workload_policy.py +++ b/sdk/python/pulumi_devzero/resources/workload_policy.py @@ -23,24 +23,44 @@ class WorkloadPolicyArgs: def __init__(__self__, *, name: pulumi.Input[_builtins.str], action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, horizontal_scaling: Optional[pulumi.Input['HorizontalScalingArgsArgs']] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input['VerticalScalingArgsArgs']] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -73,10 +93,20 @@ def __init__(__self__, *, pulumi.set(__self__, "name", name) if action_triggers is not None: pulumi.set(__self__, "action_triggers", action_triggers) + if allow_in_place_memory_limit_decrease is not None: + pulumi.set(__self__, "allow_in_place_memory_limit_decrease", allow_in_place_memory_limit_decrease) if cooldown_minutes is None: cooldown_minutes = 300 if cooldown_minutes is not None: pulumi.set(__self__, "cooldown_minutes", cooldown_minutes) + if cpu_ceiling_percent is not None: + pulumi.set(__self__, "cpu_ceiling_percent", cpu_ceiling_percent) + if cpu_floor_percent is not None: + pulumi.set(__self__, "cpu_floor_percent", cpu_floor_percent) + if cpu_limit_ceiling_percent is not None: + pulumi.set(__self__, "cpu_limit_ceiling_percent", cpu_limit_ceiling_percent) + if cpu_limit_floor_percent is not None: + pulumi.set(__self__, "cpu_limit_floor_percent", cpu_limit_floor_percent) if cpu_vertical_scaling is not None: pulumi.set(__self__, "cpu_vertical_scaling", cpu_vertical_scaling) if cron_schedule is not None: @@ -89,6 +119,8 @@ def __init__(__self__, *, pulumi.set(__self__, "detection_triggers", detection_triggers) if drift_delta_percent is not None: pulumi.set(__self__, "drift_delta_percent", drift_delta_percent) + if enable_in_place_vertical_scaling is not None: + pulumi.set(__self__, "enable_in_place_vertical_scaling", enable_in_place_vertical_scaling) if enable_pmax_protection is not None: pulumi.set(__self__, "enable_pmax_protection", enable_pmax_protection) if gpu_vertical_scaling is not None: @@ -99,12 +131,38 @@ def __init__(__self__, *, pulumi.set(__self__, "horizontal_scaling", horizontal_scaling) if hysteresis_vs_target is not None: pulumi.set(__self__, "hysteresis_vs_target", hysteresis_vs_target) + if jvm_cpu_startup_floor_millicores is not None: + pulumi.set(__self__, "jvm_cpu_startup_floor_millicores", jvm_cpu_startup_floor_millicores) + if jvm_heap_headroom_multiplier is not None: + pulumi.set(__self__, "jvm_heap_headroom_multiplier", jvm_heap_headroom_multiplier) + if jvm_heap_optimization_enabled is not None: + pulumi.set(__self__, "jvm_heap_optimization_enabled", jvm_heap_optimization_enabled) + if jvm_heap_target_percentile is not None: + pulumi.set(__self__, "jvm_heap_target_percentile", jvm_heap_target_percentile) + if jvm_max_heap_bytes is not None: + pulumi.set(__self__, "jvm_max_heap_bytes", jvm_max_heap_bytes) + if jvm_min_heap_bytes is not None: + pulumi.set(__self__, "jvm_min_heap_bytes", jvm_min_heap_bytes) + if jvm_non_heap_overhead_bytes is not None: + pulumi.set(__self__, "jvm_non_heap_overhead_bytes", jvm_non_heap_overhead_bytes) + if jvm_non_heap_overhead_percent is not None: + pulumi.set(__self__, "jvm_non_heap_overhead_percent", jvm_non_heap_overhead_percent) + if jvm_prefer_container_support is not None: + pulumi.set(__self__, "jvm_prefer_container_support", jvm_prefer_container_support) if live_migration_enabled is not None: pulumi.set(__self__, "live_migration_enabled", live_migration_enabled) if loopback_period_seconds is None: loopback_period_seconds = 86400 if loopback_period_seconds is not None: pulumi.set(__self__, "loopback_period_seconds", loopback_period_seconds) + if memory_ceiling_percent is not None: + pulumi.set(__self__, "memory_ceiling_percent", memory_ceiling_percent) + if memory_floor_percent is not None: + pulumi.set(__self__, "memory_floor_percent", memory_floor_percent) + if memory_limit_ceiling_percent is not None: + pulumi.set(__self__, "memory_limit_ceiling_percent", memory_limit_ceiling_percent) + if memory_limit_floor_percent is not None: + pulumi.set(__self__, "memory_limit_floor_percent", memory_limit_floor_percent) if memory_vertical_scaling is not None: pulumi.set(__self__, "memory_vertical_scaling", memory_vertical_scaling) if min_change_percent is None: @@ -119,6 +177,8 @@ def __init__(__self__, *, min_vpa_window_data_points = 30 if min_vpa_window_data_points is not None: pulumi.set(__self__, "min_vpa_window_data_points", min_vpa_window_data_points) + if pdb_enabled is not None: + pulumi.set(__self__, "pdb_enabled", pdb_enabled) if pmax_ratio_threshold is None: pmax_ratio_threshold = 3 if pmax_ratio_threshold is not None: @@ -154,6 +214,15 @@ def action_triggers(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builti def action_triggers(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "action_triggers", value) + @_builtins.property + @pulumi.getter(name="allowInPlaceMemoryLimitDecrease") + def allow_in_place_memory_limit_decrease(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "allow_in_place_memory_limit_decrease") + + @allow_in_place_memory_limit_decrease.setter + def allow_in_place_memory_limit_decrease(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "allow_in_place_memory_limit_decrease", value) + @_builtins.property @pulumi.getter(name="cooldownMinutes") def cooldown_minutes(self) -> Optional[pulumi.Input[_builtins.int]]: @@ -166,6 +235,42 @@ def cooldown_minutes(self) -> Optional[pulumi.Input[_builtins.int]]: def cooldown_minutes(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "cooldown_minutes", value) + @_builtins.property + @pulumi.getter(name="cpuCeilingPercent") + def cpu_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_ceiling_percent") + + @cpu_ceiling_percent.setter + def cpu_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuFloorPercent") + def cpu_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_floor_percent") + + @cpu_floor_percent.setter + def cpu_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_floor_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuLimitCeilingPercent") + def cpu_limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_limit_ceiling_percent") + + @cpu_limit_ceiling_percent.setter + def cpu_limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="cpuLimitFloorPercent") + def cpu_limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "cpu_limit_floor_percent") + + @cpu_limit_floor_percent.setter + def cpu_limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "cpu_limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="cpuVerticalScaling") def cpu_vertical_scaling(self) -> Optional[pulumi.Input['VerticalScalingArgsArgs']]: @@ -235,6 +340,15 @@ def drift_delta_percent(self) -> Optional[pulumi.Input[_builtins.float]]: def drift_delta_percent(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "drift_delta_percent", value) + @_builtins.property + @pulumi.getter(name="enableInPlaceVerticalScaling") + def enable_in_place_vertical_scaling(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "enable_in_place_vertical_scaling") + + @enable_in_place_vertical_scaling.setter + def enable_in_place_vertical_scaling(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "enable_in_place_vertical_scaling", value) + @_builtins.property @pulumi.getter(name="enablePmaxProtection") def enable_pmax_protection(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -292,6 +406,87 @@ def hysteresis_vs_target(self) -> Optional[pulumi.Input[_builtins.float]]: def hysteresis_vs_target(self, value: Optional[pulumi.Input[_builtins.float]]): pulumi.set(self, "hysteresis_vs_target", value) + @_builtins.property + @pulumi.getter(name="jvmCpuStartupFloorMillicores") + def jvm_cpu_startup_floor_millicores(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_cpu_startup_floor_millicores") + + @jvm_cpu_startup_floor_millicores.setter + def jvm_cpu_startup_floor_millicores(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_cpu_startup_floor_millicores", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapHeadroomMultiplier") + def jvm_heap_headroom_multiplier(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_heap_headroom_multiplier") + + @jvm_heap_headroom_multiplier.setter + def jvm_heap_headroom_multiplier(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_heap_headroom_multiplier", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapOptimizationEnabled") + def jvm_heap_optimization_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "jvm_heap_optimization_enabled") + + @jvm_heap_optimization_enabled.setter + def jvm_heap_optimization_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "jvm_heap_optimization_enabled", value) + + @_builtins.property + @pulumi.getter(name="jvmHeapTargetPercentile") + def jvm_heap_target_percentile(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_heap_target_percentile") + + @jvm_heap_target_percentile.setter + def jvm_heap_target_percentile(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_heap_target_percentile", value) + + @_builtins.property + @pulumi.getter(name="jvmMaxHeapBytes") + def jvm_max_heap_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_max_heap_bytes") + + @jvm_max_heap_bytes.setter + def jvm_max_heap_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_max_heap_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmMinHeapBytes") + def jvm_min_heap_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_min_heap_bytes") + + @jvm_min_heap_bytes.setter + def jvm_min_heap_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_min_heap_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadBytes") + def jvm_non_heap_overhead_bytes(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "jvm_non_heap_overhead_bytes") + + @jvm_non_heap_overhead_bytes.setter + def jvm_non_heap_overhead_bytes(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "jvm_non_heap_overhead_bytes", value) + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadPercent") + def jvm_non_heap_overhead_percent(self) -> Optional[pulumi.Input[_builtins.float]]: + return pulumi.get(self, "jvm_non_heap_overhead_percent") + + @jvm_non_heap_overhead_percent.setter + def jvm_non_heap_overhead_percent(self, value: Optional[pulumi.Input[_builtins.float]]): + pulumi.set(self, "jvm_non_heap_overhead_percent", value) + + @_builtins.property + @pulumi.getter(name="jvmPreferContainerSupport") + def jvm_prefer_container_support(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "jvm_prefer_container_support") + + @jvm_prefer_container_support.setter + def jvm_prefer_container_support(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "jvm_prefer_container_support", value) + @_builtins.property @pulumi.getter(name="liveMigrationEnabled") def live_migration_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: @@ -316,6 +511,42 @@ def loopback_period_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: def loopback_period_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "loopback_period_seconds", value) + @_builtins.property + @pulumi.getter(name="memoryCeilingPercent") + def memory_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_ceiling_percent") + + @memory_ceiling_percent.setter + def memory_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryFloorPercent") + def memory_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_floor_percent") + + @memory_floor_percent.setter + def memory_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_floor_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryLimitCeilingPercent") + def memory_limit_ceiling_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_limit_ceiling_percent") + + @memory_limit_ceiling_percent.setter + def memory_limit_ceiling_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_limit_ceiling_percent", value) + + @_builtins.property + @pulumi.getter(name="memoryLimitFloorPercent") + def memory_limit_floor_percent(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "memory_limit_floor_percent") + + @memory_limit_floor_percent.setter + def memory_limit_floor_percent(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "memory_limit_floor_percent", value) + @_builtins.property @pulumi.getter(name="memoryVerticalScaling") def memory_vertical_scaling(self) -> Optional[pulumi.Input['VerticalScalingArgsArgs']]: @@ -361,6 +592,15 @@ def min_vpa_window_data_points(self) -> Optional[pulumi.Input[_builtins.int]]: def min_vpa_window_data_points(self, value: Optional[pulumi.Input[_builtins.int]]): pulumi.set(self, "min_vpa_window_data_points", value) + @_builtins.property + @pulumi.getter(name="pdbEnabled") + def pdb_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "pdb_enabled") + + @pdb_enabled.setter + def pdb_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "pdb_enabled", value) + @_builtins.property @pulumi.getter(name="pmaxRatioThreshold") def pmax_ratio_threshold(self) -> Optional[pulumi.Input[_builtins.float]]: @@ -417,25 +657,45 @@ def __init__(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, horizontal_scaling: Optional[pulumi.Input[Union['HorizontalScalingArgsArgs', 'HorizontalScalingArgsArgsDict']]] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -493,25 +753,45 @@ def _internal_init(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, action_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + allow_in_place_memory_limit_decrease: Optional[pulumi.Input[_builtins.bool]] = None, cooldown_minutes: Optional[pulumi.Input[_builtins.int]] = None, + cpu_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + cpu_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, cpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, drift_delta_percent: Optional[pulumi.Input[_builtins.float]] = None, + enable_in_place_vertical_scaling: Optional[pulumi.Input[_builtins.bool]] = None, enable_pmax_protection: Optional[pulumi.Input[_builtins.bool]] = None, gpu_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, gpu_vram_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, horizontal_scaling: Optional[pulumi.Input[Union['HorizontalScalingArgsArgs', 'HorizontalScalingArgsArgsDict']]] = None, hysteresis_vs_target: Optional[pulumi.Input[_builtins.float]] = None, + jvm_cpu_startup_floor_millicores: Optional[pulumi.Input[_builtins.int]] = None, + jvm_heap_headroom_multiplier: Optional[pulumi.Input[_builtins.float]] = None, + jvm_heap_optimization_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + jvm_heap_target_percentile: Optional[pulumi.Input[_builtins.float]] = None, + jvm_max_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_min_heap_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_bytes: Optional[pulumi.Input[_builtins.int]] = None, + jvm_non_heap_overhead_percent: Optional[pulumi.Input[_builtins.float]] = None, + jvm_prefer_container_support: Optional[pulumi.Input[_builtins.bool]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, loopback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, + memory_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_ceiling_percent: Optional[pulumi.Input[_builtins.int]] = None, + memory_limit_floor_percent: Optional[pulumi.Input[_builtins.int]] = None, memory_vertical_scaling: Optional[pulumi.Input[Union['VerticalScalingArgsArgs', 'VerticalScalingArgsArgsDict']]] = None, min_change_percent: Optional[pulumi.Input[_builtins.float]] = None, min_data_points: Optional[pulumi.Input[_builtins.int]] = None, min_vpa_window_data_points: Optional[pulumi.Input[_builtins.int]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, + pdb_enabled: Optional[pulumi.Input[_builtins.bool]] = None, pmax_ratio_threshold: Optional[pulumi.Input[_builtins.float]] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, stability_cv_max: Optional[pulumi.Input[_builtins.float]] = None, @@ -526,24 +806,43 @@ def _internal_init(__self__, __props__ = WorkloadPolicyArgs.__new__(WorkloadPolicyArgs) __props__.__dict__["action_triggers"] = action_triggers + __props__.__dict__["allow_in_place_memory_limit_decrease"] = allow_in_place_memory_limit_decrease if cooldown_minutes is None: cooldown_minutes = 300 __props__.__dict__["cooldown_minutes"] = cooldown_minutes + __props__.__dict__["cpu_ceiling_percent"] = cpu_ceiling_percent + __props__.__dict__["cpu_floor_percent"] = cpu_floor_percent + __props__.__dict__["cpu_limit_ceiling_percent"] = cpu_limit_ceiling_percent + __props__.__dict__["cpu_limit_floor_percent"] = cpu_limit_floor_percent __props__.__dict__["cpu_vertical_scaling"] = cpu_vertical_scaling __props__.__dict__["cron_schedule"] = cron_schedule __props__.__dict__["defragmentation_schedule"] = defragmentation_schedule __props__.__dict__["description"] = description __props__.__dict__["detection_triggers"] = detection_triggers __props__.__dict__["drift_delta_percent"] = drift_delta_percent + __props__.__dict__["enable_in_place_vertical_scaling"] = enable_in_place_vertical_scaling __props__.__dict__["enable_pmax_protection"] = enable_pmax_protection __props__.__dict__["gpu_vertical_scaling"] = gpu_vertical_scaling __props__.__dict__["gpu_vram_vertical_scaling"] = gpu_vram_vertical_scaling __props__.__dict__["horizontal_scaling"] = horizontal_scaling __props__.__dict__["hysteresis_vs_target"] = hysteresis_vs_target + __props__.__dict__["jvm_cpu_startup_floor_millicores"] = jvm_cpu_startup_floor_millicores + __props__.__dict__["jvm_heap_headroom_multiplier"] = jvm_heap_headroom_multiplier + __props__.__dict__["jvm_heap_optimization_enabled"] = jvm_heap_optimization_enabled + __props__.__dict__["jvm_heap_target_percentile"] = jvm_heap_target_percentile + __props__.__dict__["jvm_max_heap_bytes"] = jvm_max_heap_bytes + __props__.__dict__["jvm_min_heap_bytes"] = jvm_min_heap_bytes + __props__.__dict__["jvm_non_heap_overhead_bytes"] = jvm_non_heap_overhead_bytes + __props__.__dict__["jvm_non_heap_overhead_percent"] = jvm_non_heap_overhead_percent + __props__.__dict__["jvm_prefer_container_support"] = jvm_prefer_container_support __props__.__dict__["live_migration_enabled"] = live_migration_enabled if loopback_period_seconds is None: loopback_period_seconds = 86400 __props__.__dict__["loopback_period_seconds"] = loopback_period_seconds + __props__.__dict__["memory_ceiling_percent"] = memory_ceiling_percent + __props__.__dict__["memory_floor_percent"] = memory_floor_percent + __props__.__dict__["memory_limit_ceiling_percent"] = memory_limit_ceiling_percent + __props__.__dict__["memory_limit_floor_percent"] = memory_limit_floor_percent __props__.__dict__["memory_vertical_scaling"] = memory_vertical_scaling if min_change_percent is None: min_change_percent = 0.2 @@ -557,6 +856,7 @@ def _internal_init(__self__, if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name + __props__.__dict__["pdb_enabled"] = pdb_enabled if pmax_ratio_threshold is None: pmax_ratio_threshold = 3 __props__.__dict__["pmax_ratio_threshold"] = pmax_ratio_threshold @@ -586,25 +886,45 @@ def get(resource_name: str, __props__ = WorkloadPolicyArgs.__new__(WorkloadPolicyArgs) __props__.__dict__["action_triggers"] = None + __props__.__dict__["allow_in_place_memory_limit_decrease"] = None __props__.__dict__["cooldown_minutes"] = None + __props__.__dict__["cpu_ceiling_percent"] = None + __props__.__dict__["cpu_floor_percent"] = None + __props__.__dict__["cpu_limit_ceiling_percent"] = None + __props__.__dict__["cpu_limit_floor_percent"] = None __props__.__dict__["cpu_vertical_scaling"] = None __props__.__dict__["cron_schedule"] = None __props__.__dict__["defragmentation_schedule"] = None __props__.__dict__["description"] = None __props__.__dict__["detection_triggers"] = None __props__.__dict__["drift_delta_percent"] = None + __props__.__dict__["enable_in_place_vertical_scaling"] = None __props__.__dict__["enable_pmax_protection"] = None __props__.__dict__["gpu_vertical_scaling"] = None __props__.__dict__["gpu_vram_vertical_scaling"] = None __props__.__dict__["horizontal_scaling"] = None __props__.__dict__["hysteresis_vs_target"] = None + __props__.__dict__["jvm_cpu_startup_floor_millicores"] = None + __props__.__dict__["jvm_heap_headroom_multiplier"] = None + __props__.__dict__["jvm_heap_optimization_enabled"] = None + __props__.__dict__["jvm_heap_target_percentile"] = None + __props__.__dict__["jvm_max_heap_bytes"] = None + __props__.__dict__["jvm_min_heap_bytes"] = None + __props__.__dict__["jvm_non_heap_overhead_bytes"] = None + __props__.__dict__["jvm_non_heap_overhead_percent"] = None + __props__.__dict__["jvm_prefer_container_support"] = None __props__.__dict__["live_migration_enabled"] = None __props__.__dict__["loopback_period_seconds"] = None + __props__.__dict__["memory_ceiling_percent"] = None + __props__.__dict__["memory_floor_percent"] = None + __props__.__dict__["memory_limit_ceiling_percent"] = None + __props__.__dict__["memory_limit_floor_percent"] = None __props__.__dict__["memory_vertical_scaling"] = None __props__.__dict__["min_change_percent"] = None __props__.__dict__["min_data_points"] = None __props__.__dict__["min_vpa_window_data_points"] = None __props__.__dict__["name"] = None + __props__.__dict__["pdb_enabled"] = None __props__.__dict__["pmax_ratio_threshold"] = None __props__.__dict__["scheduler_plugins"] = None __props__.__dict__["stability_cv_max"] = None @@ -619,6 +939,11 @@ def action_triggers(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "action_triggers") + @_builtins.property + @pulumi.getter(name="allowInPlaceMemoryLimitDecrease") + def allow_in_place_memory_limit_decrease(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "allow_in_place_memory_limit_decrease") + @_builtins.property @pulumi.getter(name="cooldownMinutes") def cooldown_minutes(self) -> pulumi.Output[Optional[_builtins.int]]: @@ -627,6 +952,26 @@ def cooldown_minutes(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "cooldown_minutes") + @_builtins.property + @pulumi.getter(name="cpuCeilingPercent") + def cpu_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="cpuFloorPercent") + def cpu_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_floor_percent") + + @_builtins.property + @pulumi.getter(name="cpuLimitCeilingPercent") + def cpu_limit_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="cpuLimitFloorPercent") + def cpu_limit_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "cpu_limit_floor_percent") + @_builtins.property @pulumi.getter(name="cpuVerticalScaling") def cpu_vertical_scaling(self) -> pulumi.Output[Optional['outputs.VerticalScalingArgs']]: @@ -672,6 +1017,11 @@ def drift_delta_percent(self) -> pulumi.Output[Optional[_builtins.float]]: """ return pulumi.get(self, "drift_delta_percent") + @_builtins.property + @pulumi.getter(name="enableInPlaceVerticalScaling") + def enable_in_place_vertical_scaling(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "enable_in_place_vertical_scaling") + @_builtins.property @pulumi.getter(name="enablePmaxProtection") def enable_pmax_protection(self) -> pulumi.Output[Optional[_builtins.bool]]: @@ -709,6 +1059,51 @@ def hysteresis_vs_target(self) -> pulumi.Output[Optional[_builtins.float]]: """ return pulumi.get(self, "hysteresis_vs_target") + @_builtins.property + @pulumi.getter(name="jvmCpuStartupFloorMillicores") + def jvm_cpu_startup_floor_millicores(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_cpu_startup_floor_millicores") + + @_builtins.property + @pulumi.getter(name="jvmHeapHeadroomMultiplier") + def jvm_heap_headroom_multiplier(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_heap_headroom_multiplier") + + @_builtins.property + @pulumi.getter(name="jvmHeapOptimizationEnabled") + def jvm_heap_optimization_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "jvm_heap_optimization_enabled") + + @_builtins.property + @pulumi.getter(name="jvmHeapTargetPercentile") + def jvm_heap_target_percentile(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_heap_target_percentile") + + @_builtins.property + @pulumi.getter(name="jvmMaxHeapBytes") + def jvm_max_heap_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_max_heap_bytes") + + @_builtins.property + @pulumi.getter(name="jvmMinHeapBytes") + def jvm_min_heap_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_min_heap_bytes") + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadBytes") + def jvm_non_heap_overhead_bytes(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "jvm_non_heap_overhead_bytes") + + @_builtins.property + @pulumi.getter(name="jvmNonHeapOverheadPercent") + def jvm_non_heap_overhead_percent(self) -> pulumi.Output[Optional[_builtins.float]]: + return pulumi.get(self, "jvm_non_heap_overhead_percent") + + @_builtins.property + @pulumi.getter(name="jvmPreferContainerSupport") + def jvm_prefer_container_support(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "jvm_prefer_container_support") + @_builtins.property @pulumi.getter(name="liveMigrationEnabled") def live_migration_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: @@ -725,6 +1120,26 @@ def loopback_period_seconds(self) -> pulumi.Output[Optional[_builtins.int]]: """ return pulumi.get(self, "loopback_period_seconds") + @_builtins.property + @pulumi.getter(name="memoryCeilingPercent") + def memory_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="memoryFloorPercent") + def memory_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_floor_percent") + + @_builtins.property + @pulumi.getter(name="memoryLimitCeilingPercent") + def memory_limit_ceiling_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_limit_ceiling_percent") + + @_builtins.property + @pulumi.getter(name="memoryLimitFloorPercent") + def memory_limit_floor_percent(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "memory_limit_floor_percent") + @_builtins.property @pulumi.getter(name="memoryVerticalScaling") def memory_vertical_scaling(self) -> pulumi.Output[Optional['outputs.VerticalScalingArgs']]: @@ -762,6 +1177,11 @@ def name(self) -> pulumi.Output[_builtins.str]: """ return pulumi.get(self, "name") + @_builtins.property + @pulumi.getter(name="pdbEnabled") + def pdb_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "pdb_enabled") + @_builtins.property @pulumi.getter(name="pmaxRatioThreshold") def pmax_ratio_threshold(self) -> pulumi.Output[Optional[_builtins.float]]: diff --git a/sdk/python/pulumi_devzero/resources/workload_policy_target.py b/sdk/python/pulumi_devzero/resources/workload_policy_target.py index 4927b44..f654351 100644 --- a/sdk/python/pulumi_devzero/resources/workload_policy_target.py +++ b/sdk/python/pulumi_devzero/resources/workload_policy_target.py @@ -24,15 +24,18 @@ def __init__(__self__, *, cluster_ids: pulumi.Input[Sequence[pulumi.Input[_builtins.str]]], name: pulumi.Input[_builtins.str], policy_id: pulumi.Input[_builtins.str], + annotation_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name_pattern: Optional[pulumi.Input['NamePatternArgsArgs']] = None, namespace_pattern: Optional[pulumi.Input['NamePatternArgsArgs']] = None, namespace_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None, node_group_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input['LabelSelectorArgsArgs']] = None): """ The set of arguments for constructing a WorkloadPolicyTarget resource. @@ -40,12 +43,16 @@ def __init__(__self__, *, pulumi.set(__self__, "cluster_ids", cluster_ids) pulumi.set(__self__, "name", name) pulumi.set(__self__, "policy_id", policy_id) + if annotation_selector is not None: + pulumi.set(__self__, "annotation_selector", annotation_selector) if description is not None: pulumi.set(__self__, "description", description) if enabled is not None: pulumi.set(__self__, "enabled", enabled) if kind_filter is not None: pulumi.set(__self__, "kind_filter", kind_filter) + if kind_filter_not_in is not None: + pulumi.set(__self__, "kind_filter_not_in", kind_filter_not_in) if name_pattern is not None: pulumi.set(__self__, "name_pattern", name_pattern) if namespace_pattern is not None: @@ -58,6 +65,8 @@ def __init__(__self__, *, pulumi.set(__self__, "priority", priority) if workload_names is not None: pulumi.set(__self__, "workload_names", workload_names) + if workload_names_not_in is not None: + pulumi.set(__self__, "workload_names_not_in", workload_names_not_in) if workload_selector is not None: pulumi.set(__self__, "workload_selector", workload_selector) @@ -88,6 +97,15 @@ def policy_id(self) -> pulumi.Input[_builtins.str]: def policy_id(self, value: pulumi.Input[_builtins.str]): pulumi.set(self, "policy_id", value) + @_builtins.property + @pulumi.getter(name="annotationSelector") + def annotation_selector(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: + return pulumi.get(self, "annotation_selector") + + @annotation_selector.setter + def annotation_selector(self, value: Optional[pulumi.Input['LabelSelectorArgsArgs']]): + pulumi.set(self, "annotation_selector", value) + @_builtins.property @pulumi.getter def description(self) -> Optional[pulumi.Input[_builtins.str]]: @@ -115,6 +133,15 @@ def kind_filter(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.s def kind_filter(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "kind_filter", value) + @_builtins.property + @pulumi.getter(name="kindFilterNotIn") + def kind_filter_not_in(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]: + return pulumi.get(self, "kind_filter_not_in") + + @kind_filter_not_in.setter + def kind_filter_not_in(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): + pulumi.set(self, "kind_filter_not_in", value) + @_builtins.property @pulumi.getter(name="namePattern") def name_pattern(self) -> Optional[pulumi.Input['NamePatternArgsArgs']]: @@ -169,6 +196,15 @@ def workload_names(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtin def workload_names(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "workload_names", value) + @_builtins.property + @pulumi.getter(name="workloadNamesNotIn") + def workload_names_not_in(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]: + return pulumi.get(self, "workload_names_not_in") + + @workload_names_not_in.setter + def workload_names_not_in(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): + pulumi.set(self, "workload_names_not_in", value) + @_builtins.property @pulumi.getter(name="workloadSelector") def workload_selector(self) -> Optional[pulumi.Input['LabelSelectorArgsArgs']]: @@ -185,10 +221,12 @@ class WorkloadPolicyTarget(pulumi.CustomResource): def __init__(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, + annotation_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, name_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, namespace_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, @@ -197,6 +235,7 @@ def __init__(__self__, policy_id: Optional[pulumi.Input[_builtins.str]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): """ @@ -229,10 +268,12 @@ def __init__(__self__, resource_name: str, *args, **kwargs): def _internal_init(__self__, resource_name: str, opts: Optional[pulumi.ResourceOptions] = None, + annotation_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, cluster_ids: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, description: Optional[pulumi.Input[_builtins.str]] = None, enabled: Optional[pulumi.Input[_builtins.bool]] = None, kind_filter: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + kind_filter_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, name_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, namespace_pattern: Optional[pulumi.Input[Union['NamePatternArgsArgs', 'NamePatternArgsArgsDict']]] = None, @@ -241,6 +282,7 @@ def _internal_init(__self__, policy_id: Optional[pulumi.Input[_builtins.str]] = None, priority: Optional[pulumi.Input[_builtins.int]] = None, workload_names: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + workload_names_not_in: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, workload_selector: Optional[pulumi.Input[Union['LabelSelectorArgsArgs', 'LabelSelectorArgsArgsDict']]] = None, __props__=None): opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts) @@ -251,12 +293,14 @@ def _internal_init(__self__, raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') __props__ = WorkloadPolicyTargetArgs.__new__(WorkloadPolicyTargetArgs) + __props__.__dict__["annotation_selector"] = annotation_selector if cluster_ids is None and not opts.urn: raise TypeError("Missing required property 'cluster_ids'") __props__.__dict__["cluster_ids"] = cluster_ids __props__.__dict__["description"] = description __props__.__dict__["enabled"] = enabled __props__.__dict__["kind_filter"] = kind_filter + __props__.__dict__["kind_filter_not_in"] = kind_filter_not_in if name is None and not opts.urn: raise TypeError("Missing required property 'name'") __props__.__dict__["name"] = name @@ -269,6 +313,7 @@ def _internal_init(__self__, __props__.__dict__["policy_id"] = policy_id __props__.__dict__["priority"] = priority __props__.__dict__["workload_names"] = workload_names + __props__.__dict__["workload_names_not_in"] = workload_names_not_in __props__.__dict__["workload_selector"] = workload_selector super(WorkloadPolicyTarget, __self__).__init__( 'devzero:resources:WorkloadPolicyTarget', @@ -292,10 +337,12 @@ def get(resource_name: str, __props__ = WorkloadPolicyTargetArgs.__new__(WorkloadPolicyTargetArgs) + __props__.__dict__["annotation_selector"] = None __props__.__dict__["cluster_ids"] = None __props__.__dict__["description"] = None __props__.__dict__["enabled"] = None __props__.__dict__["kind_filter"] = None + __props__.__dict__["kind_filter_not_in"] = None __props__.__dict__["name"] = None __props__.__dict__["name_pattern"] = None __props__.__dict__["namespace_pattern"] = None @@ -304,9 +351,18 @@ def get(resource_name: str, __props__.__dict__["policy_id"] = None __props__.__dict__["priority"] = None __props__.__dict__["workload_names"] = None + __props__.__dict__["workload_names_not_in"] = None __props__.__dict__["workload_selector"] = None return WorkloadPolicyTarget(resource_name, opts=opts, __props__=__props__) + @_builtins.property + @pulumi.getter(name="annotationSelector") + def annotation_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: + """ + Select workloads by annotations (same semantics as label selectors, evaluated against annotations). + """ + return pulumi.get(self, "annotation_selector") + @_builtins.property @pulumi.getter(name="clusterIds") def cluster_ids(self) -> pulumi.Output[Sequence[_builtins.str]]: @@ -327,7 +383,7 @@ def description(self) -> pulumi.Output[Optional[_builtins.str]]: @pulumi.getter def enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: """ - Enable or disable this target. + Enable or disable this target. Defaults to true. """ return pulumi.get(self, "enabled") @@ -339,6 +395,14 @@ def kind_filter(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "kind_filter") + @_builtins.property + @pulumi.getter(name="kindFilterNotIn") + def kind_filter_not_in(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: + """ + Kubernetes kinds to exclude from matching. Same allowed values as kindFilter. + """ + return pulumi.get(self, "kind_filter_not_in") + @_builtins.property @pulumi.getter def name(self) -> pulumi.Output[_builtins.str]: @@ -373,9 +437,10 @@ def namespace_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArg @_builtins.property @pulumi.getter(name="nodeGroupNames") + @_utilities.deprecated("""node_group_names is deprecated by the DevZero API and no longer evaluated.""") def node_group_names(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ - Restrict matching to specific node groups by name. + DEPRECATED: unused by the DevZero API — no longer evaluated by any active target. """ return pulumi.get(self, "node_group_names") @@ -403,6 +468,14 @@ def workload_names(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: """ return pulumi.get(self, "workload_names") + @_builtins.property + @pulumi.getter(name="workloadNamesNotIn") + def workload_names_not_in(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]]: + """ + Explicit list of workload names to exclude. + """ + return pulumi.get(self, "workload_names_not_in") + @_builtins.property @pulumi.getter(name="workloadSelector") def workload_selector(self) -> pulumi.Output[Optional['outputs.LabelSelectorArgs']]: diff --git a/sdk/python/pulumi_devzero/resources/workload_rule.py b/sdk/python/pulumi_devzero/resources/workload_rule.py index c35c00f..d9a60c1 100644 --- a/sdk/python/pulumi_devzero/resources/workload_rule.py +++ b/sdk/python/pulumi_devzero/resources/workload_rule.py @@ -33,10 +33,12 @@ def __init__(__self__, *, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input['EmergencyResponseConfigArgsArgs']] = None, gpu_rule: Optional[pulumi.Input['ResourceRuleConfigArgsArgs']] = None, hpa_rule: Optional[pulumi.Input['HPARuleConfigArgsArgs']] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input['ResourceRuleConfigArgsArgs']] = None, scheduler_plugins: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, startup_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, @@ -85,6 +87,8 @@ def __init__(__self__, *, pulumi.set(__self__, "defragmentation_schedule", defragmentation_schedule) if detection_triggers is not None: pulumi.set(__self__, "detection_triggers", detection_triggers) + if disabled is not None: + pulumi.set(__self__, "disabled", disabled) if emergency_response is not None: pulumi.set(__self__, "emergency_response", emergency_response) if gpu_rule is not None: @@ -93,6 +97,8 @@ def __init__(__self__, *, pulumi.set(__self__, "hpa_rule", hpa_rule) if live_migration_enabled is not None: pulumi.set(__self__, "live_migration_enabled", live_migration_enabled) + if lookback_period_seconds is not None: + pulumi.set(__self__, "lookback_period_seconds", lookback_period_seconds) if memory_rule is not None: pulumi.set(__self__, "memory_rule", memory_rule) if scheduler_plugins is not None: @@ -246,6 +252,15 @@ def detection_triggers(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[_bui def detection_triggers(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]]): pulumi.set(self, "detection_triggers", value) + @_builtins.property + @pulumi.getter + def disabled(self) -> Optional[pulumi.Input[_builtins.bool]]: + return pulumi.get(self, "disabled") + + @disabled.setter + def disabled(self, value: Optional[pulumi.Input[_builtins.bool]]): + pulumi.set(self, "disabled", value) + @_builtins.property @pulumi.getter(name="emergencyResponse") def emergency_response(self) -> Optional[pulumi.Input['EmergencyResponseConfigArgsArgs']]: @@ -294,6 +309,15 @@ def live_migration_enabled(self) -> Optional[pulumi.Input[_builtins.bool]]: def live_migration_enabled(self, value: Optional[pulumi.Input[_builtins.bool]]): pulumi.set(self, "live_migration_enabled", value) + @_builtins.property + @pulumi.getter(name="lookbackPeriodSeconds") + def lookback_period_seconds(self) -> Optional[pulumi.Input[_builtins.int]]: + return pulumi.get(self, "lookback_period_seconds") + + @lookback_period_seconds.setter + def lookback_period_seconds(self, value: Optional[pulumi.Input[_builtins.int]]): + pulumi.set(self, "lookback_period_seconds", value) + @_builtins.property @pulumi.getter(name="memoryRule") def memory_rule(self) -> Optional[pulumi.Input['ResourceRuleConfigArgsArgs']]: @@ -358,11 +382,13 @@ def __init__(__self__, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input[Union['EmergencyResponseConfigArgsArgs', 'EmergencyResponseConfigArgsArgsDict']]] = None, gpu_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, hpa_rule: Optional[pulumi.Input[Union['HPARuleConfigArgsArgs', 'HPARuleConfigArgsArgsDict']]] = None, kind: Optional[pulumi.Input[_builtins.str]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, namespace: Optional[pulumi.Input[_builtins.str]] = None, @@ -429,11 +455,13 @@ def _internal_init(__self__, cron_schedule: Optional[pulumi.Input[_builtins.str]] = None, defragmentation_schedule: Optional[pulumi.Input[_builtins.str]] = None, detection_triggers: Optional[pulumi.Input[Sequence[pulumi.Input[_builtins.str]]]] = None, + disabled: Optional[pulumi.Input[_builtins.bool]] = None, emergency_response: Optional[pulumi.Input[Union['EmergencyResponseConfigArgsArgs', 'EmergencyResponseConfigArgsArgsDict']]] = None, gpu_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, hpa_rule: Optional[pulumi.Input[Union['HPARuleConfigArgsArgs', 'HPARuleConfigArgsArgsDict']]] = None, kind: Optional[pulumi.Input[_builtins.str]] = None, live_migration_enabled: Optional[pulumi.Input[_builtins.bool]] = None, + lookback_period_seconds: Optional[pulumi.Input[_builtins.int]] = None, memory_rule: Optional[pulumi.Input[Union['ResourceRuleConfigArgsArgs', 'ResourceRuleConfigArgsArgsDict']]] = None, name: Optional[pulumi.Input[_builtins.str]] = None, namespace: Optional[pulumi.Input[_builtins.str]] = None, @@ -460,6 +488,7 @@ def _internal_init(__self__, __props__.__dict__["cron_schedule"] = cron_schedule __props__.__dict__["defragmentation_schedule"] = defragmentation_schedule __props__.__dict__["detection_triggers"] = detection_triggers + __props__.__dict__["disabled"] = disabled __props__.__dict__["emergency_response"] = emergency_response __props__.__dict__["gpu_rule"] = gpu_rule __props__.__dict__["hpa_rule"] = hpa_rule @@ -467,6 +496,7 @@ def _internal_init(__self__, raise TypeError("Missing required property 'kind'") __props__.__dict__["kind"] = kind __props__.__dict__["live_migration_enabled"] = live_migration_enabled + __props__.__dict__["lookback_period_seconds"] = lookback_period_seconds __props__.__dict__["memory_rule"] = memory_rule if name is None and not opts.urn: raise TypeError("Missing required property 'name'") @@ -508,11 +538,13 @@ def get(resource_name: str, __props__.__dict__["cron_schedule"] = None __props__.__dict__["defragmentation_schedule"] = None __props__.__dict__["detection_triggers"] = None + __props__.__dict__["disabled"] = None __props__.__dict__["emergency_response"] = None __props__.__dict__["gpu_rule"] = None __props__.__dict__["hpa_rule"] = None __props__.__dict__["kind"] = None __props__.__dict__["live_migration_enabled"] = None + __props__.__dict__["lookback_period_seconds"] = None __props__.__dict__["memory_rule"] = None __props__.__dict__["name"] = None __props__.__dict__["namespace"] = None @@ -593,6 +625,11 @@ def detection_triggers(self) -> pulumi.Output[Optional[Sequence[_builtins.str]]] """ return pulumi.get(self, "detection_triggers") + @_builtins.property + @pulumi.getter + def disabled(self) -> pulumi.Output[Optional[_builtins.bool]]: + return pulumi.get(self, "disabled") + @_builtins.property @pulumi.getter(name="emergencyResponse") def emergency_response(self) -> pulumi.Output[Optional['outputs.EmergencyResponseConfigArgs']]: @@ -633,6 +670,11 @@ def live_migration_enabled(self) -> pulumi.Output[Optional[_builtins.bool]]: """ return pulumi.get(self, "live_migration_enabled") + @_builtins.property + @pulumi.getter(name="lookbackPeriodSeconds") + def lookback_period_seconds(self) -> pulumi.Output[Optional[_builtins.int]]: + return pulumi.get(self, "lookback_period_seconds") + @_builtins.property @pulumi.getter(name="memoryRule") def memory_rule(self) -> pulumi.Output[Optional['outputs.ResourceRuleConfigArgs']]: