// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	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)
)

// Specifies mode for a bot policy
type BotPolicy_Mode int32

const (
	BotPolicy_UNKNOWN_MODE BotPolicy_Mode = 0
	// Collect stats only for a bot group.
	BotPolicy_MONITORED BotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	BotPolicy_CONFIGURED BotPolicy_Mode = 2
)

// Enum value maps for BotPolicy_Mode.
var (
	BotPolicy_Mode_name = map[int32]string{
		0: "UNKNOWN_MODE",
		1: "MONITORED",
		2: "CONFIGURED",
	}
	BotPolicy_Mode_value = map[string]int32{
		"UNKNOWN_MODE": 0,
		"MONITORED":    1,
		"CONFIGURED":   2,
	}
)

func (x BotPolicy_Mode) Enum() *BotPolicy_Mode {
	p := new(BotPolicy_Mode)
	*p = x
	return p
}

func (x BotPolicy_Mode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (BotPolicy_Mode) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_bot_scaling_proto_enumTypes[0].Descriptor()
}

func (BotPolicy_Mode) Type() protoreflect.EnumType {
	return &file_chromiumos_bot_scaling_proto_enumTypes[0]
}

func (x BotPolicy_Mode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use BotPolicy_Mode.Descriptor instead.
func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{2, 0}
}

// Specifies mode for a bot scaling
type BotPolicy_BotScalingMode int32

const (
	BotPolicy_UNKNOWN_SCALING_MODE BotPolicy_BotScalingMode = 0
	// Scale up or down bots by the step size associated with bot group..
	BotPolicy_STEPPED BotPolicy_BotScalingMode = 1
	// Scale up or down bots by the demand on the bot group.
	// For use on smaller bot groups that are susceptible to smaller increases.
	BotPolicy_DEMAND BotPolicy_BotScalingMode = 2
	// Scale down bots by the step size associated with bot group.
	// Scale up bots by the demand on the bot group.
	BotPolicy_STEPPED_DECREASE BotPolicy_BotScalingMode = 3
)

// Enum value maps for BotPolicy_BotScalingMode.
var (
	BotPolicy_BotScalingMode_name = map[int32]string{
		0: "UNKNOWN_SCALING_MODE",
		1: "STEPPED",
		2: "DEMAND",
		3: "STEPPED_DECREASE",
	}
	BotPolicy_BotScalingMode_value = map[string]int32{
		"UNKNOWN_SCALING_MODE": 0,
		"STEPPED":              1,
		"DEMAND":               2,
		"STEPPED_DECREASE":     3,
	}
)

func (x BotPolicy_BotScalingMode) Enum() *BotPolicy_BotScalingMode {
	p := new(BotPolicy_BotScalingMode)
	*p = x
	return p
}

func (x BotPolicy_BotScalingMode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (BotPolicy_BotScalingMode) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_bot_scaling_proto_enumTypes[1].Descriptor()
}

func (BotPolicy_BotScalingMode) Type() protoreflect.EnumType {
	return &file_chromiumos_bot_scaling_proto_enumTypes[1]
}

func (x BotPolicy_BotScalingMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use BotPolicy_BotScalingMode.Descriptor instead.
func (BotPolicy_BotScalingMode) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{2, 1}
}

// Specifies if there has been a change since the last iteration.
type ScalingAction_Actionable int32

const (
	ScalingAction_UNSPECIFIED ScalingAction_Actionable = 0
	// There is a change since last time.
	ScalingAction_YES ScalingAction_Actionable = 1
	// There is no change since last time.
	ScalingAction_NO ScalingAction_Actionable = 2
)

// Enum value maps for ScalingAction_Actionable.
var (
	ScalingAction_Actionable_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "YES",
		2: "NO",
	}
	ScalingAction_Actionable_value = map[string]int32{
		"UNSPECIFIED": 0,
		"YES":         1,
		"NO":          2,
	}
)

func (x ScalingAction_Actionable) Enum() *ScalingAction_Actionable {
	p := new(ScalingAction_Actionable)
	*p = x
	return p
}

func (x ScalingAction_Actionable) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ScalingAction_Actionable) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_bot_scaling_proto_enumTypes[2].Descriptor()
}

func (ScalingAction_Actionable) Type() protoreflect.EnumType {
	return &file_chromiumos_bot_scaling_proto_enumTypes[2]
}

