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

package testplans

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	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

type HwTestCfg_HwTestSuiteType int32

const (
	HwTestCfg_HW_TEST_SUITE_TYPE_UNSPECIFIED HwTestCfg_HwTestSuiteType = 0
	HwTestCfg_AUTOTEST                       HwTestCfg_HwTestSuiteType = 1
	HwTestCfg_TAST                           HwTestCfg_HwTestSuiteType = 2
)

var HwTestCfg_HwTestSuiteType_name = map[int32]string{
	0: "HW_TEST_SUITE_TYPE_UNSPECIFIED",
	1: "AUTOTEST",
	2: "TAST",
}

var HwTestCfg_HwTestSuiteType_value = map[string]int32{
	"HW_TEST_SUITE_TYPE_UNSPECIFIED": 0,
	"AUTOTEST":                       1,
	"TAST":                           2,
}

func (x HwTestCfg_HwTestSuiteType) String() string {
	return proto.EnumName(HwTestCfg_HwTestSuiteType_name, int32(x))
}

func (HwTestCfg_HwTestSuiteType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{1, 0}
}

type TestSuiteCommon struct {
	// Human-readable consistent name for a build target, test type pair.
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Whether or not the test suite is considered critical.
	Critical *wrappers.BoolValue `protobuf:"bytes,2,opt,name=critical,proto3" json:"critical,omitempty"`
	// A list of groups to which this test suite belongs.
	// This is a key into other testingconfig modules.
	TestSuiteGroups []*TestSuiteCommon_TestSuiteGroup `protobuf:"bytes,3,rep,name=test_suite_groups,json=testSuiteGroups,proto3" json:"test_suite_groups,omitempty"`
	// Whether this suite should be disabled by default. It will only be enabled
	// if some other rule forces it to be put into the test plan.
	DisableByDefault     bool     `protobuf:"varint,4,opt,name=disable_by_default,json=disableByDefault,proto3" json:"disable_by_default,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestSuiteCommon proto.InternalMessageInfo

func (m *TestSuiteCommon) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *TestSuiteCommon) GetCritical() *wrappers.BoolValue {
	if m != nil {
		return m.Critical
	}
	return nil
}

func (m *TestSuiteCommon) GetTestSuiteGroups() []*TestSuiteCommon_TestSuiteGroup {
	if m != nil {
		return m.TestSuiteGroups
	}
	return nil
}

func (m *TestSuiteCommon) GetDisableByDefault() bool {
	if m != nil {
		return m.DisableByDefault
	}
	return false
}

type TestSuiteCommon_TestSuiteGroup struct {
	TestSuiteGroup       string   `protobuf:"bytes,1,opt,name=test_suite_group,json=testSuiteGroup,proto3" json:"test_suite_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestSuiteCommon_TestSuiteGroup proto.InternalMessageInfo

func (m *TestSuiteCommon_TestSuiteGroup) GetTestSuiteGroup() string {
	if m != nil {
		return m.TestSuiteGroup
	}
	return ""
}

type HwTestCfg struct {
	HwTest               []*HwTestCfg_HwTest `protobuf:"bytes,1,rep,name=hw_test,json=hwTest,proto3" json:"hw_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_HwTestCfg proto.InternalMessageInfo

func (m *HwTestCfg) GetHwTest() []*HwTestCfg_HwTest {
	if m != nil {
		return m.HwTest
	}
	return nil
}

// Configuration for a hardware test suite.
type HwTestCfg_HwTest struct {
	Common *TestSuiteCommon `protobuf:"bytes,12,opt,name=common,proto3" json:"common,omitempty"`
	// Name of the test suite to run.
	Suite string `protobuf:"bytes,1,opt,name=suite,proto3" json:"suite,omitempty"`
	// The key that identifies a distinct type of device in Skylab.
	// Skylab uses the term "board", hence use of this otherwise controversial
	// word.
	// e.g. could use device_target 'caroline' to test the build_target
	// 'caroline-arcnext'.
	SkylabBoard     string                    `protobuf:"bytes,11,opt,name=skylab_board,json=skylabBoard,proto3" json:"skylab_board,omitempty"`
	HwTestSuiteType HwTestCfg_HwTestSuiteType `protobuf:"varint,13,opt,name=hw_test_suite_type,json=hwTestSuiteType,proto3,enum=testplans.HwTestCfg_HwTestSuiteType" json:"hw_test_suite_type,omitempty"`
	// The swarming pool in which to run the test suite, e.g. DUT_POOL_QUOTA.
	Pool                 string   `protobuf:"bytes,14,opt,name=pool,proto3" json:"pool,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HwTestCfg_HwTest proto.InternalMessageInfo

func (m *HwTestCfg_HwTest) GetCommon() *TestSuiteCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

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

func (m *HwTestCfg_HwTest) GetSkylabBoard() string {
	if m != nil {
		return m.SkylabBoard
	}
	return ""
}

func (m *HwTestCfg_HwTest) GetHwTestSuiteType() HwTestCfg_HwTestSuiteType {
	if m != nil {
		return m.HwTestSuiteType
	}
	return HwTestCfg_HW_TEST_SUITE_TYPE_UNSPECIFIED
}

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

type MoblabVmTestCfg struct {
	MoblabTest           []*MoblabVmTestCfg_MoblabTest `protobuf:"bytes,1,rep,name=moblab_test,json=moblabTest,proto3" json:"moblab_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_MoblabVmTestCfg proto.InternalMessageInfo

func (m *MoblabVmTestCfg) GetMoblabTest() []*MoblabVmTestCfg_MoblabTest {
	if m != nil {
		return m.MoblabTest
	}
	return nil
}

type MoblabVmTestCfg_MoblabTest struct {
	Common *TestSuiteCommon `protobuf:"bytes,3,opt,name=common,proto3" json:"common,omitempty"`
	// Test type to be run.
	TestType             string   `protobuf:"bytes,1,opt,name=test_type,json=testType,proto3" json:"test_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MoblabVmTestCfg_MoblabTest proto.InternalMessageInfo

func (m *MoblabVmTestCfg_MoblabTest) GetCommon() *TestSuiteCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *MoblabVmTestCfg_MoblabTest) GetTestType() string {
	if m != nil {
		return m.TestType
	}
	return ""
}

type TastVmTestCfg struct {
	TastVmTest           []*TastVmTestCfg_TastVmTest `protobuf:"bytes,1,rep,name=tast_vm_test,json=tastVmTest,proto3" json:"tast_vm_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_TastVmTestCfg proto.InternalMessageInfo

func (m *TastVmTestCfg) GetTastVmTest() []*TastVmTestCfg_TastVmTest {
	if m != nil {
		return m.TastVmTest
	}
	return nil
}

type TastVmTestCfg_TastTestExpr struct {
	// A single tast test expression. See https://goo.gl/UPNEgT
	TestExpr             string   `protobuf:"bytes,1,opt,name=test_expr,json=testExpr,proto3" json:"test_expr,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TastVmTestCfg_TastTestExpr proto.InternalMessageInfo

func (m *TastVmTestCfg_TastTestExpr) GetTestExpr() string {
	if m != nil {
		return m.TestExpr
	}
	return ""
}

type TastVmTestCfg_TastVmTest struct {
	Common *TestSuiteCommon `protobuf:"bytes,4,opt,name=common,proto3" json:"common,omitempty"`
	// String containing short human-readable name describing test suite.
	SuiteName string `protobuf:"bytes,1,opt,name=suite_name,json=suiteName,proto3" json:"suite_name,omitempty"`
	// List of string expressions describing which tests to run; this
	// is passed directly to the 'tast run' command. See
	// https://goo.gl/UPNEgT for info about test expressions.
	TastTestExpr         []*TastVmTestCfg_TastTestExpr `protobuf:"bytes,2,rep,name=tast_test_expr,json=tastTestExpr,proto3" json:"tast_test_expr,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_TastVmTestCfg_TastVmTest proto.InternalMessageInfo

func (m *TastVmTestCfg_TastVmTest) GetCommon() *TestSuiteCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *TastVmTestCfg_TastVmTest) GetSuiteName() string {
	if m != nil {
		return m.SuiteName
	}
	return ""
}

func (m *TastVmTestCfg_TastVmTest) GetTastTestExpr() []*TastVmTestCfg_TastTestExpr {
	if m != nil {
		return m.TastTestExpr
	}
	return nil
}

type VmTestCfg struct {
	VmTest               []*VmTestCfg_VmTest `protobuf:"bytes,1,rep,name=vm_test,json=vmTest,proto3" json:"vm_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_VmTestCfg proto.InternalMessageInfo

func (m *VmTestCfg) GetVmTest() []*VmTestCfg_VmTest {
	if m != nil {
		return m.VmTest
	}
	return nil
}

type VmTestCfg_VmTest struct {
	Common *TestSuiteCommon `protobuf:"bytes,8,opt,name=common,proto3" json:"common,omitempty"`
	// Test suite to be run in VMTest.
	TestSuite            string   `protobuf:"bytes,2,opt,name=test_suite,json=testSuite,proto3" json:"test_suite,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VmTestCfg_VmTest proto.InternalMessageInfo

func (m *VmTestCfg_VmTest) GetCommon() *TestSuiteCommon {
	if m != nil {
		return m.Common
	}
	return nil
}

func (m *VmTestCfg_VmTest) GetTestSuite() string {
	if m != nil {
		return m.TestSuite
	}
	return ""
}

// Specifies a CrOS builder to target.
type TargetCriteria struct {
	// DEPRECATED: we need to target builder_name instead. build_target
	// has to go away. See https://crbug.com/1016536
	//
	// Types that are valid to be assigned to TargetType:
	//	*TargetCriteria_BuildTarget
	TargetType isTargetCriteria_TargetType `protobuf_oneof:"target_type"`
	// A CrOS builder to target for testing, e.g. eve-postsubmit or
	// amd64-generic-kernel-v5_4-cq.
	BuilderName          string   `protobuf:"bytes,3,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TargetCriteria proto.InternalMessageInfo

type isTargetCriteria_TargetType interface {
	isTargetCriteria_TargetType()
}

type TargetCriteria_BuildTarget struct {
	BuildTarget string `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3,oneof"`
}

func (*TargetCriteria_BuildTarget) isTargetCriteria_TargetType() {}

func (m *TargetCriteria) GetTargetType() isTargetCriteria_TargetType {
	if m != nil {
		return m.TargetType
	}
	return nil
}

func (m *TargetCriteria) GetBuildTarget() string {
	if x, ok := m.GetTargetType().(*TargetCriteria_BuildTarget); ok {
		return x.BuildTarget
	}
	return ""
}

func (m *TargetCriteria) GetBuilderName() string {
	if m != nil {
		return m.BuilderName
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*TargetCriteria) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*TargetCriteria_BuildTarget)(nil),
	}
}

// Details which testing is needed for a single CrOS build target.
type PerTargetTestRequirements struct {
	// Specifies the crieria for builds to target for testing.
	TargetCriteria *TargetCriteria `protobuf:"bytes,1,opt,name=target_criteria,json=targetCriteria,proto3" json:"target_criteria,omitempty"`
	// These configure what testing is needed for these BuildCriteria.
	HwTestCfg            *HwTestCfg       `protobuf:"bytes,3,opt,name=hw_test_cfg,json=hwTestCfg,proto3" json:"hw_test_cfg,omitempty"`
	MoblabVmTestCfg      *MoblabVmTestCfg `protobuf:"bytes,4,opt,name=moblab_vm_test_cfg,json=moblabVmTestCfg,proto3" json:"moblab_vm_test_cfg,omitempty"`
	VmTestCfg            *VmTestCfg       `protobuf:"bytes,5,opt,name=vm_test_cfg,json=vmTestCfg,proto3" json:"vm_test_cfg,omitempty"`
	TastVmTestCfg        *TastVmTestCfg   `protobuf:"bytes,6,opt,name=tast_vm_test_cfg,json=tastVmTestCfg,proto3" json:"tast_vm_test_cfg,omitempty"`
	DirectTastVmTestCfg  *TastVmTestCfg   `protobuf:"bytes,7,opt,name=direct_tast_vm_test_cfg,json=directTastVmTestCfg,proto3" json:"direct_tast_vm_test_cfg,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_PerTargetTestRequirements proto.InternalMessageInfo

func (m *PerTargetTestRequirements) GetTargetCriteria() *TargetCriteria {
	if m != nil {
		return m.TargetCriteria
	}
	return nil
}

func (m *PerTargetTestRequirements) GetHwTestCfg() *HwTestCfg {
	if m != nil {
		return m.HwTestCfg
	}
	return nil
}

func (m *PerTargetTestRequirements) GetMoblabVmTestCfg() *MoblabVmTestCfg {
	if m != nil {
		return m.MoblabVmTestCfg
	}
	return nil
}

func (m *PerTargetTestRequirements) GetVmTestCfg() *VmTestCfg {
	if m != nil {
		return m.VmTestCfg
	}
	return nil
}

func (m *PerTargetTestRequirements) GetTastVmTestCfg() *TastVmTestCfg {
	if m != nil {
		return m.TastVmTestCfg
	}
	return nil
}

func (m *PerTargetTestRequirements) GetDirectTastVmTestCfg() *TastVmTestCfg {
	if m != nil {
		return m.DirectTastVmTestCfg
	}
	return nil
}

// A listing of all testing that should be done for all CrOS builds.
type TargetTestRequirementsCfg struct {
	// The testing that should be performed for a single set of target criteria.
	PerTargetTestRequirements []*PerTargetTestRequirements `protobuf:"bytes,1,rep,name=per_target_test_requirements,json=perTargetTestRequirements,proto3" json:"per_target_test_requirements,omitempty"`
	XXX_NoUnkeyedLiteral      struct{}                     `json:"-"`
	XXX_unrecognized          []byte                       `json:"-"`
	XXX_sizecache             int32                        `json:"-"`
}

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

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

var xxx_messageInfo_TargetTestRequirementsCfg proto.InternalMessageInfo

func (m *TargetTestRequirementsCfg) GetPerTargetTestRequirements() []*PerTargetTestRequirements {
	if m != nil {
		return m.PerTargetTestRequirements
	}
	return nil
}

func init() {
	proto.RegisterEnum("testplans.HwTestCfg_HwTestSuiteType", HwTestCfg_HwTestSuiteType_name, HwTestCfg_HwTestSuiteType_value)
	proto.RegisterType((*TestSuiteCommon)(nil), "testplans.TestSuiteCommon")
	proto.RegisterType((*TestSuiteCommon_TestSuiteGroup)(nil), "testplans.TestSuiteCommon.TestSuiteGroup")
	proto.RegisterType((*HwTestCfg)(nil), "testplans.HwTestCfg")
	proto.RegisterType((*HwTestCfg_HwTest)(nil), "testplans.HwTestCfg.HwTest")
	proto.RegisterType((*MoblabVmTestCfg)(nil), "testplans.MoblabVmTestCfg")
	proto.RegisterType((*MoblabVmTestCfg_MoblabTest)(nil), "testplans.MoblabVmTestCfg.MoblabTest")
	proto.RegisterType((*TastVmTestCfg)(nil), "testplans.TastVmTestCfg")
	proto.RegisterType((*TastVmTestCfg_TastTestExpr)(nil), "testplans.TastVmTestCfg.TastTestExpr")
	proto.RegisterType((*TastVmTestCfg_TastVmTest)(nil), "testplans.TastVmTestCfg.TastVmTest")
	proto.RegisterType((*VmTestCfg)(nil), "testplans.VmTestCfg")
	proto.RegisterType((*VmTestCfg_VmTest)(nil), "testplans.VmTestCfg.VmTest")
	proto.RegisterType((*TargetCriteria)(nil), "testplans.TargetCriteria")
	proto.RegisterType((*PerTargetTestRequirements)(nil), "testplans.PerTargetTestRequirements")
	proto.RegisterType((*TargetTestRequirementsCfg)(nil), "testplans.TargetTestRequirementsCfg")
}

func init() {
	proto.RegisterFile("testplans/target_test_requirements_config.proto", fileDescriptor_4af54ecd79c6f0f9)
}

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