// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/request.proto

package test_platform

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	execution "go.chromium.org/chromiumos/infra/proto/go/test_platform/execution"
	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

// ManagedPool enumerates certain large pools of DUTs in the lab.
//
// The distinction between managed / unmanaged pools (below) is historic
// and no longer relevant.
type Request_Params_Scheduling_ManagedPool int32

const (
	Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED   Request_Params_Scheduling_ManagedPool = 0
	Request_Params_Scheduling_MANAGED_POOL_CQ            Request_Params_Scheduling_ManagedPool = 1
	Request_Params_Scheduling_MANAGED_POOL_BVT           Request_Params_Scheduling_ManagedPool = 2
	Request_Params_Scheduling_MANAGED_POOL_SUITES        Request_Params_Scheduling_ManagedPool = 3
	Request_Params_Scheduling_MANAGED_POOL_CTS           Request_Params_Scheduling_ManagedPool = 4
	Request_Params_Scheduling_MANAGED_POOL_CTS_PERBUILD  Request_Params_Scheduling_ManagedPool = 5
	Request_Params_Scheduling_MANAGED_POOL_CONTINUOUS    Request_Params_Scheduling_ManagedPool = 6
	Request_Params_Scheduling_MANAGED_POOL_ARC_PRESUBMIT Request_Params_Scheduling_ManagedPool = 7
	Request_Params_Scheduling_MANAGED_POOL_QUOTA         Request_Params_Scheduling_ManagedPool = 8
)

var Request_Params_Scheduling_ManagedPool_name = map[int32]string{
	0: "MANAGED_POOL_UNSPECIFIED",
	1: "MANAGED_POOL_CQ",
	2: "MANAGED_POOL_BVT",
	3: "MANAGED_POOL_SUITES",
	4: "MANAGED_POOL_CTS",
	5: "MANAGED_POOL_CTS_PERBUILD",
	6: "MANAGED_POOL_CONTINUOUS",
	7: "MANAGED_POOL_ARC_PRESUBMIT",
	8: "MANAGED_POOL_QUOTA",
}

var Request_Params_Scheduling_ManagedPool_value = map[string]int32{
	"MANAGED_POOL_UNSPECIFIED":   0,
	"MANAGED_POOL_CQ":            1,
	"MANAGED_POOL_BVT":           2,
	"MANAGED_POOL_SUITES":        3,
	"MANAGED_POOL_CTS":           4,
	"MANAGED_POOL_CTS_PERBUILD":  5,
	"MANAGED_POOL_CONTINUOUS":    6,
	"MANAGED_POOL_ARC_PRESUBMIT": 7,
	"MANAGED_POOL_QUOTA":         8,
}

func (x Request_Params_Scheduling_ManagedPool) String() string {
	return proto.EnumName(Request_Params_Scheduling_ManagedPool_name, int32(x))
}

func (Request_Params_Scheduling_ManagedPool) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7f5ab0d1581e8f0c, []int{0, 0, 4, 0}
}

