// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Specifies mode for a bot policy
type Mode int32

const (
	Mode_UNKNOWN_MODE Mode = 0
	// Collect stats only for a bot group.
	Mode_MONITORED Mode = 1
	// Generate configuration updates for bot group.
	Mode_CONFIGURED Mode = 2
)

var Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x Mode) String() string {
	return proto.EnumName(Mode_name, int32(x))
}

func (Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{0}
}

// 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
)

var BotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var BotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x BotPolicy_Mode) String() string {
	return proto.EnumName(BotPolicy_Mode_name, int32(x))
}

func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []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
)

var BotPolicy_BotScalingMode_name = map[int32]string{
	0: "UNKNOWN_SCALING_MODE",
	1: "STEPPED",
	2: "DEMAND",
	3: "STEPPED_DECREASE",
}

var BotPolicy_BotScalingMode_value = map[string]int32{
	"UNKNOWN_SCALING_MODE": 0,
	"STEPPED":              1,
	"DEMAND":               2,
	"STEPPED_DECREASE":     3,
}

func (x BotPolicy_BotScalingMode) String() string {
	return proto.EnumName(BotPolicy_BotScalingMode_name, int32(x))
}

func (BotPolicy_BotScalingMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

// Specifies mode for a bot policy
type ReducedBotPolicy_Mode int32

const (
	ReducedBotPolicy_UNKNOWN_MODE ReducedBotPolicy_Mode = 0
	// Collect stats only for a bot group.
	ReducedBotPolicy_MONITORED ReducedBotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	ReducedBotPolicy_CONFIGURED ReducedBotPolicy_Mode = 2
)

var ReducedBotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var ReducedBotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x ReducedBotPolicy_Mode) String() string {
	return proto.EnumName(ReducedBotPolicy_Mode_name, int32(x))
}

func (ReducedBotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

// 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
)

var ScalingAction_Actionable_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "YES",
	2: "NO",
}

var ScalingAction_Actionable_value = map[string]int32{
	"UNSPECIFIED": 0,
	"YES":         1,
	"NO":          2,
}

func (x ScalingAction_Actionable) String() string {
	return proto.EnumName(ScalingAction_Actionable_name, int32(x))
}

func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotType) Reset()         { *m = BotType{} }
func (m *BotType) String() string { return proto.CompactTextString(m) }
func (*BotType) ProtoMessage()    {}
func (*BotType) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{0}
}

func (m *BotType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotType.Unmarshal(m, b)
}
func (m *BotType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotType.Marshal(b, m, deterministic)
}
func (m *BotType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotType.Merge(m, src)
}
func (m *BotType) XXX_Size() int {
	return xxx_messageInfo_BotType.Size(m)
}
func (m *BotType) XXX_DiscardUnknown() {
	xxx_messageInfo_BotType.DiscardUnknown(m)
}

var xxx_messageInfo_BotType proto.InternalMessageInfo

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

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

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

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

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SwarmingDimension) Reset()         { *m = SwarmingDimension{} }
func (m *SwarmingDimension) String() string { return proto.CompactTextString(m) }
func (*SwarmingDimension) ProtoMessage()    {}
func (*SwarmingDimension) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{1}
}

func (m *SwarmingDimension) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SwarmingDimension.Unmarshal(m, b)
}
func (m *SwarmingDimension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SwarmingDimension.Marshal(b, m, deterministic)
}
func (m *SwarmingDimension) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SwarmingDimension.Merge(m, src)
}
func (m *SwarmingDimension) XXX_Size() int {
	return xxx_messageInfo_SwarmingDimension.Size(m)
}
func (m *SwarmingDimension) XXX_DiscardUnknown() {
	xxx_messageInfo_SwarmingDimension.DiscardUnknown(m)
}

var xxx_messageInfo_SwarmingDimension proto.InternalMessageInfo

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

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

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

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy) Reset()         { *m = BotPolicy{} }
func (m *BotPolicy) String() string { return proto.CompactTextString(m) }
func (*BotPolicy) ProtoMessage()    {}
func (*BotPolicy) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2}
}