func (x ScalingAction_Actionable) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ScalingAction_Actionable.Descriptor instead.
func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{6, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The string bot "shirt size" to be requested for the group.
	BotSize string `protobuf:"bytes,1,opt,name=bot_size,json=botSize,proto3" json:"bot_size,omitempty"`
	// The number of cores per bot. Will be used to limit quota usage.
	CoresPerBot float32 `protobuf:"fixed32,2,opt,name=cores_per_bot,json=coresPerBot,proto3" json:"cores_per_bot,omitempty"`
	// Estimated hourly cost.
	HourlyCost float32 `protobuf:"fixed32,3,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"`
	// Amount of memory in GB allocated to bot.
	MemoryGb float32 `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
}

func (x *BotType) Reset() {
	*x = BotType{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BotType) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BotType) ProtoMessage() {}

func (x *BotType) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 BotType.ProtoReflect.Descriptor instead.
func (*BotType) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{0}
}

func (x *BotType) GetBotSize() string {
	if x != nil {
		return x.BotSize
	}
	return ""
}

func (x *BotType) GetCoresPerBot() float32 {
	if x != nil {
		return x.CoresPerBot
	}
	return 0
}

func (x *BotType) GetHourlyCost() float32 {
	if x != nil {
		return x.HourlyCost
	}
	return 0
}

func (x *BotType) GetMemoryGb() float32 {
	if x != nil {
		return x.MemoryGb
	}
	return 0
}

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Dimesion name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimension value
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	// Dimension multiple values
	Values []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"`
}

func (x *SwarmingDimension) Reset() {
	*x = SwarmingDimension{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SwarmingDimension) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SwarmingDimension) ProtoMessage() {}

func (x *SwarmingDimension) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 SwarmingDimension.ProtoReflect.Descriptor instead.
func (*SwarmingDimension) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{1}
}

func (x *SwarmingDimension) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *SwarmingDimension) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

func (x *SwarmingDimension) GetValues() []string {
	if x != nil {
		return x.Values
	}
	return nil
}

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType            *BotType                       `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	ScalingRestriction *BotPolicy_ScalingRestriction  `protobuf:"bytes,3,opt,name=scaling_restriction,json=scalingRestriction,proto3" json:"scaling_restriction,omitempty"`
	RegionRestrictions []*BotPolicy_RegionRestriction `protobuf:"bytes,4,rep,name=region_restrictions,json=regionRestrictions,proto3" json:"region_restrictions,omitempty"`
	// A set of dimensions used to validate current Swarming allocations.
	SwarmingDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,6,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours int32 `protobuf:"zigzag32,7,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	// Set the scaling approach for the bot group being monitored.
	ScalingMode BotPolicy_BotScalingMode `protobuf:"varint,8,opt,name=scaling_mode,json=scalingMode,proto3,enum=chromiumos.BotPolicy_BotScalingMode" json:"scaling_mode,omitempty"`
	// Swarming instance name:  chromeos-swarming.appspot.com
	SwarmingInstance string `protobuf:"bytes,9,opt,name=swarming_instance,json=swarmingInstance,proto3" json:"swarming_instance,omitempty"`
	// Application namespace within Swarming instance.
	Application string `protobuf:"bytes,10,opt,name=application,proto3" json:"application,omitempty"`
}

func (x *BotPolicy) Reset() {
	*x = BotPolicy{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BotPolicy) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BotPolicy) ProtoMessage() {}

func (x *BotPolicy) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 BotPolicy.ProtoReflect.Descriptor instead.
func (*BotPolicy) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{2}
}

func (x *BotPolicy) GetBotGroup() string {
	if x != nil {
		return x.BotGroup
	}
	return ""
}

func (x *BotPolicy) GetBotType() *BotType {
	if x != nil {
		return x.BotType
	}
	return nil
}

func (x *BotPolicy) GetScalingRestriction() *BotPolicy_ScalingRestriction {
	if x != nil {
		return x.ScalingRestriction
	}
	return nil
}

func (x *BotPolicy) GetRegionRestrictions() []*BotPolicy_RegionRestriction {
	if x != nil {
		return x.RegionRestrictions
	}
	return nil
}

func (x *BotPolicy) GetSwarmingDimensions() []*SwarmingDimension {
	if x != nil {
		return x.SwarmingDimensions
	}
	return nil
}