// Request represents a request to the ChromeOS Test Platform to run a test,
// set of tests, suite of tests, or test plan on a set of devices (eventually
// also: virtual devices) in the ChromeOS Test Lab.
type Request struct {
	Params               *Request_Params   `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
	TestPlan             *Request_TestPlan `protobuf:"bytes,5,opt,name=test_plan,json=testPlan,proto3" json:"test_plan,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Request proto.InternalMessageInfo

func (m *Request) GetParams() *Request_Params {
	if m != nil {
		return m.Params
	}
	return nil
}

func (m *Request) GetTestPlan() *Request_TestPlan {
	if m != nil {
		return m.TestPlan
	}
	return nil
}

// Params defines parameters that apply to an entire Request.
//
// NEXT_TAG: 11
type Request_Params struct {
	HardwareAttributes   *Request_Params_HardwareAttributes   `protobuf:"bytes,1,opt,name=hardware_attributes,json=hardwareAttributes,proto3" json:"hardware_attributes,omitempty"`
	SoftwareAttributes   *Request_Params_SoftwareAttributes   `protobuf:"bytes,2,opt,name=software_attributes,json=softwareAttributes,proto3" json:"software_attributes,omitempty"`
	FreeformAttributes   *Request_Params_FreeformAttributes   `protobuf:"bytes,9,opt,name=freeform_attributes,json=freeformAttributes,proto3" json:"freeform_attributes,omitempty"`
	SoftwareDependencies []*Request_Params_SoftwareDependency `protobuf:"bytes,3,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	Scheduling           *Request_Params_Scheduling           `protobuf:"bytes,4,opt,name=scheduling,proto3" json:"scheduling,omitempty"`
	Retry                *Request_Params_Retry                `protobuf:"bytes,5,opt,name=retry,proto3" json:"retry,omitempty"`
	Metadata             *Request_Params_Metadata             `protobuf:"bytes,6,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Time                 *Request_Params_Time                 `protobuf:"bytes,7,opt,name=time,proto3" json:"time,omitempty"`
	Decorations          *Request_Params_Decorations          `protobuf:"bytes,8,opt,name=decorations,proto3" json:"decorations,omitempty"`
	Migrations           *Request_Params_Migrations           `protobuf:"bytes,12,opt,name=migrations,proto3" json:"migrations,omitempty"`
	// Uniformly applied parameters for all test executions in this request.
	ExecutionParam       *execution.Param `protobuf:"bytes,13,opt,name=execution_param,json=executionParam,proto3" json:"execution_param,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params proto.InternalMessageInfo

func (m *Request_Params) GetHardwareAttributes() *Request_Params_HardwareAttributes {
	if m != nil {
		return m.HardwareAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareAttributes() *Request_Params_SoftwareAttributes {
	if m != nil {
		return m.SoftwareAttributes
	}
	return nil
}

func (m *Request_Params) GetFreeformAttributes() *Request_Params_FreeformAttributes {
	if m != nil {
		return m.FreeformAttributes
	}
	return nil
}

func (m *Request_Params) GetSoftwareDependencies() []*Request_Params_SoftwareDependency {
	if m != nil {
		return m.SoftwareDependencies
	}
	return nil
}

func (m *Request_Params) GetScheduling() *Request_Params_Scheduling {
	if m != nil {
		return m.Scheduling
	}
	return nil
}

func (m *Request_Params) GetRetry() *Request_Params_Retry {
	if m != nil {
		return m.Retry
	}
	return nil
}

func (m *Request_Params) GetMetadata() *Request_Params_Metadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *Request_Params) GetTime() *Request_Params_Time {
	if m != nil {
		return m.Time
	}
	return nil
}

func (m *Request_Params) GetDecorations() *Request_Params_Decorations {
	if m != nil {
		return m.Decorations
	}
	return nil
}

func (m *Request_Params) GetMigrations() *Request_Params_Migrations {
	if m != nil {
		return m.Migrations
	}
	return nil
}

func (m *Request_Params) GetExecutionParam() *execution.Param {
	if m != nil {
		return m.ExecutionParam
	}
	return nil
}

// HardwareAttributes defines the hardware-bound characteristics
// of the devices to run tests on.
type Request_Params_HardwareAttributes struct {
	// Model is the model to run tests against.
	Model                string   `protobuf:"bytes,1,opt,name=model,proto3" json:"model,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_HardwareAttributes proto.InternalMessageInfo

func (m *Request_Params_HardwareAttributes) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

// SoftwareAttributes defines software characteristics that are strongly
// associated with a device, though not immutable or hardware-bound.
type Request_Params_SoftwareAttributes struct {
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareAttributes proto.InternalMessageInfo

func (m *Request_Params_SoftwareAttributes) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

// FreeformAttributes defines user-specified device attributes that are
// opaque to the test platform. It is preferrable not to use these, but
// they are provided to cover cases in which the test platform does not
// present a parameter corresponding to the attributes of interest.
type Request_Params_FreeformAttributes struct {
	// SwarmingDimensions are raw swarming bot dimensions, expressed as
	// "key:value" strings.
	SwarmingDimensions   []string `protobuf:"bytes,1,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_FreeformAttributes proto.InternalMessageInfo

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

// SoftwareDependency defines mutable software characteristics of the
// devices to run tests on (for instance, the desired version of ChromeOS).
type Request_Params_SoftwareDependency struct {
	// Types that are valid to be assigned to Dep:
	//	*Request_Params_SoftwareDependency_ChromeosBuild
	//	*Request_Params_SoftwareDependency_RoFirmwareBuild
	//	*Request_Params_SoftwareDependency_RwFirmwareBuild
	Dep                  isRequest_Params_SoftwareDependency_Dep `protobuf_oneof:"dep"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_SoftwareDependency proto.InternalMessageInfo

type isRequest_Params_SoftwareDependency_Dep interface {
	isRequest_Params_SoftwareDependency_Dep()
}

type Request_Params_SoftwareDependency_ChromeosBuild struct {
	ChromeosBuild string `protobuf:"bytes,3,opt,name=chromeos_build,json=chromeosBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RoFirmwareBuild struct {
	RoFirmwareBuild string `protobuf:"bytes,4,opt,name=ro_firmware_build,json=roFirmwareBuild,proto3,oneof"`
}

type Request_Params_SoftwareDependency_RwFirmwareBuild struct {
	RwFirmwareBuild string `protobuf:"bytes,5,opt,name=rw_firmware_build,json=rwFirmwareBuild,proto3,oneof"`
}

func (*Request_Params_SoftwareDependency_ChromeosBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RoFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (*Request_Params_SoftwareDependency_RwFirmwareBuild) isRequest_Params_SoftwareDependency_Dep() {}

func (m *Request_Params_SoftwareDependency) GetDep() isRequest_Params_SoftwareDependency_Dep {
	if m != nil {
		return m.Dep
	}
	return nil
}

func (m *Request_Params_SoftwareDependency) GetChromeosBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_ChromeosBuild); ok {
		return x.ChromeosBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRoFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RoFirmwareBuild); ok {
		return x.RoFirmwareBuild
	}
	return ""
}

func (m *Request_Params_SoftwareDependency) GetRwFirmwareBuild() string {
	if x, ok := m.GetDep().(*Request_Params_SoftwareDependency_RwFirmwareBuild); ok {
		return x.RwFirmwareBuild
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Request_Params_SoftwareDependency) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Request_Params_SoftwareDependency_ChromeosBuild)(nil),
		(*Request_Params_SoftwareDependency_RoFirmwareBuild)(nil),
		(*Request_Params_SoftwareDependency_RwFirmwareBuild)(nil),
	}
}

// Scheduling defines parameters that affect how the tests in this
// request are prioritized relative to other requests, and how capacity for
// them is allocated.
type Request_Params_Scheduling struct {
	// Types that are valid to be assigned to Pool:
	//	*Request_Params_Scheduling_ManagedPool_
	//	*Request_Params_Scheduling_UnmanagedPool
	Pool isRequest_Params_Scheduling_Pool `protobuf_oneof:"pool"`
	// Priority corresponds to a swarming task priority; if specified, it
	// should be in the range [50,255]. This priority will be used for
	// any swaming tasks created by this run.
	//
	// Note that the scheduler behavior with a given priority depends on
	// other factors, such as pool. In particular, if requests are run in
	// a quotascheduler-controlled pool, then this priority will be ignored,
	// as priority will be determined by quota account balances.
	Priority int64 `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	// It is an error to set both qs_account and priority at the same time.
	// qs_account should be used if the request is scheduled on a pool
	// managed by QuotaScheduler. See go/qs-enabled-pools for details.
	// If qs_account is set for requests on no QuotaScheduler pools,
	// it will be ignored and the request will default to running at
	// the lowest priority.
	QsAccount            string   `protobuf:"bytes,5,opt,name=qs_account,json=qsAccount,proto3" json:"qs_account,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Scheduling proto.InternalMessageInfo

type isRequest_Params_Scheduling_Pool interface {
	isRequest_Params_Scheduling_Pool()
}

type Request_Params_Scheduling_ManagedPool_ struct {
	ManagedPool Request_Params_Scheduling_ManagedPool `protobuf:"varint,1,opt,name=managed_pool,json=managedPool,proto3,enum=test_platform.Request_Params_Scheduling_ManagedPool,oneof"`
}

type Request_Params_Scheduling_UnmanagedPool struct {
	UnmanagedPool string `protobuf:"bytes,2,opt,name=unmanaged_pool,json=unmanagedPool,proto3,oneof"`
}

func (*Request_Params_Scheduling_ManagedPool_) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_UnmanagedPool) isRequest_Params_Scheduling_Pool() {}

func (m *Request_Params_Scheduling) GetPool() isRequest_Params_Scheduling_Pool {
	if m != nil {
		return m.Pool
	}
	return nil
}

func (m *Request_Params_Scheduling) GetManagedPool() Request_Params_Scheduling_ManagedPool {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_ManagedPool_); ok {
		return x.ManagedPool
	}
	return Request_Params_Scheduling_MANAGED_POOL_UNSPECIFIED
}

func (m *Request_Params_Scheduling) GetUnmanagedPool() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_UnmanagedPool); ok {
		return x.UnmanagedPool
	}
	return ""
}

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

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

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

// Retry defines parameters that affect how failed tests within
// a request are retried.
type Request_Params_Retry struct {
	// Whether to allow test retries.
	Allow bool `protobuf:"varint,1,opt,name=allow,proto3" json:"allow,omitempty"`
	// Maximum number of retries of tests within this invocation to allow.
	// 0 = unlimited.
	Max                  int32    `protobuf:"varint,2,opt,name=max,proto3" json:"max,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Retry proto.InternalMessageInfo

func (m *Request_Params_Retry) GetAllow() bool {
	if m != nil {
		return m.Allow
	}
	return false
}

func (m *Request_Params_Retry) GetMax() int32 {
	if m != nil {
		return m.Max
	}
	return 0
}

// Metadata defines parameters that determine where test definitions
// and metadata are stored and discovered from.
type Request_Params_Metadata struct {
	// A Google Storage path to the location of test metadata to be used.
	// For example:
	// "gs://chromeos-image-archive/arkham-release/R57-9202.10.11".
	TestMetadataUrl string `protobuf:"bytes,1,opt,name=test_metadata_url,json=testMetadataUrl,proto3" json:"test_metadata_url,omitempty"`
	// A Google Storage path to the location of image archive in which to find
	// debug symbols to be used in post-process symbolication of crashes. This
	// is generally the same as test_metadata_url.
	DebugSymbolsArchiveUrl string   `protobuf:"bytes,2,opt,name=debug_symbols_archive_url,json=debugSymbolsArchiveUrl,proto3" json:"debug_symbols_archive_url,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Metadata proto.InternalMessageInfo

func (m *Request_Params_Metadata) GetTestMetadataUrl() string {
	if m != nil {
		return m.TestMetadataUrl
	}
	return ""
}

func (m *Request_Params_Metadata) GetDebugSymbolsArchiveUrl() string {
	if m != nil {
		return m.DebugSymbolsArchiveUrl
	}
	return ""
}

// Time defines parameters related to timeouts.
type Request_Params_Time struct {
	// Maximum duration for the entire request to be handled.
	MaximumDuration      *duration.Duration `protobuf:"bytes,1,opt,name=maximum_duration,json=maximumDuration,proto3" json:"maximum_duration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Time proto.InternalMessageInfo

func (m *Request_Params_Time) GetMaximumDuration() *duration.Duration {
	if m != nil {
		return m.MaximumDuration
	}
	return nil
}

// Decorations defines parameters that add additional decorations to
// test runs.
type Request_Params_Decorations struct {
	// AutotestKeyvals are (key, value) pairs that will be added to all
	// autotest tasks run.
	AutotestKeyvals map[string]string `protobuf:"bytes,1,rep,name=autotest_keyvals,json=autotestKeyvals,proto3" json:"autotest_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Tags are swarming tags that will be applied to all swarming tasks
	// launched.
	Tags                 []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Decorations proto.InternalMessageInfo

func (m *Request_Params_Decorations) GetAutotestKeyvals() map[string]string {
	if m != nil {
		return m.AutotestKeyvals
	}
	return nil
}

func (m *Request_Params_Decorations) GetTags() []string {
	if m != nil {
		return m.Tags
	}
	return nil
}

// Migrations defines parameters that facilitate gradual migrations between
// different implementations of downstream components.
type Request_Params_Migrations struct {
	// If true, schedule individual tests via buildbucket and run them via
	// test_runner recipe.
	// Otherwise, schedule individual tests via raw swarming calls and run
	// them via skylab_swarming_worker.
	// TODO(crbug/1033287): remove when migration is complete.
	UseTestRunner bool `protobuf:"varint,1,opt,name=use_test_runner,json=useTestRunner,proto3" json:"use_test_runner,omitempty"`
	// If true, test tasks will perform synchronous offload of the contents
	// of $SYNCHRONOUS_OFFLOAD_DIR to a GS bucket. This requires
	// use_test_runner to also be set to true: if use_test_runner is set to
	// false and enable_synchronous_offload is set to true, the build will
	// fail validation.
	// If false, such offload will be skipped.
	EnableSynchronousOffload bool `protobuf:"varint,2,opt,name=enable_synchronous_offload,json=enableSynchronousOffload,proto3" json:"enable_synchronous_offload,omitempty"`
	// Turn on synchronous offloads even if there is no pubsub topic set.
	// Not intended as a long-term change, but useful for testing synchronous
	// offloads during rollout.
	NotificationlessOffload bool     `protobuf:"varint,3,opt,name=notificationless_offload,json=notificationlessOffload,proto3" json:"notificationless_offload,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Migrations proto.InternalMessageInfo

func (m *Request_Params_Migrations) GetUseTestRunner() bool {
	if m != nil {
		return m.UseTestRunner
	}
	return false
}

func (m *Request_Params_Migrations) GetEnableSynchronousOffload() bool {
	if m != nil {
		return m.EnableSynchronousOffload
	}
	return false
}

func (m *Request_Params_Migrations) GetNotificationlessOffload() bool {
	if m != nil {
		return m.NotificationlessOffload
	}
	return false
}

// SuiteRequest defines an individual named suite.
type Request_Suite struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Suite proto.InternalMessageInfo

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

type Request_Test struct {
	// Types that are valid to be assigned to Harness:
	//	*Request_Test_Autotest_
	Harness              isRequest_Test_Harness `protobuf_oneof:"harness"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_Request_Test proto.InternalMessageInfo

type isRequest_Test_Harness interface {
	isRequest_Test_Harness()
}

type Request_Test_Autotest_ struct {
	Autotest *Request_Test_Autotest `protobuf:"bytes,1,opt,name=autotest,proto3,oneof"`
}

func (*Request_Test_Autotest_) isRequest_Test_Harness() {}

func (m *Request_Test) GetHarness() isRequest_Test_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (m *Request_Test) GetAutotest() *Request_Test_Autotest {
	if x, ok := m.GetHarness().(*Request_Test_Autotest_); ok {
		return x.Autotest
	}
	return nil
}

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

type Request_Test_Autotest struct {
	Name     string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	TestArgs string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// Name to be used to display this test's output artifacts, e.g. logs,
	// results etc. By default display_name is the same as name.
	//
	// display_name is especially useful when using test_args to distinguish
	// between multiple instances of the same test in a request.
	DisplayName          string   `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Test_Autotest proto.InternalMessageInfo

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

func (m *Request_Test_Autotest) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

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

// Enumeration is a previously enumerated test plan.
//
// This is a copy of test_platform.steps.EnumerationResponse
// Keep in sync.
type Request_Enumeration struct {
	AutotestInvocations  []*Request_Enumeration_AutotestInvocation `protobuf:"bytes,2,rep,name=autotest_invocations,json=autotestInvocations,proto3" json:"autotest_invocations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_Request_Enumeration proto.InternalMessageInfo

func (m *Request_Enumeration) GetAutotestInvocations() []*Request_Enumeration_AutotestInvocation {
	if m != nil {
		return m.AutotestInvocations
	}
	return nil
}

type Request_Enumeration_AutotestInvocation struct {
	Test                 *api.AutotestTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"`
	TestArgs             string            `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	DisplayName          string            `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	ResultKeyvals        map[string]string `protobuf:"bytes,4,rep,name=result_keyvals,json=resultKeyvals,proto3" json:"result_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Request_Enumeration_AutotestInvocation proto.InternalMessageInfo

func (m *Request_Enumeration_AutotestInvocation) GetTest() *api.AutotestTest {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Request_Enumeration_AutotestInvocation) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

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

func (m *Request_Enumeration_AutotestInvocation) GetResultKeyvals() map[string]string {
	if m != nil {
		return m.ResultKeyvals
	}
	return nil
}

type Request_TestPlan struct {
	Suite                []*Request_Suite     `protobuf:"bytes,1,rep,name=suite,proto3" json:"suite,omitempty"`
	Test                 []*Request_Test      `protobuf:"bytes,2,rep,name=test,proto3" json:"test,omitempty"`
	Enumeration          *Request_Enumeration `protobuf:"bytes,3,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Request_TestPlan proto.InternalMessageInfo

func (m *Request_TestPlan) GetSuite() []*Request_Suite {
	if m != nil {
		return m.Suite
	}
	return nil
}

func (m *Request_TestPlan) GetTest() []*Request_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Request_TestPlan) GetEnumeration() *Request_Enumeration {
	if m != nil {
		return m.Enumeration
	}
	return nil
}

func init() {
	proto.RegisterEnum("test_platform.Request_Params_Scheduling_ManagedPool", Request_Params_Scheduling_ManagedPool_name, Request_Params_Scheduling_ManagedPool_value)
	proto.RegisterType((*Request)(nil), "test_platform.Request")
	proto.RegisterType((*Request_Params)(nil), "test_platform.Request.Params")
	proto.RegisterType((*Request_Params_HardwareAttributes)(nil), "test_platform.Request.Params.HardwareAttributes")
	proto.RegisterType((*Request_Params_SoftwareAttributes)(nil), "test_platform.Request.Params.SoftwareAttributes")
	proto.RegisterType((*Request_Params_FreeformAttributes)(nil), "test_platform.Request.Params.FreeformAttributes")
	proto.RegisterType((*Request_Params_SoftwareDependency)(nil), "test_platform.Request.Params.SoftwareDependency")
	proto.RegisterType((*Request_Params_Scheduling)(nil), "test_platform.Request.Params.Scheduling")
	proto.RegisterType((*Request_Params_Retry)(nil), "test_platform.Request.Params.Retry")
	proto.RegisterType((*Request_Params_Metadata)(nil), "test_platform.Request.Params.Metadata")
	proto.RegisterType((*Request_Params_Time)(nil), "test_platform.Request.Params.Time")
	proto.RegisterType((*Request_Params_Decorations)(nil), "test_platform.Request.Params.Decorations")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Params.Decorations.AutotestKeyvalsEntry")
	proto.RegisterType((*Request_Params_Migrations)(nil), "test_platform.Request.Params.Migrations")
	proto.RegisterType((*Request_Suite)(nil), "test_platform.Request.Suite")
	proto.RegisterType((*Request_Test)(nil), "test_platform.Request.Test")
	proto.RegisterType((*Request_Test_Autotest)(nil), "test_platform.Request.Test.Autotest")
	proto.RegisterType((*Request_Enumeration)(nil), "test_platform.Request.Enumeration")
	proto.RegisterType((*Request_Enumeration_AutotestInvocation)(nil), "test_platform.Request.Enumeration.AutotestInvocation")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.Request.Enumeration.AutotestInvocation.ResultKeyvalsEntry")
	proto.RegisterType((*Request_TestPlan)(nil), "test_platform.Request.TestPlan")
}

func init() { proto.RegisterFile("test_platform/request.proto", fileDescriptor_7f5ab0d1581e8f0c) }

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