// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/packages.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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 NeedsChromeSourceResponse_Reason int32

const (
	NeedsChromeSourceResponse_UNSPECIFIED NeedsChromeSourceResponse_Reason = 0
	// There is no Chrome prebuilt available.
	NeedsChromeSourceResponse_NO_PREBUILT NeedsChromeSourceResponse_Reason = 1
	// The builder is compiling from source.
	NeedsChromeSourceResponse_COMPILE_SOURCE NeedsChromeSourceResponse_Reason = 2
	// There is a local uprev of Chrome.
	NeedsChromeSourceResponse_LOCAL_UPREV NeedsChromeSourceResponse_Reason = 3
	// A follower package lacks prebuilts.
	NeedsChromeSourceResponse_FOLLOWER_LACKS_PREBUILT NeedsChromeSourceResponse_Reason = 4
)

var NeedsChromeSourceResponse_Reason_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NO_PREBUILT",
	2: "COMPILE_SOURCE",
	3: "LOCAL_UPREV",
	4: "FOLLOWER_LACKS_PREBUILT",
}

var NeedsChromeSourceResponse_Reason_value = map[string]int32{
	"UNSPECIFIED":             0,
	"NO_PREBUILT":             1,
	"COMPILE_SOURCE":          2,
	"LOCAL_UPREV":             3,
	"FOLLOWER_LACKS_PREBUILT": 4,
}

func (x NeedsChromeSourceResponse_Reason) String() string {
	return proto.EnumName(NeedsChromeSourceResponse_Reason_name, int32(x))
}

func (NeedsChromeSourceResponse_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{13, 0}
}

// This can easily be generalized to a Builds method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type BuildsChromeRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target we are checking for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// List of packages to be installed by the builder. If none are specified the
	// standard list of packages is used.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeRequest proto.InternalMessageInfo

func (m *BuildsChromeRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *BuildsChromeRequest) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

