// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/common.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

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

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

// The types of images that can be built.
// These correspond to support types in lib/constants.py such
// as IMAGE_TYPE_BASE, IMAGE_TYPE_RECOVERY, and so on.
type ImageType int32

const (
	ImageType_IMAGE_TYPE_UNDEFINED ImageType = 0
	ImageType_BASE                 ImageType = 1
	ImageType_DEV                  ImageType = 2
	ImageType_TEST                 ImageType = 3
	ImageType_BASE_VM              ImageType = 4
	ImageType_TEST_VM              ImageType = 5
	ImageType_RECOVERY             ImageType = 6
	ImageType_FACTORY              ImageType = 7
	ImageType_FIRMWARE             ImageType = 8
	ImageType_CR50_FIRMWARE        ImageType = 9
	ImageType_BASE_GUEST_VM        ImageType = 10
	ImageType_TEST_GUEST_VM        ImageType = 11
)

var ImageType_name = map[int32]string{
	0:  "IMAGE_TYPE_UNDEFINED",
	1:  "BASE",
	2:  "DEV",
	3:  "TEST",
	4:  "BASE_VM",
	5:  "TEST_VM",
	6:  "RECOVERY",
	7:  "FACTORY",
	8:  "FIRMWARE",
	9:  "CR50_FIRMWARE",
	10: "BASE_GUEST_VM",
	11: "TEST_GUEST_VM",
}

var ImageType_value = map[string]int32{
	"IMAGE_TYPE_UNDEFINED": 0,
	"BASE":                 1,
	"DEV":                  2,
	"TEST":                 3,
	"BASE_VM":              4,
	"TEST_VM":              5,
	"RECOVERY":             6,
	"FACTORY":              7,
	"FIRMWARE":             8,
	"CR50_FIRMWARE":        9,
	"BASE_GUEST_VM":        10,
	"TEST_GUEST_VM":        11,
}

func (x ImageType) String() string {
	return proto.EnumName(ImageType_name, int32(x))
}

func (ImageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{0}
}

// The various channels that we release through.
type Channel int32

const (
	Channel_CHANNEL_UNSPECIFIED Channel = 0
	Channel_CHANNEL_STABLE      Channel = 1
	Channel_CHANNEL_BETA        Channel = 2
	Channel_CHANNEL_DEV         Channel = 3
	Channel_CHANNEL_CANARY      Channel = 4
)

var Channel_name = map[int32]string{
	0: "CHANNEL_UNSPECIFIED",
	1: "CHANNEL_STABLE",
	2: "CHANNEL_BETA",
	3: "CHANNEL_DEV",
	4: "CHANNEL_CANARY",
}

var Channel_value = map[string]int32{
	"CHANNEL_UNSPECIFIED": 0,
	"CHANNEL_STABLE":      1,
	"CHANNEL_BETA":        2,
	"CHANNEL_DEV":         3,
	"CHANNEL_CANARY":      4,
}

func (x Channel) String() string {
	return proto.EnumName(Channel_name, int32(x))
}

func (Channel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{1}
}

// TODO(crbug.com/1020615): Drop this from chromite/api/toolchain.proto (and
// here) once usage has migrated to BuilderConfig.Artifacts.ArtifactType.
// Meanwhile, keep this in sync with chromite/api/toolchain.proto.  The various
// toolchain optimization artifact types.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{2}
}

// Facilitates testing new Goma approaches before rolling them out
// more widely.
type GomaConfig_GomaApproach int32

const (
	GomaConfig_GOMA_APPROACH_UNSPECIFIED GomaConfig_GomaApproach = 0
	GomaConfig_DEFAULT                   GomaConfig_GomaApproach = 1
	GomaConfig_RBE_PROD                  GomaConfig_GomaApproach = 2
	GomaConfig_RBE_STAGING               GomaConfig_GomaApproach = 3
)

var GomaConfig_GomaApproach_name = map[int32]string{
	0: "GOMA_APPROACH_UNSPECIFIED",
	1: "DEFAULT",
	2: "RBE_PROD",
	3: "RBE_STAGING",
}