func (x *BotPolicy) GetPolicyMode() BotPolicy_Mode {
	if x != nil {
		return x.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

func (x *BotPolicy) GetLookbackHours() int32 {
	if x != nil {
		return x.LookbackHours
	}
	return 0
}

func (x *BotPolicy) GetScalingMode() BotPolicy_BotScalingMode {
	if x != nil {
		return x.ScalingMode
	}
	return BotPolicy_UNKNOWN_SCALING_MODE
}

func (x *BotPolicy) GetSwarmingInstance() string {
	if x != nil {
		return x.SwarmingInstance
	}
	return ""
}

func (x *BotPolicy) GetApplication() string {
	if x != nil {
		return x.Application
	}
	return ""
}

// Configures the root message.
type BotPolicyCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// All bot policies.
	BotPolicies []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
}

func (x *BotPolicyCfg) Reset() {
	*x = BotPolicyCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BotPolicyCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BotPolicyCfg) ProtoMessage() {}

func (x *BotPolicyCfg) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 BotPolicyCfg.ProtoReflect.Descriptor instead.
func (*BotPolicyCfg) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{3}
}

func (x *BotPolicyCfg) GetBotPolicies() []*BotPolicy {
	if x != nil {
		return x.BotPolicies
	}
	return nil
}

// Reduced version of BotPolicy meant for output properties
type ReducedBotPolicy struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,3,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
}

func (x *ReducedBotPolicy) Reset() {
	*x = ReducedBotPolicy{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ReducedBotPolicy) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReducedBotPolicy) ProtoMessage() {}

func (x *ReducedBotPolicy) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 ReducedBotPolicy.ProtoReflect.Descriptor instead.
func (*ReducedBotPolicy) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{4}
}

func (x *ReducedBotPolicy) GetBotGroup() string {
	if x != nil {
		return x.BotGroup
	}
	return ""
}

func (x *ReducedBotPolicy) GetBotType() *BotType {
	if x != nil {
		return x.BotType
	}
	return nil
}

func (x *ReducedBotPolicy) GetPolicyMode() BotPolicy_Mode {
	if x != nil {
		return x.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

// Configures the root message.
type ReducedBotPolicyCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// All bot policies in reduced form.
	BotPolicies []*ReducedBotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
}

func (x *ReducedBotPolicyCfg) Reset() {
	*x = ReducedBotPolicyCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ReducedBotPolicyCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReducedBotPolicyCfg) ProtoMessage() {}

func (x *ReducedBotPolicyCfg) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 ReducedBotPolicyCfg.ProtoReflect.Descriptor instead.
func (*ReducedBotPolicyCfg) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{5}
}