func (m *BotPolicy) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy.Unmarshal(m, b)
}
func (m *BotPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy.Marshal(b, m, deterministic)
}
func (m *BotPolicy) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy.Merge(m, src)
}
func (m *BotPolicy) XXX_Size() int {
	return xxx_messageInfo_BotPolicy.Size(m)
}
func (m *BotPolicy) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_ScalingRestriction) Reset()         { *m = BotPolicy_ScalingRestriction{} }
func (m *BotPolicy_ScalingRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_ScalingRestriction) ProtoMessage()    {}
func (*BotPolicy_ScalingRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

func (m *BotPolicy_ScalingRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_ScalingRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_ScalingRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_ScalingRestriction.Merge(m, src)
}
func (m *BotPolicy_ScalingRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Size(m)
}
func (m *BotPolicy_ScalingRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_ScalingRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_ScalingRestriction proto.InternalMessageInfo

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

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

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

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

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

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_RegionRestriction) Reset()         { *m = BotPolicy_RegionRestriction{} }
func (m *BotPolicy_RegionRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_RegionRestriction) ProtoMessage()    {}
func (*BotPolicy_RegionRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

func (m *BotPolicy_RegionRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_RegionRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_RegionRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_RegionRestriction.Merge(m, src)
}
func (m *BotPolicy_RegionRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Size(m)
}
func (m *BotPolicy_RegionRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_RegionRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_RegionRestriction proto.InternalMessageInfo

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

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

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

// Configures the root message.
type BotPolicyCfg struct {
	// All bot policies.
	BotPolicies          []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *BotPolicyCfg) Reset()         { *m = BotPolicyCfg{} }
func (m *BotPolicyCfg) String() string { return proto.CompactTextString(m) }
func (*BotPolicyCfg) ProtoMessage()    {}
func (*BotPolicyCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{3}
}

func (m *BotPolicyCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicyCfg.Unmarshal(m, b)
}
func (m *BotPolicyCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicyCfg.Marshal(b, m, deterministic)
}
func (m *BotPolicyCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicyCfg.Merge(m, src)
}
func (m *BotPolicyCfg) XXX_Size() int {
	return xxx_messageInfo_BotPolicyCfg.Size(m)
}
func (m *BotPolicyCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicyCfg.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicyCfg proto.InternalMessageInfo

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

// Reduced version of BotPolicy meant for output properties
type ReducedBotPolicy struct {
	// 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           ReducedBotPolicy_Mode `protobuf:"varint,3,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.ReducedBotPolicy_Mode" json:"policy_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *ReducedBotPolicy) Reset()         { *m = ReducedBotPolicy{} }
func (m *ReducedBotPolicy) String() string { return proto.CompactTextString(m) }
func (*ReducedBotPolicy) ProtoMessage()    {}
func (*ReducedBotPolicy) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4}
}

func (m *ReducedBotPolicy) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ReducedBotPolicy.Unmarshal(m, b)
}
func (m *ReducedBotPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ReducedBotPolicy.Marshal(b, m, deterministic)
}
func (m *ReducedBotPolicy) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ReducedBotPolicy.Merge(m, src)
}
func (m *ReducedBotPolicy) XXX_Size() int {
	return xxx_messageInfo_ReducedBotPolicy.Size(m)
}
func (m *ReducedBotPolicy) XXX_DiscardUnknown() {
	xxx_messageInfo_ReducedBotPolicy.DiscardUnknown(m)
}

var xxx_messageInfo_ReducedBotPolicy proto.InternalMessageInfo

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

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

func (m *ReducedBotPolicy) GetPolicyMode() ReducedBotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return ReducedBotPolicy_UNKNOWN_MODE
}

// Configures the root message.
type ReducedBotPolicyCfg struct {
	// All bot policies in reduced form.
	BotPolicies          []*ReducedBotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *ReducedBotPolicyCfg) Reset()         { *m = ReducedBotPolicyCfg{} }
