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

package api

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

type Component_Soc_Architecture int32

const (
	Component_Soc_ARCHITECTURE_UNDEFINED Component_Soc_Architecture = 0
	Component_Soc_X86                    Component_Soc_Architecture = 1
	Component_Soc_X86_64                 Component_Soc_Architecture = 2
	Component_Soc_ARM                    Component_Soc_Architecture = 3
	Component_Soc_ARM64                  Component_Soc_Architecture = 4
)

var Component_Soc_Architecture_name = map[int32]string{
	0: "ARCHITECTURE_UNDEFINED",
	1: "X86",
	2: "X86_64",
	3: "ARM",
	4: "ARM64",
}

var Component_Soc_Architecture_value = map[string]int32{
	"ARCHITECTURE_UNDEFINED": 0,
	"X86":                    1,
	"X86_64":                 2,
	"ARM":                    3,
	"ARM64":                  4,
}

func (x Component_Soc_Architecture) String() string {
	return proto.EnumName(Component_Soc_Architecture_name, int32(x))
}

func (Component_Soc_Architecture) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a14fcfee222958ff, []int{0, 0, 0}
}

type Component_Memory_Type int32

const (
	Component_Memory_TYPE_UNDEFINED Component_Memory_Type = 0
	Component_Memory_DDR            Component_Memory_Type = 1
	Component_Memory_DDR2           Component_Memory_Type = 2
	Component_Memory_DDR3           Component_Memory_Type = 3
	Component_Memory_DDR4           Component_Memory_Type = 4
	Component_Memory_LP_DDR3        Component_Memory_Type = 5
	Component_Memory_LP_DDR4        Component_Memory_Type = 6
)

var Component_Memory_Type_name = map[int32]string{
	0: "TYPE_UNDEFINED",
	1: "DDR",
	2: "DDR2",
	3: "DDR3",
	4: "DDR4",
	5: "LP_DDR3",
	6: "LP_DDR4",
}

var Component_Memory_Type_value = map[string]int32{
	"TYPE_UNDEFINED": 0,
	"DDR":            1,
	"DDR2":           2,
	"DDR3":           3,
	"DDR4":           4,
	"LP_DDR3":        5,
	"LP_DDR4":        6,
}

func (x Component_Memory_Type) String() string {
	return proto.EnumName(Component_Memory_Type_name, int32(x))
}

func (Component_Memory_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a14fcfee222958ff, []int{0, 1, 0}
}

type Component_Camera_Feature int32

const (
	Component_Camera_FEATURE_UNKNOWN Component_Camera_Feature = 0
	Component_Camera_ACTIVITY_LED    Component_Camera_Feature = 1
)

var Component_Camera_Feature_name = map[int32]string{
	0: "FEATURE_UNKNOWN",
	1: "ACTIVITY_LED",
}

var Component_Camera_Feature_value = map[string]int32{
	"FEATURE_UNKNOWN": 0,
	"ACTIVITY_LED":    1,
}

func (x Component_Camera_Feature) String() string {
	return proto.EnumName(Component_Camera_Feature_name, int32(x))
}

func (Component_Camera_Feature) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a14fcfee222958ff, []int{0, 3, 0}
}

type Component_Camera_ClockType int32

const (
	Component_Camera_CLOCK_TYPE_UNDEFINED Component_Camera_ClockType = 0
	Component_Camera_MONOTONIC            Component_Camera_ClockType = 1
	Component_Camera_BOOTTIME             Component_Camera_ClockType = 2
)

var Component_Camera_ClockType_name = map[int32]string{
	0: "CLOCK_TYPE_UNDEFINED",
	1: "MONOTONIC",
	2: "BOOTTIME",
}

var Component_Camera_ClockType_value = map[string]int32{
	"CLOCK_TYPE_UNDEFINED": 0,
	"MONOTONIC":            1,
	"BOOTTIME":             2,
}

func (x Component_Camera_ClockType) String() string {
	return proto.EnumName(Component_Camera_ClockType_name, int32(x))
}

func (Component_Camera_ClockType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_a14fcfee222958ff, []int{0, 3, 1}
}