var GomaConfig_GomaApproach_value = map[string]int32{
	"GOMA_APPROACH_UNSPECIFIED": 0,
	"DEFAULT":                   1,
	"RBE_PROD":                  2,
	"RBE_STAGING":               3,
}

func (x GomaConfig_GomaApproach) String() string {
	return proto.EnumName(GomaConfig_GomaApproach_name, int32(x))
}

func (GomaConfig_GomaApproach) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3, 0}
}

// Location enum; whether the resource is inside or outside of the chroot.
type Path_Location int32

const (
	Path_NO_LOCATION Path_Location = 0
	Path_INSIDE      Path_Location = 1
	Path_OUTSIDE     Path_Location = 2
)

var Path_Location_name = map[int32]string{
	0: "NO_LOCATION",
	1: "INSIDE",
	2: "OUTSIDE",
}

var Path_Location_value = map[string]int32{
	"NO_LOCATION": 0,
	"INSIDE":      1,
	"OUTSIDE":     2,
}

func (x Path_Location) String() string {
	return proto.EnumName(Path_Location_name, int32(x))
}

func (Path_Location) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{6, 0}
}

// Does this artifact require a build?
type PrepareForBuildResponse_BuildRelevance int32

const (
	PrepareForBuildResponse_UNSPECIFIED PrepareForBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForBuildResponse_NEEDED PrepareForBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForBuildResponse_UNKNOWN PrepareForBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForBuildResponse_POINTLESS PrepareForBuildResponse_BuildRelevance = 3
)

var PrepareForBuildResponse_BuildRelevance_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEEDED",
	2: "UNKNOWN",
	3: "POINTLESS",
}

var PrepareForBuildResponse_BuildRelevance_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEEDED":      1,
	"UNKNOWN":     2,
	"POINTLESS":   3,
}

func (x PrepareForBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{13, 0}
}

// BuildTarget encapsulates a number of related arguments. At the moment, the
// usage of specific arguments is on a per endpoint basis, but will converge
// to support a standard set as time goes on.
// BuildTarget is a more appropriate name going forward for what we currently
// call "board".
type BuildTarget struct {
	// The name of the build target (a.k.a. board name).
	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 *BuildTarget) Reset()         { *m = BuildTarget{} }
func (m *BuildTarget) String() string { return proto.CompactTextString(m) }
func (*BuildTarget) ProtoMessage()    {}
func (*BuildTarget) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{0}
}

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

var xxx_messageInfo_BuildTarget proto.InternalMessageInfo

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

