// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/plan/v1/plan.proto

package plan

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	api "go.chromium.org/chromiumos/config/go/api"
	v1 "go.chromium.org/chromiumos/infra/proto/go/test/fleet/v1"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type Exclusion_Type int32

const (
	// Do not use.
	Exclusion_TYPE_UNSPECIFIED Exclusion_Type = 0
	// There are no active plans to remove these exclusions becuase it is
	// prohibitive to fix the issue or business needs do not justify the effort
	// to fix the issue.
	//
	// Each PERMANENT exclusion MUST include references that point to a business
	// justification for its addition.
	Exclusion_PERMANENT Exclusion_Type = 1
	// Use for excluding new tests from running on devices where the test has
	// not yet been stabilized. The intention is to support incremental rollout
	// of new tests.
	//
	// These exclsusion are temporary. These exclusions SHOULD be routinely
	// audited and resolved or promoted to PERMANENT exclusions.
	Exclusion_TEMPORARY_NEW_TEST Exclusion_Type = 2
	// Use for excluding broken / flakey tests while a fix is being worked on.
	//
	// These exclsusion are temporary. These exclusions SHOULD be routinely
	// audited and resolved or promoted to PERMANENT exclusions.
	Exclusion_TEMPORARY_PENDING_FIX Exclusion_Type = 3
)

var Exclusion_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PERMANENT",
	2: "TEMPORARY_NEW_TEST",
	3: "TEMPORARY_PENDING_FIX",
}

var Exclusion_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED":      0,
	"PERMANENT":             1,
	"TEMPORARY_NEW_TEST":    2,
	"TEMPORARY_PENDING_FIX": 3,
}

func (x Exclusion_Type) String() string {
	return proto.EnumName(Exclusion_Type_name, int32(x))
}

func (Exclusion_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1a74b4d4119f628f, []int{5, 0}
}

type Exclusion_Action int32

const (
	// Specify no action.
	//
	// The Test Lab Environment may choose any of the available actions based
	// on internal heuristics.
	//
	// The default Action is a good default if none of the considersations for
	// the specific actions below apply.
	Exclusion_ACTION_UNSPECIFIED Exclusion_Action = 0
	// Do not schedule the selected Tests on specified Devices Under Test.
	//
	// It is especially useful to set this Action for permanent exceptions as it
	// is definitely not useful to run the Tests at all in those cases.
	Exclusion_DO_NOT_SCHEDULE Exclusion_Action = 1
	// Schedule the Test on Devices Under Test as required by the test plan
	// unit, but mark the results for selected tests on the specified Devices
	// Under Test as non-critical. Results marked non-critical are intended to
	// be ignored by result consumers (e.g, presubmit system should consider the
	// result irrelevant for validatting a Chrome OS build).
	//
	// This action does not guarantee that results for the selected (Test,
	// Device Under Test) pairs are always available because that depends no how
	// the test plan Unit is interpreted overall. When this action is set, the
	// Test Lab Environment SHOULD NOT make any special effort to include /
	// exclude the selected (Test, Device Under Test) pairs.
	//
	// It is useful to set this Action for temporary exclusions where the
	// results generated from test execution can be uesd to root cause and fix
	// the underlying issues.
	Exclusion_MARK_NON_CRITICAL Exclusion_Action = 2
)

var Exclusion_Action_name = map[int32]string{
	0: "ACTION_UNSPECIFIED",
	1: "DO_NOT_SCHEDULE",
	2: "MARK_NON_CRITICAL",
}

var Exclusion_Action_value = map[string]int32{
	"ACTION_UNSPECIFIED": 0,
	"DO_NOT_SCHEDULE":    1,
	"MARK_NON_CRITICAL":  2,
}

func (x Exclusion_Action) String() string {
	return proto.EnumName(Exclusion_Action_name, int32(x))
}

func (Exclusion_Action) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1a74b4d4119f628f, []int{5, 1}
}