type Component struct {
	// Globally unique component identifier.
	Id *ComponentId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are valid to be assigned to Type:
	//	*Component_Soc_
	//	*Component_Memory_
	//	*Component_Bluetooth_
	//	*Component_Camera_
	//	*Component_Touchscreen_
	Type                 isComponent_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_Component proto.InternalMessageInfo

func (m *Component) GetId() *ComponentId {
	if m != nil {
		return m.Id
	}
	return nil
}

type isComponent_Type interface {
	isComponent_Type()
}

type Component_Soc_ struct {
	Soc *Component_Soc `protobuf:"bytes,2,opt,name=soc,proto3,oneof"`
}

type Component_Memory_ struct {
	Memory *Component_Memory `protobuf:"bytes,3,opt,name=memory,proto3,oneof"`
}

type Component_Bluetooth_ struct {
	Bluetooth *Component_Bluetooth `protobuf:"bytes,4,opt,name=bluetooth,proto3,oneof"`
}

type Component_Camera_ struct {
	Camera *Component_Camera `protobuf:"bytes,5,opt,name=camera,proto3,oneof"`
}

type Component_Touchscreen_ struct {
	Touchscreen *Component_Touchscreen `protobuf:"bytes,6,opt,name=touchscreen,proto3,oneof"`
}

func (*Component_Soc_) isComponent_Type() {}

func (*Component_Memory_) isComponent_Type() {}

func (*Component_Bluetooth_) isComponent_Type() {}

func (*Component_Camera_) isComponent_Type() {}

func (*Component_Touchscreen_) isComponent_Type() {}

func (m *Component) GetType() isComponent_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Component) GetSoc() *Component_Soc {
	if x, ok := m.GetType().(*Component_Soc_); ok {
		return x.Soc
	}
	return nil
}

func (m *Component) GetMemory() *Component_Memory {
	if x, ok := m.GetType().(*Component_Memory_); ok {
		return x.Memory
	}
	return nil
}

func (m *Component) GetBluetooth() *Component_Bluetooth {
	if x, ok := m.GetType().(*Component_Bluetooth_); ok {
		return x.Bluetooth
	}
	return nil
}

func (m *Component) GetCamera() *Component_Camera {
	if x, ok := m.GetType().(*Component_Camera_); ok {
		return x.Camera
	}
	return nil
}

func (m *Component) GetTouchscreen() *Component_Touchscreen {
	if x, ok := m.GetType().(*Component_Touchscreen_); ok {
		return x.Touchscreen
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Component) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Component_Soc_)(nil),
		(*Component_Memory_)(nil),
		(*Component_Bluetooth_)(nil),
		(*Component_Camera_)(nil),
		(*Component_Touchscreen_)(nil),
	}
}

