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

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
	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_04855929ef1e786b, []int{1, 0, 0}
}

type Component_Soc_Family int32

const (
	Component_Soc_FAMILY_UNDEFINED Component_Soc_Family = 0
	Component_Soc_RK3399           Component_Soc_Family = 1
	Component_Soc_GEMINI_LAKE      Component_Soc_Family = 2
)

var Component_Soc_Family_name = map[int32]string{
	0: "FAMILY_UNDEFINED",
	1: "RK3399",
	2: "GEMINI_LAKE",
}

var Component_Soc_Family_value = map[string]int32{
	"FAMILY_UNDEFINED": 0,
	"RK3399":           1,
	"GEMINI_LAKE":      2,
}

func (x Component_Soc_Family) String() string {
	return proto.EnumName(Component_Soc_Family_name, int32(x))
}

func (Component_Soc_Family) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_04855929ef1e786b, []int{1, 0, 1}
}

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_04855929ef1e786b, []int{1, 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_04855929ef1e786b, []int{1, 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_04855929ef1e786b, []int{1, 3, 1}
}

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

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

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

var xxx_messageInfo_ComponentId proto.InternalMessageInfo

func (m *ComponentId) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

type Component struct {
	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_04855929ef1e786b, []int{1}
}

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:"varint,1,opt,name=family,proto3,enum=prototype.Component_Soc_Family" json:"family,omitempty"`
	Model                string               `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	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_04855929ef1e786b, []int{1, 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 Component_Soc_FAMILY_UNDEFINED
}

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
}

var E_Component_Soc_Arch = &proto.ExtensionDesc{
	ExtendedType:  (*descriptor.EnumValueOptions)(nil),
	ExtensionType: (Component_Soc_Architecture)(nil),
	Field:         1914503,
	Name:          "prototype.Component.Soc.arch",
	Tag:           "varint,1914503,opt,name=arch,enum=prototype.Component_Soc_Architecture",
	Filename:      "prototype/component.proto",
}

type Component_Memory struct {
	Type                 Component_Memory_Type `protobuf:"varint,1,opt,name=type,proto3,enum=prototype.Component_Memory_Type" json:"type,omitempty"`
	SpeedMhz             int32                 `protobuf:"varint,2,opt,name=speed_mhz,json=speedMhz,proto3" json:"speed_mhz,omitempty"`
	Size                 *ByteSize             `protobuf:"bytes,3,opt,name=size,proto3" json:"size,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_04855929ef1e786b, []int{1, 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) GetSize() *ByteSize {
	if m != nil {
		return m.Size
	}
	return nil
}

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 {
	UsbDeviceId          *UsbDeviceId `protobuf:"bytes,1,opt,name=usb_device_id,json=usbDeviceId,proto3" json:"usb_device_id,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_04855929ef1e786b, []int{1, 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) GetUsbDeviceId() *UsbDeviceId {
	if m != nil {
		return m.UsbDeviceId
	}
	return nil
}

type Component_Camera struct {
	Features             []Component_Camera_Feature `protobuf:"varint,1,rep,packed,name=features,proto3,enum=prototype.Component_Camera_Feature" json:"features,omitempty"`
	ClockType            Component_Camera_ClockType `protobuf:"varint,2,opt,name=clock_type,json=clockType,proto3,enum=prototype.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_04855929ef1e786b, []int{1, 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 {
	VendorId             string   `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	ProductId            string   `protobuf:"bytes,2,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
	FwVersion            string   `protobuf:"bytes,3,opt,name=fw_version,json=fwVersion,proto3" json:"fw_version,omitempty"`
	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_04855929ef1e786b, []int{1, 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_04855929ef1e786b, []int{2}
}

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("prototype.Component_Soc_Architecture", Component_Soc_Architecture_name, Component_Soc_Architecture_value)
	proto.RegisterEnum("prototype.Component_Soc_Family", Component_Soc_Family_name, Component_Soc_Family_value)
	proto.RegisterEnum("prototype.Component_Memory_Type", Component_Memory_Type_name, Component_Memory_Type_value)
	proto.RegisterEnum("prototype.Component_Camera_Feature", Component_Camera_Feature_name, Component_Camera_Feature_value)
	proto.RegisterEnum("prototype.Component_Camera_ClockType", Component_Camera_ClockType_name, Component_Camera_ClockType_value)
	proto.RegisterType((*ComponentId)(nil), "prototype.ComponentId")
	proto.RegisterType((*Component)(nil), "prototype.Component")
	proto.RegisterExtension(E_Component_Soc_Arch)
	proto.RegisterType((*Component_Soc)(nil), "prototype.Component.Soc")
	proto.RegisterType((*Component_Memory)(nil), "prototype.Component.Memory")
	proto.RegisterType((*Component_Bluetooth)(nil), "prototype.Component.Bluetooth")
	proto.RegisterType((*Component_Camera)(nil), "prototype.Component.Camera")
	proto.RegisterType((*Component_Touchscreen)(nil), "prototype.Component.Touchscreen")
	proto.RegisterType((*ComponentList)(nil), "prototype.ComponentList")
}

func init() { proto.RegisterFile("prototype/component.proto", fileDescriptor_04855929ef1e786b) }

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