// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/suite_scheduler.proto

package testplans

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

// Branches that can be targeted.
type Branch int32

const (
	Branch_BRANCH_UNSPECIFIED Branch = 0
	// Canary Branch or ToT.
	Branch_CANARY Branch = 1
	// Dev Branch or ToT-1.
	Branch_DEV Branch = 2
	// Beta Branch or ToT-2.
	Branch_BETA Branch = 3
	// Stable Branch or ToT-3.
	Branch_STABLE Branch = 4
)

var Branch_name = map[int32]string{
	0: "BRANCH_UNSPECIFIED",
	1: "CANARY",
	2: "DEV",
	3: "BETA",
	4: "STABLE",
}

var Branch_value = map[string]int32{
	"BRANCH_UNSPECIFIED": 0,
	"CANARY":             1,
	"DEV":                2,
	"BETA":               3,
	"STABLE":             4,
}

func (x Branch) String() string {
	return proto.EnumName(Branch_name, int32(x))
}

func (Branch) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_905bf28b41c26c54, []int{0}
}

// Whether to use firmware from ToT or firmware branch.
type SchedulerConfig_FirmwareBranch int32

const (
	SchedulerConfig_UNSPECIFIED SchedulerConfig_FirmwareBranch = 0
	// ToT branch.
	SchedulerConfig_CROS SchedulerConfig_FirmwareBranch = 1
	// Firmware branch.
	SchedulerConfig_FIRMWARE SchedulerConfig_FirmwareBranch = 2
)

var SchedulerConfig_FirmwareBranch_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "CROS",
	2: "FIRMWARE",
}

var SchedulerConfig_FirmwareBranch_value = map[string]int32{
	"UNSPECIFIED": 0,
	"CROS":        1,
	"FIRMWARE":    2,
}

func (x SchedulerConfig_FirmwareBranch) String() string {
	return proto.EnumName(SchedulerConfig_FirmwareBranch_name, int32(x))
}

func (SchedulerConfig_FirmwareBranch) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_905bf28b41c26c54, []int{3, 0}
}

// LaunchProfile defines how often the suite is launched.
type SchedulerConfig_LaunchCriteria_LaunchProfile int32

const (
	SchedulerConfig_LaunchCriteria_UNSPECIFIED SchedulerConfig_LaunchCriteria_LaunchProfile = 0
	// Run on every new release build of the boards/variants targeted.
	SchedulerConfig_LaunchCriteria_NEW_BUILD SchedulerConfig_LaunchCriteria_LaunchProfile = 1
	// Run once a day at the specified hour. Used to be "NIGHTLY".
	SchedulerConfig_LaunchCriteria_DAILY SchedulerConfig_LaunchCriteria_LaunchProfile = 2
	// Run once a week at the specified time.
	SchedulerConfig_LaunchCriteria_WEEKLY SchedulerConfig_LaunchCriteria_LaunchProfile = 3
	// NOT SUPPORTED. Will be supported in the redesign.
	SchedulerConfig_LaunchCriteria_CRON_BASED SchedulerConfig_LaunchCriteria_LaunchProfile = 4
)

var SchedulerConfig_LaunchCriteria_LaunchProfile_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEW_BUILD",
	2: "DAILY",
	3: "WEEKLY",
	4: "CRON_BASED",
}

var SchedulerConfig_LaunchCriteria_LaunchProfile_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEW_BUILD":   1,
	"DAILY":       2,
	"WEEKLY":      3,
	"CRON_BASED":  4,
}

func (x SchedulerConfig_LaunchCriteria_LaunchProfile) String() string {
	return proto.EnumName(SchedulerConfig_LaunchCriteria_LaunchProfile_name, int32(x))
}

func (SchedulerConfig_LaunchCriteria_LaunchProfile) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_905bf28b41c26c54, []int{3, 1, 0}
}

