// 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"
	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 the different lab platform-managed pools.
// Devices in these pools are automatically managed by lab platform
// systems and can not be arbitrarily assigned to pools by users.
//
// Managed pool implementations are specific to test platform's scheduling
// backends.
// For Skylab, see
// https://chromium.googlesource.com/infra/infra/+/5566668428c6b286702bf440d9dfd0be7bca1d84/go/src/infra/libs/skylab/inventory/device.proto#173
// For autotest, see
// https://chromium.googlesource.com/chromiumos/third_party/autotest/+/7436c2b6e6bd32ed1f1bd08cf8e0feb40cfe7b89/server/constants.py#18
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"`
	Legacy               *Request_Params_Legacy               `protobuf:"bytes,10,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Notification         *Request_Params_Notification         `protobuf:"bytes,11,opt,name=notification,proto3" json:"notification,omitempty"`
	Migrations           *Request_Params_Migrations           `protobuf:"bytes,12,opt,name=migrations,proto3" json:"migrations,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) GetLegacy() *Request_Params_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *Request_Params) GetNotification() *Request_Params_Notification {
	if m != nil {
		return m.Notification
	}
	return nil
}

func (m *Request_Params) GetMigrations() *Request_Params_Migrations {
	if m != nil {
		return m.Migrations
	}
	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.
	//
	// TODO(akeshet): Re-use device protos instead of defining this
	// independently.
	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
	//	*Request_Params_Scheduling_QuotaAccount
	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"`
}

type Request_Params_Scheduling_QuotaAccount struct {
	QuotaAccount string `protobuf:"bytes,3,opt,name=quota_account,json=quotaAccount,proto3,oneof"`
}

func (*Request_Params_Scheduling_ManagedPool_) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_UnmanagedPool) isRequest_Params_Scheduling_Pool() {}

func (*Request_Params_Scheduling_QuotaAccount) 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 ""
}

// Deprecated: Do not use.
func (m *Request_Params_Scheduling) GetQuotaAccount() string {
	if x, ok := m.GetPool().(*Request_Params_Scheduling_QuotaAccount); ok {
		return x.QuotaAccount
	}
	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),
		(*Request_Params_Scheduling_QuotaAccount)(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
}

// Legacy encodes arguments that relate to migration from legacy backend
// (autotest); support for these arguments will be phased out.
type Request_Params_Legacy struct {
	// If autotest_suite is defined, then if the autotest backend is selected
	// for running this request, the entire enumeration will be ignored, and
	// replaced by a single invocation of this named autotest suite.
	AutotestSuite        string   `protobuf:"bytes,1,opt,name=autotest_suite,json=autotestSuite,proto3" json:"autotest_suite,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Legacy proto.InternalMessageInfo

func (m *Request_Params_Legacy) GetAutotestSuite() string {
	if m != nil {
		return m.AutotestSuite
	}
	return ""
}

// Notification defines parameters for the request to use to notify callers
// of its test's status updates.
type Request_Params_Notification struct {
	// Pubsub topic to broadcast status updates to
	PubsubTopic          string   `protobuf:"bytes,1,opt,name=pubsub_topic,json=pubsubTopic,proto3" json:"pubsub_topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Params_Notification proto.InternalMessageInfo

func (m *Request_Params_Notification) GetPubsubTopic() string {
	if m != nil {
		return m.PubsubTopic
	}
	return ""
}

// 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"`
	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, 11}
}

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
}

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