// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/config/api/component_id.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

// Uniquely identifies any component used in manufacturing a device.
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_28baef3f13e66268, []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 ""
}

func init() {
	proto.RegisterType((*ComponentId)(nil), "chromiumos.config.api.ComponentId")
}

func init() {
	proto.RegisterFile("chromiumos/config/api/component_id.proto", fileDescriptor_28baef3f13e66268)
}

var fileDescriptor_28baef3f13e66268 = []byte{
	// 129 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x48, 0xce, 0x28, 0xca,
	0xcf, 0xcd, 0x2c, 0xcd, 0xcd, 0x2f, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x4f, 0x2c,
	0xc8, 0xd4, 0x4f, 0xce, 0xcf, 0x2d, 0xc8, 0xcf, 0x4b, 0xcd, 0x2b, 0x89, 0xcf, 0x4c, 0xd1, 0x2b,
	0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x45, 0xa8, 0xd4, 0x83, 0xa8, 0xd4, 0x4b, 0x2c, 0xc8, 0x54,
	0x52, 0xe6, 0xe2, 0x76, 0x86, 0x29, 0xf6, 0x4c, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29,
	0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0xb4, 0xa2, 0x34, 0xd2, 0xf3,
	0xf5, 0x60, 0x06, 0xe8, 0xe5, 0x17, 0xa5, 0xeb, 0x63, 0xda, 0x9b, 0x9e, 0x0f, 0xb2, 0x3a, 0x89,
	0x0d, 0x6c, 0x9d, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xd1, 0x9b, 0xd4, 0x28, 0x9a, 0x00, 0x00,
	0x00,
}