func (x *ReducedBotPolicyCfg) GetBotPolicies() []*ReducedBotPolicy {
	if x != nil {
		return x.BotPolicies
	}
	return nil
}

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Bot group modified by the action. Should be the same as BotPolicy.
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot requested. Should be the same as BotPolicy.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Whether there has been a change in the number of bots requested
	// for this bot group. See step_size for more info.
	Actionable ScalingAction_Actionable `protobuf:"varint,3,opt,name=actionable,proto3,enum=chromiumos.ScalingAction_Actionable" json:"actionable,omitempty"`
	// Total number of bots requested for the group.
	BotsRequested   int32                           `protobuf:"varint,4,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	RegionalActions []*ScalingAction_RegionalAction `protobuf:"bytes,5,rep,name=regional_actions,json=regionalActions,proto3" json:"regional_actions,omitempty"`
	// Estimated savings based on current run.
	// Based on current number of bots compared against the max.
	EstimatedSavings float32 `protobuf:"fixed32,6,opt,name=estimated_savings,json=estimatedSavings,proto3" json:"estimated_savings,omitempty"`
	// Minimum number of bots to keep alive for bot group.
	// Repeated for display/reporting purposes
	BotMin int32 `protobuf:"varint,7,opt,name=bot_min,json=botMin,proto3" json:"bot_min,omitempty"`
	// Hard limit on the maximum number of bots that can be requested.
	// Repeated for display/reporting purposes
	BotMax int32 `protobuf:"varint,8,opt,name=bot_max,json=botMax,proto3" json:"bot_max,omitempty"`
	// Application namespace within Swarming instance.
	Application string `protobuf:"bytes,9,opt,name=application,proto3" json:"application,omitempty"`
}

func (x *ScalingAction) Reset() {
	*x = ScalingAction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ScalingAction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ScalingAction) ProtoMessage() {}

func (x *ScalingAction) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 ScalingAction.ProtoReflect.Descriptor instead.
func (*ScalingAction) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{6}
}

func (x *ScalingAction) GetBotGroup() string {
	if x != nil {
		return x.BotGroup
	}
	return ""
}

func (x *ScalingAction) GetBotType() *BotType {
	if x != nil {
		return x.BotType
	}
	return nil
}

func (x *ScalingAction) GetActionable() ScalingAction_Actionable {
	if x != nil {
		return x.Actionable
	}
	return ScalingAction_UNSPECIFIED
}

func (x *ScalingAction) GetBotsRequested() int32 {
	if x != nil {
		return x.BotsRequested
	}
	return 0
}

func (x *ScalingAction) GetRegionalActions() []*ScalingAction_RegionalAction {
	if x != nil {
		return x.RegionalActions
	}
	return nil
}

func (x *ScalingAction) GetEstimatedSavings() float32 {
	if x != nil {
		return x.EstimatedSavings
	}
	return 0
}

func (x *ScalingAction) GetBotMin() int32 {
	if x != nil {
		return x.BotMin
	}
	return 0
}

func (x *ScalingAction) GetBotMax() int32 {
	if x != nil {
		return x.BotMax
	}
	return 0
}

func (x *ScalingAction) GetApplication() string {
	if x != nil {
		return x.Application
	}
	return ""
}

// Resource utilization based on regional assignment.
type ResourceUtilization struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Number of VMs allocated across all bot groups.
	Vms int32 `protobuf:"varint,2,opt,name=vms,proto3" json:"vms,omitempty"`
	// Number of CPUs allocated across all bot groups.
	Cpus float32 `protobuf:"fixed32,3,opt,name=cpus,proto3" json:"cpus,omitempty"`
	// Amount of memory in GB allocated across all bot groups.
	MemoryGb float32 `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	// Amount of disk in GB allocated across all bot groups.
	DiskGb float32 `protobuf:"fixed32,5,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	// NUmber of CPUs that could be allocated based on max values.
	MaxCpus float32 `protobuf:"fixed32,6,opt,name=max_cpus,json=maxCpus,proto3" json:"max_cpus,omitempty"`
}

func (x *ResourceUtilization) Reset() {
	*x = ResourceUtilization{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ResourceUtilization) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResourceUtilization) ProtoMessage() {}

func (x *ResourceUtilization) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResourceUtilization.ProtoReflect.Descriptor instead.
func (*ResourceUtilization) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{7}
}

func (x *ResourceUtilization) GetRegion() string {
	if x != nil {
		return x.Region
	}
	return ""
}

func (x *ResourceUtilization) GetVms() int32 {
	if x != nil {
		return x.Vms
	}
	return 0
}

func (x *ResourceUtilization) GetCpus() float32 {
	if x != nil {
		return x.Cpus
	}
	return 0
}

func (x *ResourceUtilization) GetMemoryGb() float32 {
	if x != nil {
		return x.MemoryGb
	}
	return 0
}

func (x *ResourceUtilization) GetDiskGb() float32 {
	if x != nil {
		return x.DiskGb
	}
	return 0
}

func (x *ResourceUtilization) GetMaxCpus() float32 {
	if x != nil {
		return x.MaxCpus
	}
	return 0
}

// Application utilization, per application at a
// regional assignment.
type ApplicationUtilization struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Application namespace to associate resources.
	Application         string                 `protobuf:"bytes,1,opt,name=application,proto3" json:"application,omitempty"`
	ResourceUtilization []*ResourceUtilization `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
}

func (x *ApplicationUtilization) Reset() {
	*x = ApplicationUtilization{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ApplicationUtilization) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ApplicationUtilization) ProtoMessage() {}

func (x *ApplicationUtilization) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 ApplicationUtilization.ProtoReflect.Descriptor instead.
func (*ApplicationUtilization) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{8}
}

func (x *ApplicationUtilization) GetApplication() string {
	if x != nil {
		return x.Application
	}
	return ""
}