func (m *ReducedBotPolicyCfg) String() string { return proto.CompactTextString(m) }
func (*ReducedBotPolicyCfg) ProtoMessage()    {}
func (*ReducedBotPolicyCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{5}
}

func (m *ReducedBotPolicyCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ReducedBotPolicyCfg.Unmarshal(m, b)
}
func (m *ReducedBotPolicyCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ReducedBotPolicyCfg.Marshal(b, m, deterministic)
}
func (m *ReducedBotPolicyCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ReducedBotPolicyCfg.Merge(m, src)
}
func (m *ReducedBotPolicyCfg) XXX_Size() int {
	return xxx_messageInfo_ReducedBotPolicyCfg.Size(m)
}
func (m *ReducedBotPolicyCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_ReducedBotPolicyCfg.DiscardUnknown(m)
}

var xxx_messageInfo_ReducedBotPolicyCfg proto.InternalMessageInfo

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

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction) Reset()         { *m = ScalingAction{} }
func (m *ScalingAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction) ProtoMessage()    {}
func (*ScalingAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6}
}

func (m *ScalingAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction.Unmarshal(m, b)
}
func (m *ScalingAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction.Merge(m, src)
}
func (m *ScalingAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction.Size(m)
}
func (m *ScalingAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction_RegionalAction) Reset()         { *m = ScalingAction_RegionalAction{} }
func (m *ScalingAction_RegionalAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction_RegionalAction) ProtoMessage()    {}
func (*ScalingAction_RegionalAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6, 0}
}

func (m *ScalingAction_RegionalAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction_RegionalAction.Unmarshal(m, b)
}
func (m *ScalingAction_RegionalAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction_RegionalAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction_RegionalAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction_RegionalAction.Merge(m, src)
}
func (m *ScalingAction_RegionalAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction_RegionalAction.Size(m)
}
func (m *ScalingAction_RegionalAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction_RegionalAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction_RegionalAction proto.InternalMessageInfo

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

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

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

// Resource utilization based on regional assignment.
type ResourceUtilization struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResourceUtilization) Reset()         { *m = ResourceUtilization{} }
func (m *ResourceUtilization) String() string { return proto.CompactTextString(m) }
func (*ResourceUtilization) ProtoMessage()    {}
func (*ResourceUtilization) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{7}
}

func (m *ResourceUtilization) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResourceUtilization.Unmarshal(m, b)
}
func (m *ResourceUtilization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResourceUtilization.Marshal(b, m, deterministic)
}
func (m *ResourceUtilization) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResourceUtilization.Merge(m, src)
}
func (m *ResourceUtilization) XXX_Size() int {
	return xxx_messageInfo_ResourceUtilization.Size(m)
}
func (m *ResourceUtilization) XXX_DiscardUnknown() {
	xxx_messageInfo_ResourceUtilization.DiscardUnknown(m)
}

var xxx_messageInfo_ResourceUtilization proto.InternalMessageInfo

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

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

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

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

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

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

// Application utilization, per application at a
// regional assignment.
type ApplicationUtilization struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ApplicationUtilization) Reset()         { *m = ApplicationUtilization{} }
func (m *ApplicationUtilization) String() string { return proto.CompactTextString(m) }
func (*ApplicationUtilization) ProtoMessage()    {}
func (*ApplicationUtilization) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{8}
}

func (m *ApplicationUtilization) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ApplicationUtilization.Unmarshal(m, b)
}
func (m *ApplicationUtilization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ApplicationUtilization.Marshal(b, m, deterministic)
}
func (m *ApplicationUtilization) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ApplicationUtilization.Merge(m, src)
}
func (m *ApplicationUtilization) XXX_Size() int {
	return xxx_messageInfo_ApplicationUtilization.Size(m)
}
func (m *ApplicationUtilization) XXX_DiscardUnknown() {
	xxx_messageInfo_ApplicationUtilization.DiscardUnknown(m)
}

