// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/design_project.proto

package prototype

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

// Defines the metadata for a project, which ultimately controls how this
// project is managed throughout the infrastructure.
type DesignProject struct {
	// Defines the human-readable name for the project.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Defines the git-repo path for the project.
	Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"`
	// Defines the path that stores all of the project configuration.
	// Relative to the git-repo
	ConfigPath string `protobuf:"bytes,3,opt,name=config_path,json=configPath,proto3" json:"config_path,omitempty"`
	// Define the project's local_manifest.
	RepoManifestPath string `protobuf:"bytes,4,opt,name=repo_manifest_path,json=repoManifestPath,proto3" json:"repo_manifest_path,omitempty"`
	// The Google Storage bucket for artifacts from the project's builds.
	GsBucket string `protobuf:"bytes,5,opt,name=gs_bucket,json=gsBucket,proto3" json:"gs_bucket,omitempty"`
	// Defines config needed to maintain firmware builders for the project.
	FirmwareConfig *DesignProject_FirmwareConfig `protobuf:"bytes,6,opt,name=firmware_config,json=firmwareConfig,proto3" json:"firmware_config,omitempty"`
	// Define factory build config needed for manufacturing verification.
	FactoryConfig *DesignProject_FactoryConfig `protobuf:"bytes,7,opt,name=factory_config,json=factoryConfig,proto3" json:"factory_config,omitempty"`
	// Defines signing config unique to the given design project.
	SigningConfig        *DesignProject_SigningConfig `protobuf:"bytes,8,opt,name=signing_config,json=signingConfig,proto3" json:"signing_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_DesignProject proto.InternalMessageInfo

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

func (m *DesignProject) GetRepo() string {
	if m != nil {
		return m.Repo
	}
	return ""
}

func (m *DesignProject) GetConfigPath() string {
	if m != nil {
		return m.ConfigPath
	}
	return ""
}

func (m *DesignProject) GetRepoManifestPath() string {
	if m != nil {
		return m.RepoManifestPath
	}
	return ""
}

func (m *DesignProject) GetGsBucket() string {
	if m != nil {
		return m.GsBucket
	}
	return ""
}

func (m *DesignProject) GetFirmwareConfig() *DesignProject_FirmwareConfig {
	if m != nil {
		return m.FirmwareConfig
	}
	return nil
}

func (m *DesignProject) GetFactoryConfig() *DesignProject_FactoryConfig {
	if m != nil {
		return m.FactoryConfig
	}
	return nil
}

func (m *DesignProject) GetSigningConfig() *DesignProject_SigningConfig {
	if m != nil {
		return m.SigningConfig
	}
	return nil
}

type DesignProject_FirmwareConfig struct {
	// Defines the firmware branch that will be maintained for the project.
	FirmwareBranch       string   `protobuf:"bytes,1,opt,name=firmware_branch,json=firmwareBranch,proto3" json:"firmware_branch,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DesignProject_FirmwareConfig proto.InternalMessageInfo

func (m *DesignProject_FirmwareConfig) GetFirmwareBranch() string {
	if m != nil {
		return m.FirmwareBranch
	}
	return ""
}

type DesignProject_FactoryConfig struct {
	// Defines the factory branch that will be maintained for the project.
	FactoryBranch string `protobuf:"bytes,1,opt,name=factory_branch,json=factoryBranch,proto3" json:"factory_branch,omitempty"`
	// A key in the project.yaml metadata file, to look up the branch, path,
	// etc. For example, to match the entry in the project.yaml file:
	//
	// MILKYWAY:
	//   board: GALAXY
	//   branch: master
	//   version: 3
	//   path: v3/MILKYWAY
	//
	// project_key should be 'MILKYWAY'. The matching is case-insensitive.
	HwidProjectKey       string   `protobuf:"bytes,2,opt,name=hwid_project_key,json=hwidProjectKey,proto3" json:"hwid_project_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DesignProject_FactoryConfig proto.InternalMessageInfo

func (m *DesignProject_FactoryConfig) GetFactoryBranch() string {
	if m != nil {
		return m.FactoryBranch
	}
	return ""
}

func (m *DesignProject_FactoryConfig) GetHwidProjectKey() string {
	if m != nil {
		return m.HwidProjectKey
	}
	return ""
}

type DesignProject_SigningConfig struct {
	// Key names have taken historically followed many different patterns.
	// To support all of the cases, this defines an explicit mapping between the
	// supported brands and corresponding keys present in the respective
	// keysets.
	// Going forward, this could be standardized, removing the need for the
	// explict mapping, but this will be required for the foreseeable future.
	BrandIdToKey         map[string]string `protobuf:"bytes,1,rep,name=brand_id_to_key,json=brandIdToKey,proto3" json:"brand_id_to_key,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_DesignProject_SigningConfig proto.InternalMessageInfo

func (m *DesignProject_SigningConfig) GetBrandIdToKey() map[string]string {
	if m != nil {
		return m.BrandIdToKey
	}
	return nil
}

func init() {
	proto.RegisterType((*DesignProject)(nil), "prototype.DesignProject")
	proto.RegisterType((*DesignProject_FirmwareConfig)(nil), "prototype.DesignProject.FirmwareConfig")
	proto.RegisterType((*DesignProject_FactoryConfig)(nil), "prototype.DesignProject.FactoryConfig")
	proto.RegisterType((*DesignProject_SigningConfig)(nil), "prototype.DesignProject.SigningConfig")
	proto.RegisterMapType((map[string]string)(nil), "prototype.DesignProject.SigningConfig.BrandIdToKeyEntry")
}

func init() { proto.RegisterFile("prototype/design_project.proto", fileDescriptor_f430eea6a6b81e0b) }

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