type BuildsChromeResponse struct {
	// Whether or not it builds chrome.
	BuildsChrome         bool     `protobuf:"varint,1,opt,name=builds_chrome,json=buildsChrome,proto3" json:"builds_chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeResponse proto.InternalMessageInfo

func (m *BuildsChromeResponse) GetBuildsChrome() bool {
	if m != nil {
		return m.BuildsChrome
	}
	return false
}

type GetBestVisibleRequest struct {
	// An atom to pass to portageq, e.g. 'chromeos-chrome'.
	Atom string `protobuf:"bytes,1,opt,name=atom,proto3" json:"atom,omitempty"`
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine. Checks the chroot when not provided.
	// Required when examining a build target.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleRequest proto.InternalMessageInfo

func (m *GetBestVisibleRequest) GetAtom() string {
	if m != nil {
		return m.Atom
	}
	return ""
}

func (m *GetBestVisibleRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetBestVisibleResponse struct {
	// TODO: is this sufficient? Needs tag too?
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleResponse proto.InternalMessageInfo

func (m *GetBestVisibleResponse) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type GetChromeVersionRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetChromeVersionRequest proto.InternalMessageInfo

func (m *GetChromeVersionRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetChromeVersionResponse struct {
	// The chrome version.
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetChromeVersionResponse proto.InternalMessageInfo

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

type GetTargetVersionsRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsRequest proto.InternalMessageInfo

func (m *GetTargetVersionsRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetTargetVersionsResponse struct {
	// Android version, e.g. 5812377
	AndroidVersion string `protobuf:"bytes,1,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android-branch version, e.g. git_nyc
	AndroidBranchVersion string `protobuf:"bytes,2,opt,name=android_branch_version,json=androidBranchVersion,proto3" json:"android_branch_version,omitempty"`
	// Android-target version, e.g. cheets
	AndroidTargetVersion string `protobuf:"bytes,3,opt,name=android_target_version,json=androidTargetVersion,proto3" json:"android_target_version,omitempty"`
	// Chrome version, e.g. 78.0.3877.0.
	ChromeVersion string `protobuf:"bytes,4,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// Full version, e.g. R78-12438.0.0.
	FullVersion string `protobuf:"bytes,5,opt,name=full_version,json=fullVersion,proto3" json:"full_version,omitempty"`
	// Milestone version, e.g. 78.
	MilestoneVersion string `protobuf:"bytes,6,opt,name=milestone_version,json=milestoneVersion,proto3" json:"milestone_version,omitempty"`
	// Platform version, e.g. 12438.0.0.
	PlatformVersion      string   `protobuf:"bytes,7,opt,name=platform_version,json=platformVersion,proto3" json:"platform_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsResponse proto.InternalMessageInfo

func (m *GetTargetVersionsResponse) GetAndroidVersion() string {
	if m != nil {
		return m.AndroidVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidBranchVersion() string {
	if m != nil {
		return m.AndroidBranchVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidTargetVersion() string {
	if m != nil {
		return m.AndroidTargetVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetChromeVersion() string {
	if m != nil {
		return m.ChromeVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetFullVersion() string {
	if m != nil {
		return m.FullVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetMilestoneVersion() string {
	if m != nil {
		return m.MilestoneVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetPlatformVersion() string {
	if m != nil {
		return m.PlatformVersion
	}
	return ""
}

// The associated method can be run after InstallPackages.
type GetBuilderMetadataRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataRequest proto.InternalMessageInfo

func (m *GetBuilderMetadataRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetBuilderMetadataResponse struct {
	// Metadata for build targets.
	BuildTargetMetadata []*GetBuilderMetadataResponse_BuildTargetMetadata `protobuf:"bytes,1,rep,name=build_target_metadata,json=buildTargetMetadata,proto3" json:"build_target_metadata,omitempty"`
	// Metadata for models.
	ModelMetadata        []*GetBuilderMetadataResponse_ModelMetadata `protobuf:"bytes,2,rep,name=model_metadata,json=modelMetadata,proto3" json:"model_metadata,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
	XXX_unrecognized     []byte                                      `json:"-"`
	XXX_sizecache        int32                                       `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse proto.InternalMessageInfo

func (m *GetBuilderMetadataResponse) GetBuildTargetMetadata() []*GetBuilderMetadataResponse_BuildTargetMetadata {
	if m != nil {
		return m.BuildTargetMetadata
	}
	return nil
}

func (m *GetBuilderMetadataResponse) GetModelMetadata() []*GetBuilderMetadataResponse_ModelMetadata {
	if m != nil {
		return m.ModelMetadata
	}
	return nil
}

type GetBuilderMetadataResponse_ModelMetadata struct {
	// Name of model, such as "astronaut", "babymega", etc.
	ModelName string `protobuf:"bytes,1,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	// EC firmware version, such as "coral_v1.1.7292-04956f5df".
	EcFirmwareVersion string `protobuf:"bytes,2,opt,name=ec_firmware_version,json=ecFirmwareVersion,proto3" json:"ec_firmware_version,omitempty"`
	// Firmware key id, such as "CORALG"
	FirmwareKeyId string `protobuf:"bytes,3,opt,name=firmware_key_id,json=firmwareKeyId,proto3" json:"firmware_key_id,omitempty"`
	// Main readonly firmware version, such as "Google_Coral.10068.82.0".
	MainReadonlyFirmwareVersion string `protobuf:"bytes,4,opt,name=main_readonly_firmware_version,json=mainReadonlyFirmwareVersion,proto3" json:"main_readonly_firmware_version,omitempty"`
	// Main readwrite firmware version, such as "Google_Coral.10068.82.0".
	MainReadwriteFirmwareVersion string   `protobuf:"bytes,5,opt,name=main_readwrite_firmware_version,json=mainReadwriteFirmwareVersion,proto3" json:"main_readwrite_firmware_version,omitempty"`
	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
	XXX_unrecognized             []byte   `json:"-"`
	XXX_sizecache                int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse_ModelMetadata proto.InternalMessageInfo

func (m *GetBuilderMetadataResponse_ModelMetadata) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetEcFirmwareVersion() string {
	if m != nil {
		return m.EcFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetFirmwareKeyId() string {
	if m != nil {
		return m.FirmwareKeyId
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetMainReadonlyFirmwareVersion() string {
	if m != nil {
		return m.MainReadonlyFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetMainReadwriteFirmwareVersion() string {
	if m != nil {
		return m.MainReadwriteFirmwareVersion
	}
	return ""
}

type GetBuilderMetadataResponse_BuildTargetMetadata struct {
	// Name of build_target, such as auron_paine, coral, etc.
	BuildTarget string `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Name of android container branch, such as "git_pi-arc".
	AndroidContainerBranch string `protobuf:"bytes,2,opt,name=android_container_branch,json=androidContainerBranch,proto3" json:"android_container_branch,omitempty"`
	// Name of android container target, such as "cheets".
	AndroidContainerTarget string `protobuf:"bytes,3,opt,name=android_container_target,json=androidContainerTarget,proto3" json:"android_container_target,omitempty"`
	// Name of android container version, such as "6387315".
	AndroidContainerVersion string `protobuf:"bytes,4,opt,name=android_container_version,json=androidContainerVersion,proto3" json:"android_container_version,omitempty"`
	// Whether or not arc-use is enabled.
	ArcUseSet bool `protobuf:"varint,5,opt,name=arc_use_set,json=arcUseSet,proto3" json:"arc_use_set,omitempty"`
	// EC firmware version.
	EcFirmwareVersion string `protobuf:"bytes,6,opt,name=ec_firmware_version,json=ecFirmwareVersion,proto3" json:"ec_firmware_version,omitempty"`
	// Fingerprints.
	Fingerprints []string `protobuf:"bytes,7,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"`
	// Kernel version, such as  "4.14.176-r1088".
	KernelVersion string `protobuf:"bytes,8,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
	// Main firmware version, such as "Google_Auron_paine.6301.58.98.
	MainFirmwareVersion  string   `protobuf:"bytes,9,opt,name=main_firmware_version,json=mainFirmwareVersion,proto3" json:"main_firmware_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse_BuildTargetMetadata proto.InternalMessageInfo

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

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerBranch() string {
	if m != nil {
		return m.AndroidContainerBranch
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerTarget() string {
	if m != nil {
		return m.AndroidContainerTarget
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerVersion() string {
	if m != nil {
		return m.AndroidContainerVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetArcUseSet() bool {
	if m != nil {
		return m.ArcUseSet
	}
	return false
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetEcFirmwareVersion() string {
	if m != nil {
		return m.EcFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetFingerprints() []string {
	if m != nil {
		return m.Fingerprints
	}
	return nil
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetKernelVersion() string {
	if m != nil {
		return m.KernelVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetMainFirmwareVersion() string {
	if m != nil {
		return m.MainFirmwareVersion
	}
	return ""
}

// This can easily be generalized to a HasPrebuilt method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type HasChromePrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome               bool     `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltRequest proto.InternalMessageInfo

func (m *HasChromePrebuiltRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *HasChromePrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

type HasChromePrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltResponse proto.InternalMessageInfo

func (m *HasChromePrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type NeedsChromeSourceRequest struct {
	// The request that will be passed to InstallPackages.
	InstallRequest       *InstallPackagesRequest `protobuf:"bytes,1,opt,name=install_request,json=installRequest,proto3" json:"install_request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_NeedsChromeSourceRequest proto.InternalMessageInfo

func (m *NeedsChromeSourceRequest) GetInstallRequest() *InstallPackagesRequest {
	if m != nil {
		return m.InstallRequest
	}
	return nil
}

type NeedsChromeSourceResponse struct {
	// Whethere Chrome source is needed.
	NeedsChromeSource bool `protobuf:"varint,1,opt,name=needs_chrome_source,json=needsChromeSource,proto3" json:"needs_chrome_source,omitempty"`
	// Reasons for needing Chrome source.
	Reasons []NeedsChromeSourceResponse_Reason `protobuf:"varint,2,rep,packed,name=reasons,proto3,enum=chromite.api.NeedsChromeSourceResponse_Reason" json:"reasons,omitempty"`
	// Packages causing the need for source.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_NeedsChromeSourceResponse proto.InternalMessageInfo

func (m *NeedsChromeSourceResponse) GetNeedsChromeSource() bool {
	if m != nil {
		return m.NeedsChromeSource
	}
	return false
}

func (m *NeedsChromeSourceResponse) GetReasons() []NeedsChromeSourceResponse_Reason {
	if m != nil {
		return m.Reasons
	}
	return nil
}

func (m *NeedsChromeSourceResponse) GetPackages() []*chromiumos.PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

// The generic version of HasChromePrebuilt.
type HasPrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	// Required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome bool `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	// The package whose prebuilt is being queried.
	// The category and package name are required.
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,4,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltRequest proto.InternalMessageInfo

func (m *HasPrebuiltRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *HasPrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

func (m *HasPrebuiltRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type HasPrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltResponse proto.InternalMessageInfo

func (m *HasPrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type UprevPackagesRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target(s) whose packages should be uprevved.
	// Defaults to all build targets when none are given.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,2,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// Required.
	// The overlay type to search against.
	OverlayType OverlayType `protobuf:"varint,3,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Optional.
	// A directory where results should be dumped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevPackagesRequest proto.InternalMessageInfo

func (m *UprevPackagesRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *UprevPackagesRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *UprevPackagesRequest) GetOverlayType() OverlayType {
	if m != nil {
		return m.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

func (m *UprevPackagesRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

// TODO(evanhernandez): Support build-target specific uprevs once needed.
type UprevVersionedPackageRequest struct {
	// The chroot path. Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The package to uprev.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// The versions to consider for an update.
	Versions []*UprevVersionedPackageRequest_GitRef `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"`
	// The build targets whose sysroot should be cleaned of old versions.
	BuildTargets         []*chromiumos.BuildTarget `protobuf:"bytes,4,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *UprevVersionedPackageRequest) Reset()         { *m = UprevVersionedPackageRequest{} }
func (m *UprevVersionedPackageRequest) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageRequest) ProtoMessage()    {}
func (*UprevVersionedPackageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{17}
}

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

var xxx_messageInfo_UprevVersionedPackageRequest proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetVersions() []*UprevVersionedPackageRequest_GitRef {
	if m != nil {
		return m.Versions
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

type UprevVersionedPackageRequest_GitRef struct {
	// Relative path to the git repository.
	Repository string `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"`
	// The name of the git ref.
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// The exact sha1 of the git ref.
	Revision             string   `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageRequest_GitRef proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest_GitRef) GetRepository() string {
	if m != nil {
		return m.Repository
	}
	return ""
}

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

func (m *UprevVersionedPackageRequest_GitRef) GetRevision() string {
	if m != nil {
		return m.Revision
	}
	return ""
}

type UprevPackagesResponse struct {
	// The list of ebuilds that were modified. Contains added and deleted files.
	ModifiedEbuilds []*UprevPackagesResponse_Ebuild `protobuf:"bytes,1,rep,name=modified_ebuilds,json=modifiedEbuilds,proto3" json:"modified_ebuilds,omitempty"`
	// The new version that was uprevved to when an uprev was completed.
	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UprevPackagesResponse) Reset()         { *m = UprevPackagesResponse{} }
func (m *UprevPackagesResponse) String() string { return proto.CompactTextString(m) }
func (*UprevPackagesResponse) ProtoMessage()    {}
func (*UprevPackagesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{18}
}

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

var xxx_messageInfo_UprevPackagesResponse proto.InternalMessageInfo

func (m *UprevPackagesResponse) GetModifiedEbuilds() []*UprevPackagesResponse_Ebuild {
	if m != nil {
		return m.ModifiedEbuilds
	}
	return nil
}

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

type UprevPackagesResponse_Ebuild struct {
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevPackagesResponse_Ebuild proto.InternalMessageInfo

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

type UprevVersionedPackageResponse struct {
	// list of uprev responses.
	Responses            []*UprevPackagesResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *UprevVersionedPackageResponse) Reset()         { *m = UprevVersionedPackageResponse{} }
func (m *UprevVersionedPackageResponse) String() string { return proto.CompactTextString(m) }
func (*UprevVersionedPackageResponse) ProtoMessage()    {}
func (*UprevVersionedPackageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{19}
}

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

var xxx_messageInfo_UprevVersionedPackageResponse proto.InternalMessageInfo

func (m *UprevVersionedPackageResponse) GetResponses() []*UprevPackagesResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromite.api.NeedsChromeSourceResponse_Reason", NeedsChromeSourceResponse_Reason_name, NeedsChromeSourceResponse_Reason_value)
	proto.RegisterType((*BuildsChromeRequest)(nil), "chromite.api.BuildsChromeRequest")
	proto.RegisterType((*BuildsChromeResponse)(nil), "chromite.api.BuildsChromeResponse")
	proto.RegisterType((*GetBestVisibleRequest)(nil), "chromite.api.GetBestVisibleRequest")
	proto.RegisterType((*GetBestVisibleResponse)(nil), "chromite.api.GetBestVisibleResponse")
	proto.RegisterType((*GetChromeVersionRequest)(nil), "chromite.api.GetChromeVersionRequest")
	proto.RegisterType((*GetChromeVersionResponse)(nil), "chromite.api.GetChromeVersionResponse")
	proto.RegisterType((*GetTargetVersionsRequest)(nil), "chromite.api.GetTargetVersionsRequest")
	proto.RegisterType((*GetTargetVersionsResponse)(nil), "chromite.api.GetTargetVersionsResponse")
	proto.RegisterType((*GetBuilderMetadataRequest)(nil), "chromite.api.GetBuilderMetadataRequest")
	proto.RegisterType((*GetBuilderMetadataResponse)(nil), "chromite.api.GetBuilderMetadataResponse")
	proto.RegisterType((*GetBuilderMetadataResponse_ModelMetadata)(nil), "chromite.api.GetBuilderMetadataResponse.ModelMetadata")
	proto.RegisterType((*GetBuilderMetadataResponse_BuildTargetMetadata)(nil), "chromite.api.GetBuilderMetadataResponse.BuildTargetMetadata")
	proto.RegisterType((*HasChromePrebuiltRequest)(nil), "chromite.api.HasChromePrebuiltRequest")
	proto.RegisterType((*HasChromePrebuiltResponse)(nil), "chromite.api.HasChromePrebuiltResponse")
	proto.RegisterType((*NeedsChromeSourceRequest)(nil), "chromite.api.NeedsChromeSourceRequest")
	proto.RegisterType((*NeedsChromeSourceResponse)(nil), "chromite.api.NeedsChromeSourceResponse")
	proto.RegisterType((*HasPrebuiltRequest)(nil), "chromite.api.HasPrebuiltRequest")
	proto.RegisterType((*HasPrebuiltResponse)(nil), "chromite.api.HasPrebuiltResponse")
	proto.RegisterType((*UprevPackagesRequest)(nil), "chromite.api.UprevPackagesRequest")
	proto.RegisterType((*UprevVersionedPackageRequest)(nil), "chromite.api.UprevVersionedPackageRequest")
	proto.RegisterType((*UprevVersionedPackageRequest_GitRef)(nil), "chromite.api.UprevVersionedPackageRequest.GitRef")
	proto.RegisterType((*UprevPackagesResponse)(nil), "chromite.api.UprevPackagesResponse")
	proto.RegisterType((*UprevPackagesResponse_Ebuild)(nil), "chromite.api.UprevPackagesResponse.Ebuild")
	proto.RegisterType((*UprevVersionedPackageResponse)(nil), "chromite.api.UprevVersionedPackageResponse")
}

func init() { proto.RegisterFile("chromite/api/packages.proto", fileDescriptor_40286986e1d9a416) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// PackageServiceClient is the client API for PackageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PackageServiceClient interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error)
	// Check whether the Chrome source tree is needed.  Does not compile nor
	// install any packages.
	NeedsChromeSource(ctx context.Context, in *NeedsChromeSourceRequest, opts ...grpc.CallOption) (*NeedsChromeSourceResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error)
	// Return the various metabuilder fields for a release builder.
	// This can be run after InstallPackages.
	GetBuilderMetadata(ctx context.Context, in *GetBuilderMetadataRequest, opts ...grpc.CallOption) (*GetBuilderMetadataResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error)
}

type packageServiceClient struct {
	cc *grpc.ClientConn
}

func NewPackageServiceClient(cc *grpc.ClientConn) PackageServiceClient {
	return &packageServiceClient{cc}
}

func (c *packageServiceClient) BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error) {
	out := new(BuildsChromeResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/BuildsChrome", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) NeedsChromeSource(ctx context.Context, in *NeedsChromeSourceRequest, opts ...grpc.CallOption) (*NeedsChromeSourceResponse, error) {
	out := new(NeedsChromeSourceResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/NeedsChromeSource", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error) {
	out := new(GetBestVisibleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBestVisible", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error) {
	out := new(GetChromeVersionResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetChromeVersion", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error) {
	out := new(GetTargetVersionsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetTargetVersions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBuilderMetadata(ctx context.Context, in *GetBuilderMetadataRequest, opts ...grpc.CallOption) (*GetBuilderMetadataResponse, error) {
	out := new(GetBuilderMetadataResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBuilderMetadata", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error) {
	out := new(HasChromePrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasChromePrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error) {
	out := new(HasPrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasPrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error) {
	out := new(UprevPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/Uprev", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error) {
	out := new(UprevVersionedPackageResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/UprevVersionedPackage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PackageServiceServer is the server API for PackageService service.
type PackageServiceServer interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(context.Context, *BuildsChromeRequest) (*BuildsChromeResponse, error)
	// Check whether the Chrome source tree is needed.  Does not compile nor
	// install any packages.
	NeedsChromeSource(context.Context, *NeedsChromeSourceRequest) (*NeedsChromeSourceResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(context.Context, *GetBestVisibleRequest) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(context.Context, *GetChromeVersionRequest) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(context.Context, *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error)
	// Return the various metabuilder fields for a release builder.
	// This can be run after InstallPackages.
	GetBuilderMetadata(context.Context, *GetBuilderMetadataRequest) (*GetBuilderMetadataResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(context.Context, *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(context.Context, *HasPrebuiltRequest) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(context.Context, *UprevPackagesRequest) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(context.Context, *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error)
}

// UnimplementedPackageServiceServer can be embedded to have forward compatible implementations.
type UnimplementedPackageServiceServer struct {
}

func (*UnimplementedPackageServiceServer) BuildsChrome(ctx context.Context, req *BuildsChromeRequest) (*BuildsChromeResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildsChrome not implemented")
}
func (*UnimplementedPackageServiceServer) NeedsChromeSource(ctx context.Context, req *NeedsChromeSourceRequest) (*NeedsChromeSourceResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method NeedsChromeSource not implemented")
}
func (*UnimplementedPackageServiceServer) GetBestVisible(ctx context.Context, req *GetBestVisibleRequest) (*GetBestVisibleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBestVisible not implemented")
}
func (*UnimplementedPackageServiceServer) GetChromeVersion(ctx context.Context, req *GetChromeVersionRequest) (*GetChromeVersionResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetChromeVersion not implemented")
}
func (*UnimplementedPackageServiceServer) GetTargetVersions(ctx context.Context, req *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetTargetVersions not implemented")
}
func (*UnimplementedPackageServiceServer) GetBuilderMetadata(ctx context.Context, req *GetBuilderMetadataRequest) (*GetBuilderMetadataResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBuilderMetadata not implemented")
}
func (*UnimplementedPackageServiceServer) HasChromePrebuilt(ctx context.Context, req *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasChromePrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) HasPrebuilt(ctx context.Context, req *HasPrebuiltRequest) (*HasPrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasPrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) Uprev(ctx context.Context, req *UprevPackagesRequest) (*UprevPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Uprev not implemented")
}
func (*UnimplementedPackageServiceServer) UprevVersionedPackage(ctx context.Context, req *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UprevVersionedPackage not implemented")
}

func RegisterPackageServiceServer(s *grpc.Server, srv PackageServiceServer) {
	s.RegisterService(&_PackageService_serviceDesc, srv)
}

func _PackageService_BuildsChrome_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildsChromeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).BuildsChrome(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/BuildsChrome",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).BuildsChrome(ctx, req.(*BuildsChromeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_NeedsChromeSource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(NeedsChromeSourceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).NeedsChromeSource(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/NeedsChromeSource",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).NeedsChromeSource(ctx, req.(*NeedsChromeSourceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBestVisible_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBestVisibleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBestVisible(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBestVisible",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBestVisible(ctx, req.(*GetBestVisibleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetChromeVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetChromeVersionRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetChromeVersion",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, req.(*GetChromeVersionRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetTargetVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTargetVersionsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetTargetVersions",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, req.(*GetTargetVersionsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBuilderMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBuilderMetadataRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBuilderMetadata(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBuilderMetadata",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBuilderMetadata(ctx, req.(*GetBuilderMetadataRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasChromePrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasChromePrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasChromePrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, req.(*HasChromePrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasPrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasPrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasPrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, req.(*HasPrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_Uprev_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).Uprev(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/Uprev",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).Uprev(ctx, req.(*UprevPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_UprevVersionedPackage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevVersionedPackageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/UprevVersionedPackage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, req.(*UprevVersionedPackageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PackageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PackageService",
	HandlerType: (*PackageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildsChrome",
			Handler:    _PackageService_BuildsChrome_Handler,
		},
		{
			MethodName: "NeedsChromeSource",
			Handler:    _PackageService_NeedsChromeSource_Handler,
		},
		{
			MethodName: "GetBestVisible",
			Handler:    _PackageService_GetBestVisible_Handler,
		},
		{
			MethodName: "GetChromeVersion",
			Handler:    _PackageService_GetChromeVersion_Handler,
		},
		{
			MethodName: "GetTargetVersions",
			Handler:    _PackageService_GetTargetVersions_Handler,
		},
		{
			MethodName: "GetBuilderMetadata",
			Handler:    _PackageService_GetBuilderMetadata_Handler,
		},
		{
			MethodName: "HasChromePrebuilt",
			Handler:    _PackageService_HasChromePrebuilt_Handler,
		},
		{
			MethodName: "HasPrebuilt",
			Handler:    _PackageService_HasPrebuilt_Handler,
		},
		{
			MethodName: "Uprev",
			Handler:    _PackageService_Uprev_Handler,
		},
		{
			MethodName: "UprevVersionedPackage",
			Handler:    _PackageService_UprevVersionedPackage_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/packages.proto",
}
