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

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

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

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 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{4, 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
}

// 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{4}
}

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{4, 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{5}
}

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{6}
}

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{7}
}

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