// Code generated by protoc-gen-go. DO NOT EDIT.
// source: device/config_id.proto

package device

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

// These are the globally unique identifiers that determine what set of
// configuration data is used for a given device.
type ConfigId struct {
	// Required.
	PlatformId *PlatformId `protobuf:"bytes,1,opt,name=platform_id,json=platformId,proto3" json:"platform_id,omitempty"`
	// Required.
	ModelId *ModelId `protobuf:"bytes,2,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"`
	// Required.
	VariantId *VariantId `protobuf:"bytes,3,opt,name=variant_id,json=variantId,proto3" json:"variant_id,omitempty"`
	// Required.
	BrandId              *BrandId `protobuf:"bytes,4,opt,name=brand_id,json=brandId,proto3" json:"brand_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ConfigId proto.InternalMessageInfo

func (m *ConfigId) GetPlatformId() *PlatformId {
	if m != nil {
		return m.PlatformId
	}
	return nil
}

func (m *ConfigId) GetModelId() *ModelId {
	if m != nil {
		return m.ModelId
	}
	return nil
}

func (m *ConfigId) GetVariantId() *VariantId {
	if m != nil {
		return m.VariantId
	}
	return nil
}

func (m *ConfigId) GetBrandId() *BrandId {
	if m != nil {
		return m.BrandId
	}
	return nil
}

func init() {
	proto.RegisterType((*ConfigId)(nil), "device.ConfigId")
}

func init() { proto.RegisterFile("device/config_id.proto", fileDescriptor_5967df6ee4aad538) }

var fileDescriptor_5967df6ee4aad538 = []byte{
	// 238 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x8f, 0x3f, 0x4f, 0xc3, 0x30,
	0x10, 0xc5, 0x15, 0x40, 0xa5, 0xb8, 0x03, 0xc2, 0x12, 0x60, 0x75, 0x42, 0x4c, 0x88, 0xc1, 0xae,
	0xda, 0x6f, 0x50, 0x26, 0x0f, 0x48, 0x28, 0x03, 0x03, 0x0b, 0x72, 0x72, 0x89, 0xb1, 0x54, 0xfb,
	0x22, 0x13, 0xf2, 0x1d, 0xf9, 0x56, 0xc8, 0xff, 0x52, 0x10, 0xdb, 0xf3, 0xef, 0xdd, 0x7b, 0xbe,
	0x23, 0x37, 0xd0, 0x4d, 0xa6, 0xed, 0x44, 0x8b, 0xae, 0x37, 0xfa, 0xdd, 0x00, 0x1f, 0x3c, 0x8e,
	0x48, 0x17, 0x89, 0xaf, 0x59, 0xf6, 0x87, 0x83, 0x1a, 0x7b, 0xf4, 0x76, 0x9e, 0x58, 0x5f, 0x67,
	0xc7, 0x22, 0x74, 0x87, 0xff, 0xb8, 0xf1, 0xca, 0xc1, 0x11, 0xdf, 0x66, 0x3c, 0x29, 0x6f, 0x94,
	0x1b, 0x67, 0xe3, 0xfe, 0xbb, 0x22, 0xcb, 0xa7, 0xf8, 0xb9, 0x04, 0xba, 0x23, 0xab, 0x5f, 0x1f,
	0xb1, 0xea, 0xae, 0x7a, 0x58, 0x6d, 0x29, 0x4f, 0x59, 0xfe, 0x92, 0x2d, 0x09, 0x35, 0x19, 0x66,
	0x4d, 0x1f, 0xc9, 0xb2, 0xec, 0xc0, 0x4e, 0x62, 0xe2, 0xb2, 0x24, 0x9e, 0x03, 0x97, 0x50, 0x9f,
	0xdb, 0x24, 0xe8, 0x86, 0x90, 0xe3, 0x06, 0xec, 0x34, 0x4e, 0x5f, 0x95, 0xe9, 0xd7, 0xe4, 0x48,
	0xa8, 0x2f, 0xa6, 0x22, 0x43, 0x7b, 0x39, 0x85, 0x9d, 0xfd, 0x6d, 0xdf, 0x07, 0x1e, 0xda, 0x9b,
	0x24, 0xf6, 0xdb, 0xb7, 0x8d, 0x46, 0xde, 0x7e, 0x78, 0xb4, 0xe6, 0xcb, 0x72, 0xf4, 0x5a, 0x94,
	0x07, 0x7e, 0x0a, 0xe3, 0x7a, 0xaf, 0x44, 0xbc, 0x5a, 0x68, 0x14, 0xa9, 0xa4, 0x59, 0x44, 0xb0,
	0xfb, 0x09, 0x00, 0x00, 0xff, 0xff, 0x92, 0xa2, 0x38, 0x75, 0x89, 0x01, 0x00, 0x00,
}