// Chroot is used to define how to enter a chroot.
type Chroot struct {
	// The directory containing the chroot.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The cache directory override.
	CacheDir string `protobuf:"bytes,2,opt,name=cache_dir,json=cacheDir,proto3" json:"cache_dir,omitempty"`
	// Environment configuration.
	Env *Chroot_ChrootEnv `protobuf:"bytes,3,opt,name=env,proto3" json:"env,omitempty"`
	// The directory where the chrome source should be mounted.
	ChromeDir            string   `protobuf:"bytes,4,opt,name=chrome_dir,json=chromeDir,proto3" json:"chrome_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Chroot proto.InternalMessageInfo

func (m *Chroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Chroot) GetCacheDir() string {
	if m != nil {
		return m.CacheDir
	}
	return ""
}

func (m *Chroot) GetEnv() *Chroot_ChrootEnv {
	if m != nil {
		return m.Env
	}
	return nil
}

func (m *Chroot) GetChromeDir() string {
	if m != nil {
		return m.ChromeDir
	}
	return ""
}

type Chroot_ChrootEnv struct {
	// USE flags to set.
	UseFlags []*UseFlag `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// FEATURES flags to set.
	Features             []*Feature `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Chroot_ChrootEnv proto.InternalMessageInfo

func (m *Chroot_ChrootEnv) GetUseFlags() []*UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *Chroot_ChrootEnv) GetFeatures() []*Feature {
	if m != nil {
		return m.Features
	}
	return nil
}

// FEATURES environment variable component message.
type Feature struct {
	Feature              string   `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Feature proto.InternalMessageInfo

func (m *Feature) GetFeature() string {
	if m != nil {
		return m.Feature
	}
	return ""
}

type GomaConfig struct {
	// The goma install location.
	// Required.
	GomaDir string `protobuf:"bytes,1,opt,name=goma_dir,json=gomaDir,proto3" json:"goma_dir,omitempty"`
	// The goma client credentials file.
	GomaClientJson string `protobuf:"bytes,2,opt,name=goma_client_json,json=gomaClientJson,proto3" json:"goma_client_json,omitempty"`
	// Path to the Goma client used for build package.
	// If None, goma_dir will be used instead.
	ChromeosGomaDir string                  `protobuf:"bytes,3,opt,name=chromeos_goma_dir,json=chromeosGomaDir,proto3" json:"chromeos_goma_dir,omitempty"`
	GomaApproach    GomaConfig_GomaApproach `protobuf:"varint,4,opt,name=goma_approach,json=gomaApproach,proto3,enum=chromiumos.GomaConfig_GomaApproach" json:"goma_approach,omitempty"`
	// The directory where the goma logs will be extracted.
	LogDir *SyncedDir `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"`
	// The name of the goma stats file. It will be dumped inside log_dir.
	StatsFile string `protobuf:"bytes,6,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// The name of the goma counterz file. It will be dumped inside log_dir.
	CounterzFile         string   `protobuf:"bytes,7,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaConfig proto.InternalMessageInfo

func (m *GomaConfig) GetGomaDir() string {
	if m != nil {
		return m.GomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaClientJson() string {
	if m != nil {
		return m.GomaClientJson
	}
	return ""
}

func (m *GomaConfig) GetChromeosGomaDir() string {
	if m != nil {
		return m.ChromeosGomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaApproach() GomaConfig_GomaApproach {
	if m != nil {
		return m.GomaApproach
	}
	return GomaConfig_GOMA_APPROACH_UNSPECIFIED
}

func (m *GomaConfig) GetLogDir() *SyncedDir {
	if m != nil {
		return m.LogDir
	}
	return nil
}

func (m *GomaConfig) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaConfig) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

type GomaArtifacts struct {
	// Goma stats file.
	StatsFile string `protobuf:"bytes,1,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// Goma counterz file.
	CounterzFile string `protobuf:"bytes,2,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	// Goma log files.
	LogFiles             []string `protobuf:"bytes,3,rep,name=log_files,json=logFiles,proto3" json:"log_files,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaArtifacts proto.InternalMessageInfo

func (m *GomaArtifacts) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaArtifacts) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

func (m *GomaArtifacts) GetLogFiles() []string {
	if m != nil {
		return m.LogFiles
	}
	return nil
}

// Message describing a package, The corresponding variable names are from
// https://devmanual.gentoo.org/ebuild-writing/variables/index.html
type PackageInfo struct {
	// The package name (PN variable).
	PackageName string `protobuf:"bytes,1,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// The package category (CATEGORY variable).
	Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"`
	// The package version and revision (PVR variable).
	Version              string   `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PackageInfo proto.InternalMessageInfo

func (m *PackageInfo) GetPackageName() string {
	if m != nil {
		return m.PackageName
	}
	return ""
}

func (m *PackageInfo) GetCategory() string {
	if m != nil {
		return m.Category
	}
	return ""
}

func (m *PackageInfo) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

// A message to clarify inside/outside chroot paths.
type Path struct {
	// The path to the resource.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The path location.
	Location             Path_Location `protobuf:"varint,2,opt,name=location,proto3,enum=chromiumos.Path_Location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_Path proto.InternalMessageInfo

func (m *Path) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Path) GetLocation() Path_Location {
	if m != nil {
		return m.Location
	}
	return Path_NO_LOCATION
}

// A message used to indicate an output location for results. Specifically,
// this is used to automatically transfer files out of the chroot when needed.
// Note: No more than one ResultPath per message can be supported.
type ResultPath struct {
	// Required.
	// The result directory information.
	Path                 *Path    `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ResultPath proto.InternalMessageInfo

func (m *ResultPath) GetPath() *Path {
	if m != nil {
		return m.Path
	}
	return nil
}

// A SyncedDir will have all of its contents transferred into a tmp directory
// in the chroot before the endpoint is called, and afterwords its contents
// will be exactly what was in the tmp directory when the endpoint completed.
type SyncedDir struct {
	// Required.
	// The directory being synced.
	Dir                  string   `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SyncedDir proto.InternalMessageInfo

func (m *SyncedDir) GetDir() string {
	if m != nil {
		return m.Dir
	}
	return ""
}

// See also crrev.com/c/1929452 and:
//   https://cs.corp.google.com/piper///depot/google3/third_party/luci/buildbucket/proto/common.proto?l=147-176&rcl=257714215
// A Gerrit patchset.
type GerritChange struct {
	// Gerrit hostname, e.g. "chromium-review.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Gerrit project, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Change number, e.g. 12345.
	Change int64 `protobuf:"varint,3,opt,name=change,proto3" json:"change,omitempty"`
	// Patch set number, e.g. 1.
	Patchset             int64    `protobuf:"varint,4,opt,name=patchset,proto3" json:"patchset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GerritChange proto.InternalMessageInfo

func (m *GerritChange) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GerritChange) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GerritChange) GetChange() int64 {
	if m != nil {
		return m.Change
	}
	return 0
}

func (m *GerritChange) GetPatchset() int64 {
	if m != nil {
		return m.Patchset
	}
	return 0
}

type GitilesCommit struct {
	// Gitiles hostname, e.g. "chromium.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Repository name on the host, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Commit HEX SHA1.
	Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Commit ref, e.g. "refs/heads/master".
	// NOT a branch name: if specified, must start with "refs/".
	Ref string `protobuf:"bytes,4,opt,name=ref,proto3" json:"ref,omitempty"`
	// Defines a total order of commits on the ref. Requires ref field.
	Position             uint32   `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GitilesCommit proto.InternalMessageInfo

func (m *GitilesCommit) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GitilesCommit) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GitilesCommit) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *GitilesCommit) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *GitilesCommit) GetPosition() uint32 {
	if m != nil {
		return m.Position
	}
	return 0
}

// Message for USE flags.
type UseFlag struct {
	// The use flag.
	Flag                 string   `protobuf:"bytes,1,opt,name=flag,proto3" json:"flag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UseFlag) Reset()         { *m = UseFlag{} }
func (m *UseFlag) String() string { return proto.CompactTextString(m) }
func (*UseFlag) ProtoMessage()    {}
func (*UseFlag) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{11}
}

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

var xxx_messageInfo_UseFlag proto.InternalMessageInfo

func (m *UseFlag) GetFlag() string {
	if m != nil {
		return m.Flag
	}
	return ""
}

// A wrapper around a serialized protocol buffer.
type ProtoBytes struct {
	SerializedProto      []byte   `protobuf:"bytes,1,opt,name=serialized_proto,json=serializedProto,proto3" json:"serialized_proto,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ProtoBytes) Reset()         { *m = ProtoBytes{} }
func (m *ProtoBytes) String() string { return proto.CompactTextString(m) }
func (*ProtoBytes) ProtoMessage()    {}
func (*ProtoBytes) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{12}
}

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

var xxx_messageInfo_ProtoBytes proto.InternalMessageInfo

func (m *ProtoBytes) GetSerializedProto() []byte {
	if m != nil {
		return m.SerializedProto
	}
	return nil
}

// TODO(crbug/1019868): Consider migrating
// chromite.api.toolchain.PrepareForToolchainBuildRequest as well.
type PrepareForBuildResponse struct {
	BuildRelevance       PrepareForBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromiumos.PrepareForBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

func (m *PrepareForBuildResponse) Reset()         { *m = PrepareForBuildResponse{} }
func (m *PrepareForBuildResponse) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildResponse) ProtoMessage()    {}
func (*PrepareForBuildResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{13}
}

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

var xxx_messageInfo_PrepareForBuildResponse proto.InternalMessageInfo

func (m *PrepareForBuildResponse) GetBuildRelevance() PrepareForBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForBuildResponse_UNSPECIFIED
}

// Additional information about artifacts used by PrepareForBuild endpoints.
// TODO(crbug/1019868): This is migrating to ArtifactProfileInfo.
type PrepareForBuildAdditionalArgs struct {
	// Types that are valid to be assigned to PrepareForBuildArgs:
	//	*PrepareForBuildAdditionalArgs_ChromeCwpProfile
	//	*PrepareForBuildAdditionalArgs_KernelVersion
	PrepareForBuildArgs  isPrepareForBuildAdditionalArgs_PrepareForBuildArgs `protobuf_oneof:"prepare_for_build_args"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *PrepareForBuildAdditionalArgs) Reset()         { *m = PrepareForBuildAdditionalArgs{} }
func (m *PrepareForBuildAdditionalArgs) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildAdditionalArgs) ProtoMessage()    {}
func (*PrepareForBuildAdditionalArgs) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{14}
}

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

var xxx_messageInfo_PrepareForBuildAdditionalArgs proto.InternalMessageInfo

type isPrepareForBuildAdditionalArgs_PrepareForBuildArgs interface {
	isPrepareForBuildAdditionalArgs_PrepareForBuildArgs()
}

type PrepareForBuildAdditionalArgs_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type PrepareForBuildAdditionalArgs_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

func (*PrepareForBuildAdditionalArgs_ChromeCwpProfile) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (*PrepareForBuildAdditionalArgs_KernelVersion) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (m *PrepareForBuildAdditionalArgs) GetPrepareForBuildArgs() isPrepareForBuildAdditionalArgs_PrepareForBuildArgs {
	if m != nil {
		return m.PrepareForBuildArgs
	}
	return nil
}

func (m *PrepareForBuildAdditionalArgs) GetChromeCwpProfile() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *PrepareForBuildAdditionalArgs) GetKernelVersion() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

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

// ToolchainService Unverified Release AFDO artifacts require information
// about the builder that created the image used to generate the unverified
// chrome benchmark perf file.
type AfdoRelease struct {
	// ToolchainService Chrome AFDO artifacts require profile name.
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3" json:"chrome_cwp_profile,omitempty"`
	// The build id of the image_build.  Used to generate the location for the
	// image archive.
	ImageBuildId         int64    `protobuf:"varint,2,opt,name=image_build_id,json=imageBuildId,proto3" json:"image_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AfdoRelease) Reset()         { *m = AfdoRelease{} }
func (m *AfdoRelease) String() string { return proto.CompactTextString(m) }
func (*AfdoRelease) ProtoMessage()    {}
func (*AfdoRelease) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{15}
}

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

var xxx_messageInfo_AfdoRelease proto.InternalMessageInfo

func (m *AfdoRelease) GetChromeCwpProfile() string {
	if m != nil {
		return m.ChromeCwpProfile
	}
	return ""
}

func (m *AfdoRelease) GetImageBuildId() int64 {
	if m != nil {
		return m.ImageBuildId
	}
	return 0
}

// Artifact profile information used by artifact prepare/bundle endpoints in
// addition to input_artifacts.
type ArtifactProfileInfo struct {
	// Types that are valid to be assigned to ArtifactProfileInfo:
	//	*ArtifactProfileInfo_ChromeCwpProfile
	//	*ArtifactProfileInfo_KernelVersion
	//	*ArtifactProfileInfo_AfdoRelase
	ArtifactProfileInfo  isArtifactProfileInfo_ArtifactProfileInfo `protobuf_oneof:"artifact_profile_info"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *ArtifactProfileInfo) Reset()         { *m = ArtifactProfileInfo{} }
func (m *ArtifactProfileInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactProfileInfo) ProtoMessage()    {}
func (*ArtifactProfileInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{16}
}

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

var xxx_messageInfo_ArtifactProfileInfo proto.InternalMessageInfo

type isArtifactProfileInfo_ArtifactProfileInfo interface {
	isArtifactProfileInfo_ArtifactProfileInfo()
}

type ArtifactProfileInfo_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type ArtifactProfileInfo_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

type ArtifactProfileInfo_AfdoRelase struct {
	AfdoRelase *AfdoRelease `protobuf:"bytes,3,opt,name=afdo_relase,json=afdoRelase,proto3,oneof"`
}

func (*ArtifactProfileInfo_ChromeCwpProfile) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_KernelVersion) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_AfdoRelase) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (m *ArtifactProfileInfo) GetArtifactProfileInfo() isArtifactProfileInfo_ArtifactProfileInfo {
	if m != nil {
		return m.ArtifactProfileInfo
	}
	return nil
}