func (x *ApplicationUtilization) GetResourceUtilization() []*ResourceUtilization {
	if x != nil {
		return x.ResourceUtilization
	}
	return nil
}

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of an action per bot group scaled by RoboCrop.
	ScalingActions          []*ScalingAction          `protobuf:"bytes,1,rep,name=scaling_actions,json=scalingActions,proto3" json:"scaling_actions,omitempty"`
	ResourceUtilization     []*ResourceUtilization    `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
	ApplResourceUtilization []*ApplicationUtilization `protobuf:"bytes,3,rep,name=appl_resource_utilization,json=applResourceUtilization,proto3" json:"appl_resource_utilization,omitempty"`
}

func (x *RoboCropAction) Reset() {
	*x = RoboCropAction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RoboCropAction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RoboCropAction) ProtoMessage() {}

func (x *RoboCropAction) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 RoboCropAction.ProtoReflect.Descriptor instead.
func (*RoboCropAction) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{9}
}

func (x *RoboCropAction) GetScalingActions() []*ScalingAction {
	if x != nil {
		return x.ScalingActions
	}
	return nil
}

func (x *RoboCropAction) GetResourceUtilization() []*ResourceUtilization {
	if x != nil {
		return x.ResourceUtilization
	}
	return nil
}

func (x *RoboCropAction) GetApplResourceUtilization() []*ApplicationUtilization {
	if x != nil {
		return x.ApplResourceUtilization
	}
	return nil
}

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Hard limit on the maximum number of bots to request.
	BotCeiling int32 `protobuf:"varint,1,opt,name=bot_ceiling,json=botCeiling,proto3" json:"bot_ceiling,omitempty"`
	// Hard limit on the minimum number of bots to request.
	BotFloor int32 `protobuf:"varint,2,opt,name=bot_floor,json=botFloor,proto3" json:"bot_floor,omitempty"`
	// Soft limit on the number of idle bots to maintain.
	MinIdle int32 `protobuf:"varint,3,opt,name=min_idle,json=minIdle,proto3" json:"min_idle,omitempty"`
	// Hard minimum limit on the absolute delta between request amount and
	// existing bot count.
	StepSize int32 `protobuf:"varint,4,opt,name=step_size,json=stepSize,proto3" json:"step_size,omitempty"`
	// Static number to request when demand is not accessible.
	BotFallback int32 `protobuf:"varint,5,opt,name=bot_fallback,json=botFallback,proto3" json:"bot_fallback,omitempty"`
}

func (x *BotPolicy_ScalingRestriction) Reset() {
	*x = BotPolicy_ScalingRestriction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BotPolicy_ScalingRestriction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BotPolicy_ScalingRestriction) ProtoMessage() {}

func (x *BotPolicy_ScalingRestriction) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 BotPolicy_ScalingRestriction.ProtoReflect.Descriptor instead.
func (*BotPolicy_ScalingRestriction) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{2, 0}
}

func (x *BotPolicy_ScalingRestriction) GetBotCeiling() int32 {
	if x != nil {
		return x.BotCeiling
	}
	return 0
}

func (x *BotPolicy_ScalingRestriction) GetBotFloor() int32 {
	if x != nil {
		return x.BotFloor
	}
	return 0
}

func (x *BotPolicy_ScalingRestriction) GetMinIdle() int32 {
	if x != nil {
		return x.MinIdle
	}
	return 0
}

func (x *BotPolicy_ScalingRestriction) GetStepSize() int32 {
	if x != nil {
		return x.StepSize
	}
	return 0
}

func (x *BotPolicy_ScalingRestriction) GetBotFallback() int32 {
	if x != nil {
		return x.BotFallback
	}
	return 0
}

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Weight to be applied to this sub-group. The number of bots requested
	// from each region will be proportional to the weight unless a
	// quota limit is violated.
	Weight float32 `protobuf:"fixed32,3,opt,name=weight,proto3" json:"weight,omitempty"`
}

func (x *BotPolicy_RegionRestriction) Reset() {
	*x = BotPolicy_RegionRestriction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BotPolicy_RegionRestriction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BotPolicy_RegionRestriction) ProtoMessage() {}

func (x *BotPolicy_RegionRestriction) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BotPolicy_RegionRestriction.ProtoReflect.Descriptor instead.
func (*BotPolicy_RegionRestriction) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{2, 1}
}

func (x *BotPolicy_RegionRestriction) GetRegion() string {
	if x != nil {
		return x.Region
	}
	return ""
}

func (x *BotPolicy_RegionRestriction) GetPrefix() string {
	if x != nil {
		return x.Prefix
	}
	return ""
}

func (x *BotPolicy_RegionRestriction) GetWeight() float32 {
	if x != nil {
		return x.Weight
	}
	return 0
}

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Number of bots requested from the sub-group.
	BotsRequested int32 `protobuf:"varint,3,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
}