var xxx_messageInfo_ApplicationUtilization proto.InternalMessageInfo

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

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

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	// 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"`
	XXX_NoUnkeyedLiteral    struct{}                  `json:"-"`
	XXX_unrecognized        []byte                    `json:"-"`
	XXX_sizecache           int32                     `json:"-"`
}

func (m *RoboCropAction) Reset()         { *m = RoboCropAction{} }
func (m *RoboCropAction) String() string { return proto.CompactTextString(m) }
func (*RoboCropAction) ProtoMessage()    {}
func (*RoboCropAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{9}
}

func (m *RoboCropAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RoboCropAction.Unmarshal(m, b)
}
func (m *RoboCropAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RoboCropAction.Marshal(b, m, deterministic)
}
func (m *RoboCropAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RoboCropAction.Merge(m, src)
}
func (m *RoboCropAction) XXX_Size() int {
	return xxx_messageInfo_RoboCropAction.Size(m)
}
func (m *RoboCropAction) XXX_DiscardUnknown() {
	xxx_messageInfo_RoboCropAction.DiscardUnknown(m)
}

var xxx_messageInfo_RoboCropAction proto.InternalMessageInfo

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

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

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

func init() {
	proto.RegisterEnum("chromiumos.Mode", Mode_name, Mode_value)
	proto.RegisterEnum("chromiumos.BotPolicy_Mode", BotPolicy_Mode_name, BotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.BotPolicy_BotScalingMode", BotPolicy_BotScalingMode_name, BotPolicy_BotScalingMode_value)
	proto.RegisterEnum("chromiumos.ReducedBotPolicy_Mode", ReducedBotPolicy_Mode_name, ReducedBotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.ScalingAction_Actionable", ScalingAction_Actionable_name, ScalingAction_Actionable_value)
	proto.RegisterType((*BotType)(nil), "chromiumos.BotType")
	proto.RegisterType((*SwarmingDimension)(nil), "chromiumos.SwarmingDimension")
	proto.RegisterType((*BotPolicy)(nil), "chromiumos.BotPolicy")
	proto.RegisterType((*BotPolicy_ScalingRestriction)(nil), "chromiumos.BotPolicy.ScalingRestriction")
	proto.RegisterType((*BotPolicy_RegionRestriction)(nil), "chromiumos.BotPolicy.RegionRestriction")
	proto.RegisterType((*BotPolicyCfg)(nil), "chromiumos.BotPolicyCfg")
	proto.RegisterType((*ReducedBotPolicy)(nil), "chromiumos.ReducedBotPolicy")
	proto.RegisterType((*ReducedBotPolicyCfg)(nil), "chromiumos.ReducedBotPolicyCfg")
	proto.RegisterType((*ScalingAction)(nil), "chromiumos.ScalingAction")
	proto.RegisterType((*ScalingAction_RegionalAction)(nil), "chromiumos.ScalingAction.RegionalAction")
	proto.RegisterType((*ResourceUtilization)(nil), "chromiumos.ResourceUtilization")
	proto.RegisterType((*ApplicationUtilization)(nil), "chromiumos.ApplicationUtilization")
	proto.RegisterType((*RoboCropAction)(nil), "chromiumos.RoboCropAction")
}

func init() { proto.RegisterFile("chromiumos/bot_scaling.proto", fileDescriptor_dbe70eabfd64e7ef) }

var fileDescriptor_dbe70eabfd64e7ef = []byte{
	// 1158 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x5d, 0x8f, 0xdb, 0x44,
	0x17, 0xae, 0xf3, 0xd9, 0x9c, 0xec, 0xa6, 0xde, 0xc9, 0xbe, 0xad, 0xdb, 0xb7, 0xa8, 0xa9, 0x05,
	0x22, 0x02, 0x29, 0x2b, 0x2d, 0x08, 0x90, 0xb8, 0x40, 0xf9, 0xda, 0x34, 0x82, 0x4d, 0xa2, 0x49,
	0x17, 0x28, 0x48, 0x58, 0xb6, 0x33, 0xeb, 0x1d, 0xad, 0xed, 0x31, 0x1e, 0x67, 0xbb, 0xbb, 0x3f,
	0x00, 0x71, 0xc5, 0xaf, 0xe0, 0x96, 0x7b, 0x7e, 0x0c, 0xbf, 0x84, 0x2b, 0x34, 0xe3, 0x71, 0xbe,
	0xbb, 0x12, 0x15, 0xbd, 0x9b, 0xf3, 0x9c, 0x99, 0x73, 0xce, 0x3c, 0xf3, 0x9c, 0x63, 0xc3, 0x53,
	0xf7, 0x22, 0x66, 0x01, 0x9d, 0x07, 0x8c, 0x1f, 0x39, 0x2c, 0xb1, 0xb8, 0x6b, 0xfb, 0x34, 0xf4,
	0x5a, 0x51, 0xcc, 0x12, 0x86, 0x60, 0xe9, 0x35, 0x7f, 0xd1, 0xa0, 0xdc, 0x61, 0xc9, 0xcb, 0x9b,
	0x88, 0xa0, 0xc7, 0x70, 0x5f, 0x6e, 0xa6, 0xb7, 0xc4, 0xd0, 0x1a, 0x5a, 0xb3, 0x82, 0xcb, 0x0e,
	0x4b, 0xa6, 0xf4, 0x96, 0x20, 0x13, 0xf6, 0x5d, 0x16, 0x13, 0x6e, 0x45, 0x24, 0xb6, 0x1c, 0x96,
	0x18, 0xb9, 0x86, 0xd6, 0xcc, 0xe1, 0xaa, 0x04, 0x27, 0x24, 0xee, 0xb0, 0x04, 0x3d, 0x83, 0xea,
	0x05, 0x9b, 0xc7, 0xfe, 0x8d, 0xe5, 0x32, 0x9e, 0x18, 0x79, 0xb9, 0x03, 0x52, 0xa8, 0xcb, 0x78,
	0x82, 0xfe, 0x0f, 0x95, 0x80, 0x04, 0x2c, 0xbe, 0xb1, 0x3c, 0xc7, 0x28, 0x48, 0xf7, 0xfd, 0x14,
	0x18, 0x38, 0xe6, 0x19, 0x1c, 0x4c, 0x5f, 0xdb, 0x71, 0x40, 0x43, 0xaf, 0x47, 0x03, 0x12, 0x72,
	0xca, 0x42, 0x84, 0xa0, 0x10, 0xda, 0x41, 0x56, 0x8d, 0x5c, 0xa3, 0x43, 0x28, 0x5e, 0xd9, 0xfe,
	0x9c, 0xc8, 0x12, 0x2a, 0x38, 0x35, 0xd0, 0x43, 0x28, 0xc9, 0x05, 0x37, 0xf2, 0x8d, 0x7c, 0xb3,
	0x82, 0x95, 0x65, 0xfe, 0x5d, 0x86, 0x4a, 0x87, 0x25, 0x13, 0xe6, 0x53, 0xf7, 0x46, 0x54, 0x20,
	0x6e, 0xe8, 0xc5, 0x6c, 0x1e, 0xa9, 0xa0, 0xe2, 0xca, 0x03, 0x61, 0xa3, 0x56, 0x7a, 0xfd, 0xe4,
	0x26, 0x4a, 0x63, 0x57, 0x8f, 0xeb, 0xad, 0x25, 0x53, 0x2d, 0xc5, 0x92, 0xe4, 0x44, 0xd2, 0xf5,
	0x0a, 0xea, 0x8a, 0x57, 0x2b, 0x26, 0x3c, 0x89, 0xa9, 0x9b, 0x50, 0x16, 0xca, 0x7b, 0x57, 0x8f,
	0x9b, 0x1b, 0x47, 0xd3, 0x02, 0x5a, 0xd3, 0xf4, 0x00, 0x5e, 0xee, 0xc7, 0x88, 0x6f, 0x61, 0xe8,
	0x7b, 0xa8, 0xc7, 0xc4, 0xa3, 0x2c, 0x5c, 0x8d, 0xcc, 0x8d, 0x42, 0x23, 0xdf, 0xac, 0x1e, 0x7f,
	0xb8, 0x3b, 0x34, 0x96, 0x07, 0xd6, 0x22, 0xc7, 0x9b, 0x10, 0x47, 0x23, 0xa8, 0x73, 0x45, 0xb3,
	0x35, 0xcb, 0x78, 0xe6, 0x46, 0x51, 0x46, 0x7e, 0x6f, 0x35, 0xf2, 0xd6, 0x6b, 0x60, 0xc4, 0x37,
	0x21, 0x8e, 0xbe, 0x84, 0x6a, 0x24, 0xf3, 0x5b, 0x01, 0x9b, 0x11, 0xa3, 0xd4, 0xd0, 0x9a, 0xb5,
	0xe3, 0x27, 0xbb, 0x2b, 0x3c, 0x65, 0x33, 0x82, 0x21, 0xdd, 0x2e, 0xd6, 0xe8, 0x03, 0xa8, 0xf9,
	0x8c, 0x5d, 0x3a, 0xb6, 0x7b, 0x69, 0x09, 0x9d, 0x70, 0xa3, 0xdc, 0xd0, 0x9a, 0x07, 0x78, 0x3f,
	0x43, 0x5f, 0x08, 0x10, 0x0d, 0x60, 0x2f, 0x23, 0x5a, 0x26, 0xb9, 0x2f, 0x93, 0xbc, 0xbf, 0x3b,
	0x49, 0x87, 0x25, 0x8a, 0x64, 0x99, 0xae, 0xca, 0x97, 0x06, 0xfa, 0x18, 0x0e, 0x16, 0x97, 0xa7,
	0x21, 0x4f, 0xec, 0xd0, 0x25, 0x46, 0x45, 0xca, 0x40, 0xcf, 0x1c, 0x43, 0x85, 0xa3, 0x06, 0x54,
	0xed, 0x28, 0xf2, 0xa9, 0x6b, 0xcb, 0x67, 0x05, 0xb9, 0x6d, 0x15, 0x7a, 0xf2, 0x87, 0x06, 0x68,
	0xfb, 0x41, 0x45, 0x1f, 0x08, 0x1d, 0xb9, 0x84, 0x0a, 0x8f, 0x94, 0x59, 0x11, 0x83, 0xc3, 0x92,
	0x6e, 0x8a, 0x64, 0x2a, 0x3c, 0xf7, 0x19, 0x8b, 0xa5, 0xd2, 0x8a, 0x52, 0x85, 0x27, 0xc2, 0x16,
	0x4d, 0x18, 0xd0, 0xd0, 0xa2, 0x33, 0x9f, 0x48, 0x29, 0x15, 0x71, 0x39, 0xa0, 0xe1, 0x70, 0xe6,
	0x13, 0x71, 0x8e, 0x27, 0x24, 0x4a, 0x1b, 0xb4, 0x90, 0x9e, 0x13, 0x80, 0xec, 0xd0, 0xe7, 0xb0,
	0x27, 0x83, 0xda, 0xbe, 0x2f, 0x98, 0x33, 0x8a, 0xd2, 0x2f, 0x2a, 0x39, 0x51, 0xd0, 0x93, 0x1f,
	0xe1, 0x60, 0x4b, 0x24, 0xa2, 0x71, 0x52, 0x99, 0xa8, 0x7e, 0x50, 0x96, 0xc0, 0xa3, 0x98, 0x9c,
	0xd3, 0x6b, 0xd5, 0x67, 0xca, 0x12, 0xf8, 0x6b, 0x42, 0xbd, 0x8b, 0xac, 0xc1, 0x95, 0x65, 0x7e,
	0x0e, 0x05, 0xc9, 0xb1, 0x0e, 0x7b, 0x67, 0xa3, 0xaf, 0x47, 0xe3, 0xef, 0x46, 0xd6, 0xe9, 0xb8,
	0xd7, 0xd7, 0xef, 0xa1, 0x7d, 0xa8, 0x9c, 0x8e, 0x47, 0xc3, 0x97, 0x63, 0xdc, 0xef, 0xe9, 0x1a,
	0xaa, 0x01, 0x74, 0xc7, 0xa3, 0x93, 0xe1, 0xe0, 0x4c, 0xd8, 0x39, 0xf3, 0x15, 0xd4, 0xd6, 0xdf,
	0x0c, 0x19, 0x70, 0x98, 0x85, 0x98, 0x76, 0xdb, 0xdf, 0x0c, 0x47, 0x83, 0x2c, 0x54, 0x15, 0xca,
	0xd3, 0x97, 0xfd, 0xc9, 0x44, 0x06, 0x02, 0x28, 0xf5, 0xfa, 0xa7, 0xed, 0x51, 0x4f, 0xcf, 0xa1,
	0x43, 0xd0, 0x95, 0xc3, 0xea, 0xf5, 0xbb, 0xb8, 0xdf, 0x9e, 0xf6, 0xf5, 0xbc, 0xf9, 0x02, 0xf6,
	0x16, 0xc2, 0xe8, 0x9e, 0x7b, 0xe8, 0x8b, 0x94, 0x23, 0xa9, 0x40, 0x4a, 0xb8, 0xa1, 0x49, 0xd5,
	0xff, 0x6f, 0xa7, 0x90, 0x24, 0x75, 0x13, 0xb5, 0xd3, 0xfc, 0x4b, 0x03, 0x1d, 0x93, 0xd9, 0xdc,
	0x25, 0xb3, 0x77, 0x34, 0x4d, 0x3a, 0xeb, 0x8d, 0x94, 0x97, 0x1a, 0x7f, 0xbe, 0x7a, 0x64, 0x33,
	0xff, 0x56, 0x3f, 0xbd, 0xfd, 0x1b, 0x7c, 0x0b, 0xf5, 0xcd, 0xe8, 0x82, 0xaf, 0xaf, 0x76, 0xf2,
	0xf5, 0xf4, 0xae, 0xa2, 0xd6, 0x69, 0xfb, 0xb3, 0x00, 0xfb, 0xea, 0x65, 0xdb, 0xa9, 0xdc, 0xfe,
	0x53, 0xce, 0x7a, 0x00, 0xb6, 0x0c, 0x6b, 0x3b, 0x7e, 0x46, 0xd9, 0xda, 0x58, 0x58, 0xcb, 0xdd,
	0x6a, 0x2f, 0xf6, 0xe2, 0x95, 0x73, 0x62, 0x0a, 0x39, 0x2c, 0xe1, 0x56, 0x4c, 0x7e, 0x9e, 0x13,
	0x9e, 0x90, 0x99, 0xea, 0xad, 0x7d, 0x81, 0xe2, 0x0c, 0x44, 0x53, 0xd0, 0xd3, 0xd6, 0xb0, 0x7d,
	0xcb, 0x56, 0x03, 0x39, 0x1d, 0x9b, 0xcd, 0x37, 0xa7, 0xc4, 0xea, 0x44, 0x6a, 0xe2, 0x07, 0xf1,
	0x9a, 0xcd, 0xc5, 0x44, 0x22, 0x3c, 0xa1, 0x81, 0x9d, 0x90, 0x99, 0xc5, 0xed, 0x2b, 0x1a, 0x7a,
	0x5c, 0x0e, 0xd1, 0x1c, 0xd6, 0x17, 0x8e, 0x69, 0x8a, 0xa3, 0x47, 0x20, 0x6e, 0x6e, 0x05, 0x34,
	0x94, 0x73, 0xb2, 0x88, 0x4b, 0x0e, 0x4b, 0x4e, 0x69, 0xb8, 0x70, 0xd8, 0xd7, 0x72, 0x36, 0x2a,
	0x87, 0x7d, 0xbd, 0x39, 0xc3, 0x2a, 0xdb, 0x33, 0xcc, 0x83, 0xda, 0x7a, 0x8d, 0xff, 0x7a, 0x20,
	0x6c, 0xd3, 0x97, 0xdf, 0x41, 0x9f, 0xd9, 0x02, 0x58, 0xf2, 0x8f, 0x1e, 0x40, 0xf5, 0x6c, 0x34,
	0x9d, 0xf4, 0xbb, 0xc3, 0x93, 0x61, 0xbf, 0xa7, 0xdf, 0x43, 0x65, 0xc8, 0xbf, 0xea, 0x4f, 0x75,
	0x0d, 0x95, 0x20, 0x37, 0x1a, 0xeb, 0x39, 0xf3, 0x77, 0x4d, 0x68, 0x92, 0xb3, 0x79, 0xec, 0x92,
	0xb3, 0x84, 0xfa, 0xf4, 0xd6, 0xbe, 0xb3, 0x3c, 0x1d, 0xf2, 0x57, 0x01, 0x57, 0xe3, 0x54, 0x2c,
	0xc5, 0xcf, 0x83, 0x1b, 0xcd, 0xb9, 0x9a, 0x53, 0x72, 0x7d, 0xe7, 0x2f, 0x88, 0xa0, 0x71, 0x46,
	0xf9, 0xa5, 0x70, 0x15, 0xd3, 0xd9, 0x26, 0xcc, 0x81, 0x23, 0x67, 0xb2, 0x7d, 0x6d, 0xc9, 0x68,
	0xe9, 0xe3, 0x94, 0x03, 0xfb, 0xba, 0x1b, 0xcd, 0xb9, 0xf9, 0x9b, 0x06, 0x0f, 0xdb, 0x4b, 0x3e,
	0x57, 0x2b, 0xdd, 0x20, 0x5f, 0xdb, 0x22, 0x1f, 0x61, 0x38, 0x8c, 0xd5, 0x15, 0xad, 0xf9, 0xf2,
	0xa4, 0x91, 0x93, 0xb2, 0x7a, 0xb6, 0xde, 0x67, 0x5b, 0x54, 0xe0, 0x7a, 0xbc, 0x0d, 0x9a, 0xbf,
	0xe6, 0xa0, 0x86, 0x99, 0xc3, 0xba, 0x31, 0x8b, 0xd4, 0x8b, 0x76, 0xe0, 0x41, 0xf6, 0xfd, 0xcc,
	0x84, 0x9b, 0x76, 0xf2, 0xe3, 0x37, 0x0a, 0x17, 0xd7, 0xf8, 0xaa, 0xc9, 0xdf, 0x45, 0xa9, 0xe8,
	0x27, 0x78, 0x2c, 0xd8, 0xb0, 0x76, 0x06, 0xce, 0xcb, 0xc0, 0xe6, 0x6a, 0xe0, 0xdd, 0x3c, 0xe3,
	0x47, 0x22, 0xc8, 0x8e, 0xa4, 0x1f, 0xbd, 0xed, 0x38, 0xec, 0x7c, 0xf6, 0xc3, 0xa7, 0x1e, 0x5b,
	0x64, 0x6e, 0xb1, 0xd8, 0x3b, 0x5a, 0xf9, 0xa1, 0xa6, 0xe1, 0x79, 0x6c, 0x1f, 0xc9, 0x5f, 0xe9,
	0x23, 0x8f, 0xad, 0x78, 0x9c, 0x92, 0x04, 0x3f, 0xf9, 0x27, 0x00, 0x00, 0xff, 0xff, 0xe4, 0x87,
	0x25, 0xe4, 0x7f, 0x0b, 0x00, 0x00,
}