func (m *ArtifactProfileInfo) GetChromeCwpProfile() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *ArtifactProfileInfo) GetKernelVersion() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

func (m *ArtifactProfileInfo) GetAfdoRelase() *AfdoRelease {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_AfdoRelase); ok {
		return x.AfdoRelase
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ArtifactProfileInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ArtifactProfileInfo_ChromeCwpProfile)(nil),
		(*ArtifactProfileInfo_KernelVersion)(nil),
		(*ArtifactProfileInfo_AfdoRelase)(nil),
	}
}

func init() {
	proto.RegisterEnum("chromiumos.ImageType", ImageType_name, ImageType_value)
	proto.RegisterEnum("chromiumos.Channel", Channel_name, Channel_value)
	proto.RegisterEnum("chromiumos.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromiumos.GomaConfig_GomaApproach", GomaConfig_GomaApproach_name, GomaConfig_GomaApproach_value)
	proto.RegisterEnum("chromiumos.Path_Location", Path_Location_name, Path_Location_value)
	proto.RegisterEnum("chromiumos.PrepareForBuildResponse_BuildRelevance", PrepareForBuildResponse_BuildRelevance_name, PrepareForBuildResponse_BuildRelevance_value)
	proto.RegisterType((*BuildTarget)(nil), "chromiumos.BuildTarget")
	proto.RegisterType((*Chroot)(nil), "chromiumos.Chroot")
	proto.RegisterType((*Chroot_ChrootEnv)(nil), "chromiumos.Chroot.ChrootEnv")
	proto.RegisterType((*Feature)(nil), "chromiumos.Feature")
	proto.RegisterType((*GomaConfig)(nil), "chromiumos.GomaConfig")
	proto.RegisterType((*GomaArtifacts)(nil), "chromiumos.GomaArtifacts")
	proto.RegisterType((*PackageInfo)(nil), "chromiumos.PackageInfo")
	proto.RegisterType((*Path)(nil), "chromiumos.Path")
	proto.RegisterType((*ResultPath)(nil), "chromiumos.ResultPath")
	proto.RegisterType((*SyncedDir)(nil), "chromiumos.SyncedDir")
	proto.RegisterType((*GerritChange)(nil), "chromiumos.GerritChange")
	proto.RegisterType((*GitilesCommit)(nil), "chromiumos.GitilesCommit")
	proto.RegisterType((*UseFlag)(nil), "chromiumos.UseFlag")
	proto.RegisterType((*ProtoBytes)(nil), "chromiumos.ProtoBytes")
	proto.RegisterType((*PrepareForBuildResponse)(nil), "chromiumos.PrepareForBuildResponse")
	proto.RegisterType((*PrepareForBuildAdditionalArgs)(nil), "chromiumos.PrepareForBuildAdditionalArgs")
	proto.RegisterType((*AfdoRelease)(nil), "chromiumos.AfdoRelease")
	proto.RegisterType((*ArtifactProfileInfo)(nil), "chromiumos.ArtifactProfileInfo")
}

func init() { proto.RegisterFile("chromiumos/common.proto", fileDescriptor_fa0b57c3d7d4c63b) }

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