func (x *ScalingAction_RegionalAction) Reset() {
	*x = ScalingAction_RegionalAction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_bot_scaling_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ScalingAction_RegionalAction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ScalingAction_RegionalAction) ProtoMessage() {}

func (x *ScalingAction_RegionalAction) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_bot_scaling_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 mi.MessageOf(x)
}

// Deprecated: Use ScalingAction_RegionalAction.ProtoReflect.Descriptor instead.
func (*ScalingAction_RegionalAction) Descriptor() ([]byte, []int) {
	return file_chromiumos_bot_scaling_proto_rawDescGZIP(), []int{6, 0}
}

func (x *ScalingAction_RegionalAction) GetRegion() string {
	if x != nil {
		return x.Region
	}
	return ""
}

func (x *ScalingAction_RegionalAction) GetPrefix() string {
	if x != nil {
		return x.Prefix
	}
	return ""
}

func (x *ScalingAction_RegionalAction) GetBotsRequested() int32 {
	if x != nil {
		return x.BotsRequested
	}
	return 0
}

var File_chromiumos_bot_scaling_proto protoreflect.FileDescriptor

var file_chromiumos_bot_scaling_proto_rawDesc = []byte{
	0x0a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x62, 0x6f, 0x74,
	0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x07, 0x42,
	0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x73, 0x69,
	0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x53, 0x69, 0x7a,
	0x65, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62,
	0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x50,
	0x65, 0x72, 0x42, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x6f, 0x75, 0x72, 0x6c, 0x79, 0x5f,
	0x63, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x68, 0x6f, 0x75, 0x72,
	0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,
	0x5f, 0x67, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x6f, 0x72,
	0x79, 0x47, 0x62, 0x22, 0x55, 0x0a, 0x11, 0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44,
	0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 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, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xfa, 0x07, 0x0a, 0x09, 0x42,
	0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, 0x74, 0x5f,
	0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x6f, 0x74,
	0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2e, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x79, 0x70,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x62, 0x6f,
	0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x59, 0x0a, 0x13, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67,
	0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x42, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e,
	0x67, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x73, 0x63,
	0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x58, 0x0a, 0x13, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72,
	0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x74, 0x72,
	0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x73, 0x77,
	0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
	0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x6d,
	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67,
	0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x70, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74,
	0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x6c,
	0x69, 0x63, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x6b, 0x62,
	0x61, 0x63, 0x6b, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x11, 0x52,
	0x0d, 0x6c, 0x6f, 0x6f, 0x6b, 0x62, 0x61, 0x63, 0x6b, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x47,
	0x0a, 0x0c, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x42, 0x6f, 0x74, 0x53,
	0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x63, 0x61, 0x6c,
	0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x77, 0x61, 0x72, 0x6d,
	0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x10, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x73, 0x74,
	0x61, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x6c, 0x69,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xad, 0x01, 0x0a, 0x12, 0x53, 0x63, 0x61, 0x6c, 0x69,
	0x6e, 0x67, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a,
	0x0b, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x05, 0x52, 0x0a, 0x62, 0x6f, 0x74, 0x43, 0x65, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x1b,
	0x0a, 0x09, 0x62, 0x6f, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x05, 0x52, 0x08, 0x62, 0x6f, 0x74, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d,
	0x69, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d,
	0x69, 0x6e, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x73,
	0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x74, 0x65, 0x70, 0x53,
	0x69, 0x7a, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6f, 0x74, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62,
	0x61, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x74, 0x46, 0x61,
	0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x1a, 0x5b, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72,
	0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67,
	0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x77,
	0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x77, 0x65, 0x69,
	0x67, 0x68, 0x74, 0x22, 0x37, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x55,
	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a,
	0x09, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a,
	0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x02, 0x22, 0x59, 0x0a, 0x0e,
	0x42, 0x6f, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x18,
	0x0a, 0x14, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x49, 0x4e,
	0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x45, 0x50,
	0x50, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4d, 0x41, 0x4e, 0x44, 0x10,
	0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x45, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x43,
	0x52, 0x45, 0x41, 0x53, 0x45, 0x10, 0x03, 0x22, 0x48, 0x0a, 0x0c, 0x42, 0x6f, 0x74, 0x50, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x43, 0x66, 0x67, 0x12, 0x38, 0x0a, 0x0c, 0x62, 0x6f, 0x74, 0x5f, 0x70,
	0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x62, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65,
	0x73, 0x22, 0x9c, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x64, 0x42, 0x6f, 0x74,
	0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f, 0x74, 0x5f, 0x67, 0x72,
	0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x6f, 0x74, 0x47, 0x72,
	0x6f, 0x75, 0x70, 0x12, 0x2e, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x6f,
	0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e,
	0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x6f, 0x64, 0x65,
	0x22, 0x56, 0x0a, 0x13, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x64, 0x42, 0x6f, 0x74, 0x50, 0x6f,
	0x6c, 0x69, 0x63, 0x79, 0x43, 0x66, 0x67, 0x12, 0x3f, 0x0a, 0x0c, 0x62, 0x6f, 0x74, 0x5f, 0x70,
	0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x64, 0x75, 0x63,
	0x65, 0x64, 0x42, 0x6f, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, 0x62, 0x6f, 0x74,
	0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x22, 0xb8, 0x04, 0x0a, 0x0d, 0x53, 0x63, 0x61,
	0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x6f,
	0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62,
	0x6f, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2e, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07,
	0x62, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f,
	0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67,
	0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x25, 0x0a,
	0x0e, 0x62, 0x6f, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x10, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
	0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c,
	0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x73, 0x74,
	0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06,
	0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x53,
	0x61, 0x76, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6f, 0x74, 0x5f, 0x6d, 0x69,
	0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x6f, 0x74, 0x4d, 0x69, 0x6e, 0x12,
	0x17, 0x0a, 0x07, 0x62, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x06, 0x62, 0x6f, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x6c,
	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61,
	0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x67, 0x0a, 0x0e, 0x52, 0x65,
	0x67, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06,
	0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65,
	0x67, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x25, 0x0a, 0x0e,
	0x62, 0x6f, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x65, 0x64, 0x22, 0x2e, 0x0a, 0x0a, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x62, 0x6c,
	0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x59, 0x45, 0x53, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e,
	0x4f, 0x10, 0x02, 0x22, 0xa4, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
	0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72,
	0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67,
	0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05,
	0x52, 0x03, 0x76, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x70, 0x75, 0x73, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d,
	0x6f, 0x72, 0x79, 0x5f, 0x67, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x65,
	0x6d, 0x6f, 0x72, 0x79, 0x47, 0x62, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x67,
	0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x64, 0x69, 0x73, 0x6b, 0x47, 0x62, 0x12,
	0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28,
	0x02, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x43, 0x70, 0x75, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x16, 0x41,
	0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x70, 0x6c,
	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x52, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75,
	0x72, 0x63, 0x65, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x74, 0x69, 0x6c, 0x69,
	0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
	0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x88, 0x02, 0x0a, 0x0e,
	0x52, 0x6f, 0x62, 0x6f, 0x43, 0x72, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42,
	0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x12, 0x52, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75,
	0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65,
	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x74, 0x69, 0x6c, 0x69,
	0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x19, 0x61, 0x70, 0x70, 0x6c, 0x5f, 0x72,
	0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x61,
	0x70, 0x70, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x55, 0x74, 0x69, 0x6c, 0x69,
	0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_bot_scaling_proto_rawDescOnce sync.Once
	file_chromiumos_bot_scaling_proto_rawDescData = file_chromiumos_bot_scaling_proto_rawDesc
)