// A set of known test plans.
//
// In practice, a complete specification of all known plans may consist of
// multiple Specification instances. In that case the plan names MUST be unique
// across different Specification instances.
type Specification struct {
	Plans                []*Plan  `protobuf:"bytes,1,rep,name=plans,proto3" json:"plans,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Specification proto.InternalMessageInfo

func (m *Specification) GetPlans() []*Plan {
	if m != nil {
		return m.Plans
	}
	return nil
}

// A Plan fully specifies a Test Platform end-user's coverage needs.
//
// Plans SHOULD associate platform software and Device Under Test condition
// coverage rules with tests that exercise those components. Plans MUST be used
// in the Test Platform request API. Other Test Lab Environments may use plans
// to ease interoperation with the Test Platform.
type Plan struct {
	// A globally unique test plan name.
	//
	// MUST be valid resource name per https://aip.dev/122.
	//
	// Pattern: plans/{plan}
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Each test plan unit specifies a particular set of tests to be run to meet
	// specific conditions.
	Units                []*Unit  `protobuf:"bytes,2,rep,name=units,proto3" json:"units,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Plan proto.InternalMessageInfo

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

func (m *Plan) GetUnits() []*Unit {
	if m != nil {
		return m.Units
	}
	return nil
}

// Specifies a particular set of tests to be run to meet specific conditions.
//
// TODO(pprabhu): Add a full example showcasing test_constraints,
// dut_coverage_consraints and exclusions together.
type Unit struct {
	// A globally unique test plan unit name.
	//
	// MUST be valid resource name per https://aip.dev/122.
	//
	// Pattern: plans/{plan}/units/{unit}
	//   where {plan} is the parent Plan of this Unit.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Selects tests to include in this test plan unit.
	//
	// See also: exclusions.
	TestConstraint *TestConstraint `protobuf:"bytes,2,opt,name=test_constraint,json=testConstraint,proto3" json:"test_constraint,omitempty"`
	// Selects the set of Devices Under Test that satisfy the coverage
	// requirements of this test plan unit.
	//
	// See also: exclusions.
	DutCoverageConstraint *DUTCoverageConstraint `protobuf:"bytes,3,opt,name=dut_coverage_constraint,json=dutCoverageConstraint,proto3" json:"dut_coverage_constraint,omitempty"`
	// Chrome OS platform software covered by this test plan.
	//
	// Test Platform requests may optionally include a reference to platform
	// software to be tested via the test plan. For such requests, Test Platform
	// MUST only execute test plan units that have non-trivial coverage of the
	// referenced platform software. Unrelated test plan units MUST be skipped.
	//
	// A typical example is presubmit testing: When testing a change to the
	// network manager, it may be desirable to only run test plan units that
	// are known to exercise the network manager.
	//
	// For a test plan unit with no `code_coverage` specified, Test Platform MUST
	// assume coverage of all platform software (i.e., this test plan unit MUST
	// never be skipped for code coverage considerations).
	CodeCoverage *CodeCoverage `protobuf:"bytes,4,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
	// A list of criteria for (test, Device Under Test) pairs that MUST be
	// excluded from this test plan.
	//
	// Exclusions are used to record exceptions to the test plan specification for
	// devices that are known to cause test failures for some temporary or
	// permanent reasons. The test_constraint and dut_coverage_constraint fields
	// together specify the _intent_ of the test plan unit. The exclusions further
	// restrict what Devices Under Test can be used to satisfy the test plan unit
	// due to practical considerations.
	//
	// Each exclusion SHOULD correspond to a different business reason.
	// Conceptually, fixing a known issue should result in an exclusion being
	// removed.
	Exclusions           []*Exclusion `protobuf:"bytes,5,rep,name=exclusions,proto3" json:"exclusions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_Unit proto.InternalMessageInfo

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

func (m *Unit) GetTestConstraint() *TestConstraint {
	if m != nil {
		return m.TestConstraint
	}
	return nil
}

func (m *Unit) GetDutCoverageConstraint() *DUTCoverageConstraint {
	if m != nil {
		return m.DutCoverageConstraint
	}
	return nil
}

func (m *Unit) GetCodeCoverage() *CodeCoverage {
	if m != nil {
		return m.CodeCoverage
	}
	return nil
}

func (m *Unit) GetExclusions() []*Exclusion {
	if m != nil {
		return m.Exclusions
	}
	return nil
}

// Selects the test.metadata.Test to include in a test plan unit.
type TestConstraint struct {
	// A Common Expression Language (CEL) expression to specify set of tests that
	// are included in a test plan unit.
	//
	// Test Platform MUST effectively evaluate `expression` with the following
	// declarations in scope for every test and include the test for which
	// `expression` evaluates to true in the test plan unit.
	//
	// - Constant: `test` of type TestConstraint.Test defined below,
	//   populated with metadata for a particular test.
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Tauto dummy tests
	//     "suite:dummy" in test.attributes
	// - Tast's crosbolt tests
	//     !("disabled" in test.attributes)
	//     && "group:crosbolt" in test.attributes
	//     && "crosbolt_perbuild" in test.attributes
	// - network Tauto tests, selected by name
	//     test.name.startsWith("network_")
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestConstraint proto.InternalMessageInfo

func (m *TestConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

type TestConstraint_Test struct {
	// Name of the test as specified in test.metadata.Test.name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The test attribute name as specified in the test.metadata.Attribute.name
	//
	// attributes are populated from test.metadata.Test.attributes.
	Attributes           []string `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestConstraint_Test proto.InternalMessageInfo

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

func (m *TestConstraint_Test) GetAttributes() []string {
	if m != nil {
		return m.Attributes
	}
	return nil
}

// Selects sets of Devices Under Test to run the tests on in a test plan unit.
type DUTCoverageConstraint struct {
	// A Common Expression Language (CEL) expression to specify set of DUTs that
	// provide the necessary coverage. `expression` MUST evaluate to a boolean
	// value in the evaluation context described below.
	//
	// Test Platform MUST support scheduling test requests on a set of Devices
	// Under Test that satisfy some constraints on their Chrome OS configuration.
	//
	// Test Platform MUST effectively evaluate `expression` with the following
	// declarations in scope for each possible subset of Devices Under Test and
	// ensure that the test is scheduled on a set of Devices Under Test for which
	// `expression` evaluates to true.
	//
	// - Constant: `duts` of type repeated DUTConfigConstraint.DUT defined below,
	//   each entry in `duts` set to the Chrome OS configuration payload of a
	//   particular Device Under Test.
	// - Types: Protobuf messages from `chromiumos.config.api.*`
	//   - Additionally available with the short-hand `api.*`
	// - Types: Protobuf messages from `test.fleet.v1.*`
	//   - Additionally available with the short-hand `fleet.*`
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Constraints:
	//    - Run each test on one DUT with a stylus.
	//        (duts.all(dut, dut.hardware_features.stylus
	//                       == api.HardwareFeatures.Present.PRESENT))
	//         && size(duts) == 1)
	//  - Fanout: In addition to constraints, the plan may want to ensure coverage
	//    across some device features.
	//    TODO(pprabhu) This is an instructive example. We can't say what arch
	//    yet.
	//    - Run each test on one x86 and ARM DUT with a specific camera.
	//        (duts.all(dut, dut.hardware_toplogy.camera.id != "gomoe")
	//         && duts.exist(dut,
	//                       dut.cpu = api.Component.Soc.Architecture.X86)
	//         && duts.exist(dut,
	//                       dut.cpu = api.Component.Soc.Architecture.ARM))
	//      Note that this expression does not have a clause for size(duts). Thus
	//      Test Platform may satisfy this expression by running the test on more
	//      than two DUTs. This behaviour can be unexpected, especially if the
	//      plan fails due to an error on test execution on one of the selected
	//      devices, even though it passed on other devices in the set such that
	//      the expression was satsifed by the passing subset. Selection of a
	//      minimal set of devices to run the plan is best effort.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUTCoverageConstraint proto.InternalMessageInfo

func (m *DUTCoverageConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

// The evaluation context for `expression` MUST include the Chrome OS
// configuration payload for a set of Devices Under Test as a typed
// constant of the following type.
//
//   repeated DUT duts = 1;
//
type DUTCoverageConstraint_DUT struct {
	// Configuration information about the lab deployment of the device.
	FleetDut             *v1.DeviceUnderTest   `protobuf:"bytes,1,opt,name=fleet_dut,json=fleetDut,proto3" json:"fleet_dut,omitempty"`
	HardwareFeatures     *api.HardwareFeatures `protobuf:"bytes,2,opt,name=hardware_features,json=hardwareFeatures,proto3" json:"hardware_features,omitempty"`
	DesignConfigId       *api.DesignConfigId   `protobuf:"bytes,3,opt,name=design_config_id,json=designConfigId,proto3" json:"design_config_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_DUTCoverageConstraint_DUT proto.InternalMessageInfo

func (m *DUTCoverageConstraint_DUT) GetFleetDut() *v1.DeviceUnderTest {
	if m != nil {
		return m.FleetDut
	}
	return nil
}

func (m *DUTCoverageConstraint_DUT) GetHardwareFeatures() *api.HardwareFeatures {
	if m != nil {
		return m.HardwareFeatures
	}
	return nil
}

func (m *DUTCoverageConstraint_DUT) GetDesignConfigId() *api.DesignConfigId {
	if m != nil {
		return m.DesignConfigId
	}
	return nil
}

// Exlclusion is used to record exceptions to the test plan
// specification for devices that are known to cause test failures for some
// temporary or permanent reasons.
type Exclusion struct {
	// Required.
	Type   Exclusion_Type   `protobuf:"varint,1,opt,name=type,proto3,enum=test.plan.v1.Exclusion_Type" json:"type,omitempty"`
	Action Exclusion_Action `protobuf:"varint,5,opt,name=action,proto3,enum=test.plan.v1.Exclusion_Action" json:"action,omitempty"`
	// The tests this exclusion applies to, within a test plan unit.
	//
	// Tests selected by this condition that are not in the test plan unit are
	// ignored. e.g., simply selecting all tests via the test_constraint will
	// apply this exclusion to all tests in the test plan unit.
	TestConstraint *TestConstraint `protobuf:"bytes,2,opt,name=test_constraint,json=testConstraint,proto3" json:"test_constraint,omitempty"`
	// Constraints to exclude particular Device Under Test from being considered
	// to satisfy the test plan.
	//
	// Effectively, the negation of the constraint is added to the dut_constraints
	// for each selected test.
	DutConstraint *DUTExclusionConstraint `protobuf:"bytes,3,opt,name=dut_constraint,json=dutConstraint,proto3" json:"dut_constraint,omitempty"`
	// External references useful for archeology for this exclusion.
	//
	// PERMANENT exclusions MUST add references for the decision to make the
	// exclusion PERMANENT.
	//
	// References should be links with more context behind the decision.
	// Suggested forms:
	// * Monorail bug: https://bugs.chromium.org/p/chromium/issues/detail?id=XXX
	// * Buganizer bug: https://b.corp.google.com/issues/XXX
	References           []string `protobuf:"bytes,4,rep,name=references,proto3" json:"references,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Exclusion proto.InternalMessageInfo

func (m *Exclusion) GetType() Exclusion_Type {
	if m != nil {
		return m.Type
	}
	return Exclusion_TYPE_UNSPECIFIED
}

func (m *Exclusion) GetAction() Exclusion_Action {
	if m != nil {
		return m.Action
	}
	return Exclusion_ACTION_UNSPECIFIED
}

func (m *Exclusion) GetTestConstraint() *TestConstraint {
	if m != nil {
		return m.TestConstraint
	}
	return nil
}

func (m *Exclusion) GetDutConstraint() *DUTExclusionConstraint {
	if m != nil {
		return m.DutConstraint
	}
	return nil
}

func (m *Exclusion) GetReferences() []string {
	if m != nil {
		return m.References
	}
	return nil
}

// Conditions to be met for the Chrome OS configuration of a Device Under
// Test for it to be excluded from consideration to satisfy a test plan unit.
type DUTExclusionConstraint struct {
	// A Common Expression Language (CEL) expression to specify constraints on a
	// Device Under Test's Chrome OS configuration payload. `expression` MUST
	// evaluate to a boolean value in the evaluation context described below.
	//
	// Test Lab Environments may optionally support excluding specific Devices
	// Under Test from being considered for a test plan unit.
	// When supported, the Test Lab Environment MUST effectively evaluate
	// `expression` with the following declarations in scope for each available
	// Device Under Test and ensure that the test is *not* scheduled on a Device
	// Under Test for which `expression` evaluates to true.
	//
	// - Constant: `dut` of type DUTConfigConstraint.DUT defined below, set to the
	//   Chrome OS configuration payload of a particular Device Under Test.
	// - Types: Protobuf messages from `chromiumos.config.api.*`
	//   - Additionally available with the short-hand `api.*`
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical examples of expressions are:
	//
	// - Must not run on a device with a given screen size:
	//     dut.hardware_features.screen.milliinch.value == 14000
	// - TODO: Add model / build target example.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUTExclusionConstraint proto.InternalMessageInfo

func (m *DUTExclusionConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

// The evaluation context for `expression` MUST include the Chrome OS
// configuration payload for a particular Device Under Test as a typed
// constant of the following type.
type DUTExclusionConstraint_DUT struct {
	HardwareFeatures     *api.HardwareFeatures `protobuf:"bytes,1,opt,name=hardware_features,json=hardwareFeatures,proto3" json:"hardware_features,omitempty"`
	DesignConfigId       *api.DesignConfigId   `protobuf:"bytes,2,opt,name=design_config_id,json=designConfigId,proto3" json:"design_config_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_DUTExclusionConstraint_DUT proto.InternalMessageInfo

func (m *DUTExclusionConstraint_DUT) GetHardwareFeatures() *api.HardwareFeatures {
	if m != nil {
		return m.HardwareFeatures
	}
	return nil
}

func (m *DUTExclusionConstraint_DUT) GetDesignConfigId() *api.DesignConfigId {
	if m != nil {
		return m.DesignConfigId
	}
	return nil
}

// Specifies platforms software covered by a test plan unit.
type CodeCoverage struct {
	// A Common Expression Language (CEL) expression to specify Chrome OS platform
	// sources covered by a test plan unit.
	//
	// Test Platform may optionally support skipping test plan units that are not
	// applicable for incoming changes to Chrome OS. If this feature is supported,
	// and if a non-empty blamelist is available, Test Platform MUST effectively
	// evaluate `expression` with the following declarations in scope for the
	// blamelist only include the test plan unit if the `expression` evaluates to
	// true.
	//
	// - Constant: `blamelist` of type CodeCoverage.Blamelist defined below,
	//   populated with blamelist attached to the request, if blamelist is
	//   non-empty.
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Only include test plan unit if there are changes to chromite
	//     blamelist.repo_paths.exists(p, p.startsWith("chromite"))
	// - Only include test plan unit if there are changes to chromite or autotest
	//     blamelist.repo_paths.exists(p, [
	//         "src/third_party/autotest/files",
	//         "chromite"
	//       ].exists(s, p.startsWith(s)))
	// - Do not include test plan unit if there are changes to private overlays
	//     blamelist.repo_paths.all(p, !p.contains("private-overlays"))
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CodeCoverage proto.InternalMessageInfo

func (m *CodeCoverage) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

type CodeCoverage_Blamelist struct {
	// Changed paths (usually directories) in a typical checkout of the Chrome
	// OS source tree.
	//
	// Paths are relative to `repo` root. e.g., `src/platform2/shill`.
	RepoPaths            []string `protobuf:"bytes,1,rep,name=repo_paths,json=repoPaths,proto3" json:"repo_paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CodeCoverage_Blamelist proto.InternalMessageInfo

func (m *CodeCoverage_Blamelist) GetRepoPaths() []string {
	if m != nil {
		return m.RepoPaths
	}
	return nil
}

func init() {
	proto.RegisterEnum("test.plan.v1.Exclusion_Type", Exclusion_Type_name, Exclusion_Type_value)
	proto.RegisterEnum("test.plan.v1.Exclusion_Action", Exclusion_Action_name, Exclusion_Action_value)
	proto.RegisterType((*Specification)(nil), "test.plan.v1.Specification")
	proto.RegisterType((*Plan)(nil), "test.plan.v1.Plan")
	proto.RegisterType((*Unit)(nil), "test.plan.v1.Unit")
	proto.RegisterType((*TestConstraint)(nil), "test.plan.v1.TestConstraint")
	proto.RegisterType((*TestConstraint_Test)(nil), "test.plan.v1.TestConstraint.Test")
	proto.RegisterType((*DUTCoverageConstraint)(nil), "test.plan.v1.DUTCoverageConstraint")
	proto.RegisterType((*DUTCoverageConstraint_DUT)(nil), "test.plan.v1.DUTCoverageConstraint.DUT")
	proto.RegisterType((*Exclusion)(nil), "test.plan.v1.Exclusion")
	proto.RegisterType((*DUTExclusionConstraint)(nil), "test.plan.v1.DUTExclusionConstraint")
	proto.RegisterType((*DUTExclusionConstraint_DUT)(nil), "test.plan.v1.DUTExclusionConstraint.DUT")
	proto.RegisterType((*CodeCoverage)(nil), "test.plan.v1.CodeCoverage")
	proto.RegisterType((*CodeCoverage_Blamelist)(nil), "test.plan.v1.CodeCoverage.Blamelist")
}

func init() { proto.RegisterFile("test/plan/v1/plan.proto", fileDescriptor_1a74b4d4119f628f) }

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