type Component_Soc struct {
	Family *Component_Soc_Family `protobuf:"bytes,1,opt,name=family,proto3" json:"family,omitempty"`
	// Unique model name returned from cpu_id instruction
	Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	// Number of cores present on the SoC model
	Cores                int32    `protobuf:"varint,3,opt,name=cores,proto3" json:"cores,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Component_Soc proto.InternalMessageInfo

func (m *Component_Soc) GetFamily() *Component_Soc_Family {
	if m != nil {
		return m.Family
	}
	return nil
}

func (m *Component_Soc) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *Component_Soc) GetCores() int32 {
	if m != nil {
		return m.Cores
	}
	return 0
}

type Component_Soc_Family struct {
	Arch Component_Soc_Architecture `protobuf:"varint,1,opt,name=arch,proto3,enum=chromiumos.config.api.Component_Soc_Architecture" json:"arch,omitempty"`
	// Common name (human friendly) for the family
	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Component_Soc_Family proto.InternalMessageInfo

func (m *Component_Soc_Family) GetArch() Component_Soc_Architecture {
	if m != nil {
		return m.Arch
	}
	return Component_Soc_ARCHITECTURE_UNDEFINED
}

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

type Component_Memory struct {
	Type                 Component_Memory_Type `protobuf:"varint,1,opt,name=type,proto3,enum=chromiumos.config.api.Component_Memory_Type" json:"type,omitempty"`
	SpeedMhz             int32                 `protobuf:"varint,2,opt,name=speed_mhz,json=speedMhz,proto3" json:"speed_mhz,omitempty"`
	SizeMb               int32                 `protobuf:"varint,3,opt,name=size_mb,json=sizeMb,proto3" json:"size_mb,omitempty"`
	PartNumber           string                `protobuf:"bytes,4,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"`
	ManufacturerId       *PartnerId            `protobuf:"bytes,5,opt,name=manufacturer_id,json=manufacturerId,proto3" json:"manufacturer_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_Component_Memory proto.InternalMessageInfo

func (m *Component_Memory) GetType() Component_Memory_Type {
	if m != nil {
		return m.Type
	}
	return Component_Memory_TYPE_UNDEFINED
}

func (m *Component_Memory) GetSpeedMhz() int32 {
	if m != nil {
		return m.SpeedMhz
	}
	return 0
}

func (m *Component_Memory) GetSizeMb() int32 {
	if m != nil {
		return m.SizeMb
	}
	return 0
}

func (m *Component_Memory) GetPartNumber() string {
	if m != nil {
		return m.PartNumber
	}
	return ""
}

func (m *Component_Memory) GetManufacturerId() *PartnerId {
	if m != nil {
		return m.ManufacturerId
	}
	return nil
}

type Component_Bluetooth struct {
	// 4-digit hex
	VendorId string `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	// 4-digit hex
	ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
	// 4-digit hex
	BcdDevice            string   `protobuf:"bytes,3,opt,name=bcd_device,json=bcdDevice,proto3" json:"bcd_device,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Component_Bluetooth proto.InternalMessageInfo

func (m *Component_Bluetooth) GetVendorId() string {
	if m != nil {
		return m.VendorId
	}
	return ""
}

func (m *Component_Bluetooth) GetProductId() string {
	if m != nil {
		return m.ProductId
	}
	return ""
}

func (m *Component_Bluetooth) GetBcdDevice() string {
	if m != nil {
		return m.BcdDevice
	}
	return ""
}

type Component_Camera struct {
	Features             []Component_Camera_Feature `protobuf:"varint,1,rep,packed,name=features,proto3,enum=chromiumos.config.api.Component_Camera_Feature" json:"features,omitempty"`
	ClockType            Component_Camera_ClockType `protobuf:"varint,2,opt,name=clock_type,json=clockType,proto3,enum=chromiumos.config.api.Component_Camera_ClockType" json:"clock_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

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

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

var xxx_messageInfo_Component_Camera proto.InternalMessageInfo

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

func (m *Component_Camera) GetClockType() Component_Camera_ClockType {
	if m != nil {
		return m.ClockType
	}
	return Component_Camera_CLOCK_TYPE_UNDEFINED
}

type Component_Touchscreen struct {
	// 4-digit hex
	VendorId string `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	// 4-digit hex
	ProductId string `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
	// 4-digit hex
	FwVersion string `protobuf:"bytes,3,opt,name=fw_version,json=fwVersion,proto3" json:"fw_version,omitempty"`
	// Relative path to the touch firmware binary
	// that will be installed when a given
	// component vendor/product is detected.
	FwPath               string   `protobuf:"bytes,4,opt,name=fw_path,json=fwPath,proto3" json:"fw_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Component_Touchscreen proto.InternalMessageInfo

func (m *Component_Touchscreen) GetVendorId() string {
	if m != nil {
		return m.VendorId
	}
	return ""
}

func (m *Component_Touchscreen) GetProductId() string {
	if m != nil {
		return m.ProductId
	}
	return ""
}

func (m *Component_Touchscreen) GetFwVersion() string {
	if m != nil {
		return m.FwVersion
	}
	return ""
}

func (m *Component_Touchscreen) GetFwPath() string {
	if m != nil {
		return m.FwPath
	}
	return ""
}

type ComponentList struct {
	Value                []*Component `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_ComponentList proto.InternalMessageInfo

func (m *ComponentList) GetValue() []*Component {
	if m != nil {
		return m.Value
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.config.api.Component_Soc_Architecture", Component_Soc_Architecture_name, Component_Soc_Architecture_value)
	proto.RegisterEnum("chromiumos.config.api.Component_Memory_Type", Component_Memory_Type_name, Component_Memory_Type_value)
	proto.RegisterEnum("chromiumos.config.api.Component_Camera_Feature", Component_Camera_Feature_name, Component_Camera_Feature_value)
	proto.RegisterEnum("chromiumos.config.api.Component_Camera_ClockType", Component_Camera_ClockType_name, Component_Camera_ClockType_value)
	proto.RegisterType((*Component)(nil), "chromiumos.config.api.Component")
	proto.RegisterType((*Component_Soc)(nil), "chromiumos.config.api.Component.Soc")
	proto.RegisterType((*Component_Soc_Family)(nil), "chromiumos.config.api.Component.Soc.Family")
	proto.RegisterType((*Component_Memory)(nil), "chromiumos.config.api.Component.Memory")
	proto.RegisterType((*Component_Bluetooth)(nil), "chromiumos.config.api.Component.Bluetooth")
	proto.RegisterType((*Component_Camera)(nil), "chromiumos.config.api.Component.Camera")
	proto.RegisterType((*Component_Touchscreen)(nil), "chromiumos.config.api.Component.Touchscreen")
	proto.RegisterType((*ComponentList)(nil), "chromiumos.config.api.ComponentList")
}

func init() { proto.RegisterFile("config/api/component.proto", fileDescriptor_a14fcfee222958ff) }

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