func file_chromiumos_bot_scaling_proto_rawDescGZIP() []byte {
	file_chromiumos_bot_scaling_proto_rawDescOnce.Do(func() {
		file_chromiumos_bot_scaling_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_bot_scaling_proto_rawDescData)
	})
	return file_chromiumos_bot_scaling_proto_rawDescData
}

var file_chromiumos_bot_scaling_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_chromiumos_bot_scaling_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
var file_chromiumos_bot_scaling_proto_goTypes = []interface{}{
	(BotPolicy_Mode)(0),                  // 0: chromiumos.BotPolicy.Mode
	(BotPolicy_BotScalingMode)(0),        // 1: chromiumos.BotPolicy.BotScalingMode
	(ScalingAction_Actionable)(0),        // 2: chromiumos.ScalingAction.Actionable
	(*BotType)(nil),                      // 3: chromiumos.BotType
	(*SwarmingDimension)(nil),            // 4: chromiumos.SwarmingDimension
	(*BotPolicy)(nil),                    // 5: chromiumos.BotPolicy
	(*BotPolicyCfg)(nil),                 // 6: chromiumos.BotPolicyCfg
	(*ReducedBotPolicy)(nil),             // 7: chromiumos.ReducedBotPolicy
	(*ReducedBotPolicyCfg)(nil),          // 8: chromiumos.ReducedBotPolicyCfg
	(*ScalingAction)(nil),                // 9: chromiumos.ScalingAction
	(*ResourceUtilization)(nil),          // 10: chromiumos.ResourceUtilization
	(*ApplicationUtilization)(nil),       // 11: chromiumos.ApplicationUtilization
	(*RoboCropAction)(nil),               // 12: chromiumos.RoboCropAction
	(*BotPolicy_ScalingRestriction)(nil), // 13: chromiumos.BotPolicy.ScalingRestriction
	(*BotPolicy_RegionRestriction)(nil),  // 14: chromiumos.BotPolicy.RegionRestriction
	(*ScalingAction_RegionalAction)(nil), // 15: chromiumos.ScalingAction.RegionalAction
}
var file_chromiumos_bot_scaling_proto_depIdxs = []int32{
	3,  // 0: chromiumos.BotPolicy.bot_type:type_name -> chromiumos.BotType
	13, // 1: chromiumos.BotPolicy.scaling_restriction:type_name -> chromiumos.BotPolicy.ScalingRestriction
	14, // 2: chromiumos.BotPolicy.region_restrictions:type_name -> chromiumos.BotPolicy.RegionRestriction
	4,  // 3: chromiumos.BotPolicy.swarming_dimensions:type_name -> chromiumos.SwarmingDimension
	0,  // 4: chromiumos.BotPolicy.policy_mode:type_name -> chromiumos.BotPolicy.Mode
	1,  // 5: chromiumos.BotPolicy.scaling_mode:type_name -> chromiumos.BotPolicy.BotScalingMode
	5,  // 6: chromiumos.BotPolicyCfg.bot_policies:type_name -> chromiumos.BotPolicy
	3,  // 7: chromiumos.ReducedBotPolicy.bot_type:type_name -> chromiumos.BotType
	0,  // 8: chromiumos.ReducedBotPolicy.policy_mode:type_name -> chromiumos.BotPolicy.Mode
	7,  // 9: chromiumos.ReducedBotPolicyCfg.bot_policies:type_name -> chromiumos.ReducedBotPolicy
	3,  // 10: chromiumos.ScalingAction.bot_type:type_name -> chromiumos.BotType
	2,  // 11: chromiumos.ScalingAction.actionable:type_name -> chromiumos.ScalingAction.Actionable
	15, // 12: chromiumos.ScalingAction.regional_actions:type_name -> chromiumos.ScalingAction.RegionalAction
	10, // 13: chromiumos.ApplicationUtilization.resource_utilization:type_name -> chromiumos.ResourceUtilization
	9,  // 14: chromiumos.RoboCropAction.scaling_actions:type_name -> chromiumos.ScalingAction
	10, // 15: chromiumos.RoboCropAction.resource_utilization:type_name -> chromiumos.ResourceUtilization
	11, // 16: chromiumos.RoboCropAction.appl_resource_utilization:type_name -> chromiumos.ApplicationUtilization
	17, // [17:17] is the sub-list for method output_type
	17, // [17:17] is the sub-list for method input_type
	17, // [17:17] is the sub-list for extension type_name
	17, // [17:17] is the sub-list for extension extendee
	0,  // [0:17] is the sub-list for field type_name
}

func init() { file_chromiumos_bot_scaling_proto_init() }
func file_chromiumos_bot_scaling_proto_init() {
	if File_chromiumos_bot_scaling_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_bot_scaling_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotType); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SwarmingDimension); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotPolicy); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotPolicyCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReducedBotPolicy); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReducedBotPolicyCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ScalingAction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ResourceUtilization); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ApplicationUtilization); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RoboCropAction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotPolicy_ScalingRestriction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BotPolicy_RegionRestriction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_bot_scaling_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ScalingAction_RegionalAction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_bot_scaling_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   13,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_bot_scaling_proto_goTypes,
		DependencyIndexes: file_chromiumos_bot_scaling_proto_depIdxs,
		EnumInfos:         file_chromiumos_bot_scaling_proto_enumTypes,
		MessageInfos:      file_chromiumos_bot_scaling_proto_msgTypes,
	}.Build()
	File_chromiumos_bot_scaling_proto = out.File
	file_chromiumos_bot_scaling_proto_rawDesc = nil
	file_chromiumos_bot_scaling_proto_goTypes = nil
	file_chromiumos_bot_scaling_proto_depIdxs = nil
}
