// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/client_profile_id.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

// Id of a client profile. See comment in client.proto for
// more details.
type ClientProfileId struct {
	// Required.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Required.
	ClientId             *ClientId `protobuf:"bytes,2,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_ClientProfileId proto.InternalMessageInfo

func (m *ClientProfileId) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *ClientProfileId) GetClientId() *ClientId {
	if m != nil {
		return m.ClientId
	}
	return nil
}

func init() {
	proto.RegisterType((*ClientProfileId)(nil), "prototype.ClientProfileId")
}

func init() { proto.RegisterFile("prototype/client_profile_id.proto", fileDescriptor_f90fefd09be3fdd5) }

var fileDescriptor_f90fefd09be3fdd5 = []byte{
	// 165 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2c, 0x28, 0xca, 0x2f,
	0xc9, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x4f, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0x89, 0x2f, 0x28, 0xca,
	0x4f, 0xcb, 0xcc, 0x49, 0x8d, 0xcf, 0x4c, 0xd1, 0x03, 0xcb, 0x09, 0x71, 0xc2, 0x95, 0x48, 0x49,
	0x62, 0xa8, 0x86, 0xa9, 0x52, 0x0a, 0xe6, 0xe2, 0x77, 0x06, 0x0b, 0x05, 0x40, 0xf4, 0x7b, 0xa6,
	0x08, 0xf1, 0x71, 0x31, 0x65, 0xa6, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x31, 0x65, 0xa6,
	0x08, 0x19, 0x70, 0x71, 0xc2, 0x75, 0x49, 0x30, 0x29, 0x30, 0x6a, 0x70, 0x1b, 0x09, 0xeb, 0xc1,
	0x4d, 0xd4, 0x83, 0x68, 0xf7, 0x4c, 0x09, 0xe2, 0x48, 0x86, 0xb2, 0x9c, 0x4c, 0xa3, 0x8c, 0xd3,
	0xf3, 0xf5, 0x92, 0x33, 0x8a, 0xf2, 0x73, 0x33, 0x4b, 0x73, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0x61,
	0x9c, 0xfc, 0x62, 0xfd, 0xcc, 0xbc, 0xb4, 0xa2, 0x44, 0x7d, 0xb0, 0x01, 0xfa, 0xe9, 0xf9, 0xfa,
	0x70, 0x93, 0x92, 0xd8, 0xc0, 0x4c, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x23, 0x0e, 0xb9,
	0x68, 0xdd, 0x00, 0x00, 0x00,
}