// Defines a board, its variants and its models.
type Board struct {
	// Name of the board. Eg: eve.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// List of variants assiciated with the board.
	// This should only be the suffixes. Eg: ['-kernelnext'].
	Variants []string `protobuf:"bytes,2,rep,name=variants,proto3" json:"variants,omitempty"`
	// List of models of the boards to test on.
	Models               []string `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Board proto.InternalMessageInfo

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

func (m *Board) GetVariants() []string {
	if m != nil {
		return m.Variants
	}
	return nil
}

func (m *Board) GetModels() []string {
	if m != nil {
		return m.Models
	}
	return nil
}

// Aims to reflect data in lab_config.ini.
type LabConfig struct {
	// List of board definitions.
	Boards               []*Board `protobuf:"bytes,1,rep,name=boards,proto3" json:"boards,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LabConfig proto.InternalMessageInfo

func (m *LabConfig) GetBoards() []*Board {
	if m != nil {
		return m.Boards
	}
	return nil
}

// Specify a Board and Variant pair.
type BoardVariant struct {
	Board                string   `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	Variant              string   `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BoardVariant proto.InternalMessageInfo

func (m *BoardVariant) GetBoard() string {
	if m != nil {
		return m.Board
	}
	return ""
}

func (m *BoardVariant) GetVariant() string {
	if m != nil {
		return m.Variant
	}
	return ""
}

// Most fields are the same as suite_scheduler.ini just better organized.
// The entries will be used to generate a suite_scheduler.ini in starlark scripts.
type SchedulerConfig struct {
	// Name of the config. Needs to be unique.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Name of the suite to run.
	Suite          string                          `protobuf:"bytes,2,opt,name=suite,proto3" json:"suite,omitempty"`
	Contacts       []*SchedulerConfig_Contact      `protobuf:"bytes,3,rep,name=contacts,proto3" json:"contacts,omitempty"`
	LaunchCriteria *SchedulerConfig_LaunchCriteria `protobuf:"bytes,4,opt,name=launch_criteria,json=launchCriteria,proto3" json:"launch_criteria,omitempty"`
	// Branches to target.
	Branches             []Branch                       `protobuf:"varint,5,rep,packed,name=branches,proto3,enum=testplans.Branch" json:"branches,omitempty"`
	TargetOptions        *SchedulerConfig_TargetOptions `protobuf:"bytes,6,opt,name=target_options,json=targetOptions,proto3" json:"target_options,omitempty"`
	PoolOptions          *SchedulerConfig_PoolOptions   `protobuf:"bytes,7,opt,name=pool_options,json=poolOptions,proto3" json:"pool_options,omitempty"`
	FirmwareRoBuildSpec  SchedulerConfig_FirmwareBranch `protobuf:"varint,8,opt,name=firmware_ro_build_spec,json=firmwareRoBuildSpec,proto3,enum=testplans.SchedulerConfig_FirmwareBranch" json:"firmware_ro_build_spec,omitempty"`
	RunOptions           *SchedulerConfig_RunOptions    `protobuf:"bytes,9,opt,name=run_options,json=runOptions,proto3" json:"run_options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig proto.InternalMessageInfo

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

func (m *SchedulerConfig) GetSuite() string {
	if m != nil {
		return m.Suite
	}
	return ""
}

func (m *SchedulerConfig) GetContacts() []*SchedulerConfig_Contact {
	if m != nil {
		return m.Contacts
	}
	return nil
}

func (m *SchedulerConfig) GetLaunchCriteria() *SchedulerConfig_LaunchCriteria {
	if m != nil {
		return m.LaunchCriteria
	}
	return nil
}

func (m *SchedulerConfig) GetBranches() []Branch {
	if m != nil {
		return m.Branches
	}
	return nil
}

func (m *SchedulerConfig) GetTargetOptions() *SchedulerConfig_TargetOptions {
	if m != nil {
		return m.TargetOptions
	}
	return nil
}

func (m *SchedulerConfig) GetPoolOptions() *SchedulerConfig_PoolOptions {
	if m != nil {
		return m.PoolOptions
	}
	return nil
}

func (m *SchedulerConfig) GetFirmwareRoBuildSpec() SchedulerConfig_FirmwareBranch {
	if m != nil {
		return m.FirmwareRoBuildSpec
	}
	return SchedulerConfig_UNSPECIFIED
}

func (m *SchedulerConfig) GetRunOptions() *SchedulerConfig_RunOptions {
	if m != nil {
		return m.RunOptions
	}
	return nil
}

// Contact emails will one day be paged in case of problems with the config.
type SchedulerConfig_Contact struct {
	Email                string   `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig_Contact proto.InternalMessageInfo

func (m *SchedulerConfig_Contact) GetEmail() string {
	if m != nil {
		return m.Email
	}
	return ""
}

// LaunchCriteria specifies when the suite should be launched.
type SchedulerConfig_LaunchCriteria struct {
	LaunchProfile SchedulerConfig_LaunchCriteria_LaunchProfile `protobuf:"varint,1,opt,name=launch_profile,json=launchProfile,proto3,enum=testplans.SchedulerConfig_LaunchCriteria_LaunchProfile" json:"launch_profile,omitempty"`
	// Hour at which to run. Needs to be specified for nightly and weekly profiles.
	// Has to be [0, 23].
	Hour int32 `protobuf:"varint,2,opt,name=hour,proto3" json:"hour,omitempty"`
	// Day on which to run. Needs to be specified for weekly profile.
	// Has to be [0, 6].
	Day int32 `protobuf:"varint,3,opt,name=day,proto3" json:"day,omitempty"`
	// NOT SUPPORTED. Cron compatible schedule eg: "* * 1,3,5 * *".
	CronSchedule         string   `protobuf:"bytes,4,opt,name=cron_schedule,json=cronSchedule,proto3" json:"cron_schedule,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig_LaunchCriteria proto.InternalMessageInfo

func (m *SchedulerConfig_LaunchCriteria) GetLaunchProfile() SchedulerConfig_LaunchCriteria_LaunchProfile {
	if m != nil {
		return m.LaunchProfile
	}
	return SchedulerConfig_LaunchCriteria_UNSPECIFIED
}

func (m *SchedulerConfig_LaunchCriteria) GetHour() int32 {
	if m != nil {
		return m.Hour
	}
	return 0
}

func (m *SchedulerConfig_LaunchCriteria) GetDay() int32 {
	if m != nil {
		return m.Day
	}
	return 0
}

func (m *SchedulerConfig_LaunchCriteria) GetCronSchedule() string {
	if m != nil {
		return m.CronSchedule
	}
	return ""
}

// Set of boards, variants and models to target.
type SchedulerConfig_TargetOptions struct {
	// Use at the most one among the two fields below. If boards_list is empty,
	// all boards are targeted. exclude_boards will exclude those boards from
	// the all boards list.
	BoardsList    []string `protobuf:"bytes,1,rep,name=boards_list,json=boardsList,proto3" json:"boards_list,omitempty"`
	ExcludeBoards []string `protobuf:"bytes,2,rep,name=exclude_boards,json=excludeBoards,proto3" json:"exclude_boards,omitempty"`
	// To specify variants, either all variants can be skipped.
	SkipVariants bool `protobuf:"varint,8,opt,name=skip_variants,json=skipVariants,proto3" json:"skip_variants,omitempty"`
	// OR use at the most one among the two fields below. If variants_list is empty,
	// all variants are targeted. exclude_variants will exclude those variants
	// from the all variants list.
	VariantsList    []*BoardVariant `protobuf:"bytes,3,rep,name=variants_list,json=variantsList,proto3" json:"variants_list,omitempty"`
	ExcludeVariants []*BoardVariant `protobuf:"bytes,4,rep,name=exclude_variants,json=excludeVariants,proto3" json:"exclude_variants,omitempty"`
	// There's two ways of specifying models. If all of these fields are empty,
	// all possible models are targeted.
	// Models to be targeted can be listed explicitly in models_list.
	ModelsList []string `protobuf:"bytes,5,rep,name=models_list,json=modelsList,proto3" json:"models_list,omitempty"`
	// OR start with the complete list and exclude some specific models.
	// any_model only tests the suite on a single model.
	AnyModel             bool     `protobuf:"varint,6,opt,name=any_model,json=anyModel,proto3" json:"any_model,omitempty"`
	ExcludeModels        []string `protobuf:"bytes,7,rep,name=exclude_models,json=excludeModels,proto3" json:"exclude_models,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig_TargetOptions proto.InternalMessageInfo

func (m *SchedulerConfig_TargetOptions) GetBoardsList() []string {
	if m != nil {
		return m.BoardsList
	}
	return nil
}

func (m *SchedulerConfig_TargetOptions) GetExcludeBoards() []string {
	if m != nil {
		return m.ExcludeBoards
	}
	return nil
}

func (m *SchedulerConfig_TargetOptions) GetSkipVariants() bool {
	if m != nil {
		return m.SkipVariants
	}
	return false
}

func (m *SchedulerConfig_TargetOptions) GetVariantsList() []*BoardVariant {
	if m != nil {
		return m.VariantsList
	}
	return nil
}

func (m *SchedulerConfig_TargetOptions) GetExcludeVariants() []*BoardVariant {
	if m != nil {
		return m.ExcludeVariants
	}
	return nil
}

func (m *SchedulerConfig_TargetOptions) GetModelsList() []string {
	if m != nil {
		return m.ModelsList
	}
	return nil
}

func (m *SchedulerConfig_TargetOptions) GetAnyModel() bool {
	if m != nil {
		return m.AnyModel
	}
	return false
}

func (m *SchedulerConfig_TargetOptions) GetExcludeModels() []string {
	if m != nil {
		return m.ExcludeModels
	}
	return nil
}

// Aggregate of options related to DUT pool.
type SchedulerConfig_PoolOptions struct {
	// Quota Scheduler account to use.
	QsAccount string `protobuf:"bytes,1,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	// Pool to schedule on.
	Pool string `protobuf:"bytes,2,opt,name=pool,proto3" json:"pool,omitempty"`
	// Integer priority to assign. Only used by CTS. Quota scheduler takes care of
	// priorities for the rest. Has to be [20, 255].
	Priority             int32    `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig_PoolOptions proto.InternalMessageInfo

func (m *SchedulerConfig_PoolOptions) GetQsAccount() string {
	if m != nil {
		return m.QsAccount
	}
	return ""
}

func (m *SchedulerConfig_PoolOptions) GetPool() string {
	if m != nil {
		return m.Pool
	}
	return ""
}

func (m *SchedulerConfig_PoolOptions) GetPriority() int32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

// Execution related options.
type SchedulerConfig_RunOptions struct {
	// Whether to retry if the task fails.
	Retry      bool                                            `protobuf:"varint,1,opt,name=retry,proto3" json:"retry,omitempty"`
	Dimensions []*SchedulerConfig_RunOptions_SwarmingDimension `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// Timeout of the task.
	TimeoutMins int32 `protobuf:"varint,3,opt,name=timeout_mins,json=timeoutMins,proto3" json:"timeout_mins,omitempty"`
	// If sanity HW test passed, launch this test. Irrespective of the release build's
	// final status.
	OnlySanityTestRequired bool     `protobuf:"varint,4,opt,name=only_sanity_test_required,json=onlySanityTestRequired,proto3" json:"only_sanity_test_required,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerConfig_RunOptions proto.InternalMessageInfo

func (m *SchedulerConfig_RunOptions) GetRetry() bool {
	if m != nil {
		return m.Retry
	}
	return false
}

func (m *SchedulerConfig_RunOptions) GetDimensions() []*SchedulerConfig_RunOptions_SwarmingDimension {
	if m != nil {
		return m.Dimensions
	}
	return nil
}

func (m *SchedulerConfig_RunOptions) GetTimeoutMins() int32 {
	if m != nil {
		return m.TimeoutMins
	}
	return 0
}

func (m *SchedulerConfig_RunOptions) GetOnlySanityTestRequired() bool {
	if m != nil {
		return m.OnlySanityTestRequired
	}
	return false
}

// A list of extra labels/dimensions to attach.
// Extra Swarming Dimensions that can be specified.
type SchedulerConfig_RunOptions_SwarmingDimension struct {
	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SchedulerConfig_RunOptions_SwarmingDimension) Reset() {
	*m = SchedulerConfig_RunOptions_SwarmingDimension{}
}
func (m *SchedulerConfig_RunOptions_SwarmingDimension) String() string {
	return proto.CompactTextString(m)
}
func (*SchedulerConfig_RunOptions_SwarmingDimension) ProtoMessage() {}
func (*SchedulerConfig_RunOptions_SwarmingDimension) Descriptor() ([]byte, []int) {
	return fileDescriptor_905bf28b41c26c54, []int{3, 4, 0}
}

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

var xxx_messageInfo_SchedulerConfig_RunOptions_SwarmingDimension proto.InternalMessageInfo

func (m *SchedulerConfig_RunOptions_SwarmingDimension) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

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

// A proto to contain all the configs.
type SchedulerCfg struct {
	Configs              []*SchedulerConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_SchedulerCfg proto.InternalMessageInfo

func (m *SchedulerCfg) GetConfigs() []*SchedulerConfig {
	if m != nil {
		return m.Configs
	}
	return nil
}

func init() {
	proto.RegisterEnum("testplans.Branch", Branch_name, Branch_value)
	proto.RegisterEnum("testplans.SchedulerConfig_FirmwareBranch", SchedulerConfig_FirmwareBranch_name, SchedulerConfig_FirmwareBranch_value)
	proto.RegisterEnum("testplans.SchedulerConfig_LaunchCriteria_LaunchProfile", SchedulerConfig_LaunchCriteria_LaunchProfile_name, SchedulerConfig_LaunchCriteria_LaunchProfile_value)
	proto.RegisterType((*Board)(nil), "testplans.Board")
	proto.RegisterType((*LabConfig)(nil), "testplans.LabConfig")
	proto.RegisterType((*BoardVariant)(nil), "testplans.BoardVariant")
	proto.RegisterType((*SchedulerConfig)(nil), "testplans.SchedulerConfig")
	proto.RegisterType((*SchedulerConfig_Contact)(nil), "testplans.SchedulerConfig.Contact")
	proto.RegisterType((*SchedulerConfig_LaunchCriteria)(nil), "testplans.SchedulerConfig.LaunchCriteria")
	proto.RegisterType((*SchedulerConfig_TargetOptions)(nil), "testplans.SchedulerConfig.TargetOptions")
	proto.RegisterType((*SchedulerConfig_PoolOptions)(nil), "testplans.SchedulerConfig.PoolOptions")
	proto.RegisterType((*SchedulerConfig_RunOptions)(nil), "testplans.SchedulerConfig.RunOptions")
	proto.RegisterType((*SchedulerConfig_RunOptions_SwarmingDimension)(nil), "testplans.SchedulerConfig.RunOptions.SwarmingDimension")
	proto.RegisterType((*SchedulerCfg)(nil), "testplans.SchedulerCfg")
}

func init() { proto.RegisterFile("testplans/suite_scheduler.proto", fileDescriptor_905bf28b41c26c54) }

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