// Code generated by protoc-gen-go. DO NOT EDIT.
// source: kythe/proto/entryset.proto

package entryset_go_proto

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 EntrySet struct {
	Nodes                []*EntrySet_Node      `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
	FactGroups           []*EntrySet_FactGroup `protobuf:"bytes,2,rep,name=fact_groups,json=factGroups,proto3" json:"fact_groups,omitempty"`
	EdgeGroups           []*EntrySet_EdgeGroup `protobuf:"bytes,3,rep,name=edge_groups,json=edgeGroups,proto3" json:"edge_groups,omitempty"`
	Symbols              []*EntrySet_String    `protobuf:"bytes,4,rep,name=symbols,proto3" json:"symbols,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet proto.InternalMessageInfo

func (m *EntrySet) GetNodes() []*EntrySet_Node {
	if m != nil {
		return m.Nodes
	}
	return nil
}

func (m *EntrySet) GetFactGroups() []*EntrySet_FactGroup {
	if m != nil {
		return m.FactGroups
	}
	return nil
}

func (m *EntrySet) GetEdgeGroups() []*EntrySet_EdgeGroup {
	if m != nil {
		return m.EdgeGroups
	}
	return nil
}

func (m *EntrySet) GetSymbols() []*EntrySet_String {
	if m != nil {
		return m.Symbols
	}
	return nil
}

type EntrySet_Node struct {
	Corpus               int32    `protobuf:"varint,1,opt,name=corpus,proto3" json:"corpus,omitempty"`
	Language             int32    `protobuf:"varint,2,opt,name=language,proto3" json:"language,omitempty"`
	Path                 int32    `protobuf:"varint,3,opt,name=path,proto3" json:"path,omitempty"`
	Root                 int32    `protobuf:"varint,4,opt,name=root,proto3" json:"root,omitempty"`
	Signature            int32    `protobuf:"varint,5,opt,name=signature,proto3" json:"signature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_Node proto.InternalMessageInfo

func (m *EntrySet_Node) GetCorpus() int32 {
	if m != nil {
		return m.Corpus
	}
	return 0
}

func (m *EntrySet_Node) GetLanguage() int32 {
	if m != nil {
		return m.Language
	}
	return 0
}

func (m *EntrySet_Node) GetPath() int32 {
	if m != nil {
		return m.Path
	}
	return 0
}

func (m *EntrySet_Node) GetRoot() int32 {
	if m != nil {
		return m.Root
	}
	return 0
}

func (m *EntrySet_Node) GetSignature() int32 {
	if m != nil {
		return m.Signature
	}
	return 0
}

type EntrySet_Fact struct {
	Name                 int32    `protobuf:"varint,1,opt,name=name,proto3" json:"name,omitempty"`
	Value                int32    `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_Fact proto.InternalMessageInfo

func (m *EntrySet_Fact) GetName() int32 {
	if m != nil {
		return m.Name
	}
	return 0
}

func (m *EntrySet_Fact) GetValue() int32 {
	if m != nil {
		return m.Value
	}
	return 0
}

type EntrySet_FactGroup struct {
	Facts                []*EntrySet_Fact `protobuf:"bytes,1,rep,name=facts,proto3" json:"facts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_FactGroup proto.InternalMessageInfo

func (m *EntrySet_FactGroup) GetFacts() []*EntrySet_Fact {
	if m != nil {
		return m.Facts
	}
	return nil
}

type EntrySet_Edge struct {
	Kind                 int32    `protobuf:"varint,1,opt,name=kind,proto3" json:"kind,omitempty"`
	Target               int32    `protobuf:"varint,2,opt,name=target,proto3" json:"target,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_Edge proto.InternalMessageInfo

func (m *EntrySet_Edge) GetKind() int32 {
	if m != nil {
		return m.Kind
	}
	return 0
}

func (m *EntrySet_Edge) GetTarget() int32 {
	if m != nil {
		return m.Target
	}
	return 0
}

type EntrySet_EdgeGroup struct {
	Edges                []*EntrySet_Edge `protobuf:"bytes,1,rep,name=edges,proto3" json:"edges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_EdgeGroup proto.InternalMessageInfo

func (m *EntrySet_EdgeGroup) GetEdges() []*EntrySet_Edge {
	if m != nil {
		return m.Edges
	}
	return nil
}

type EntrySet_String struct {
	Prefix               int32    `protobuf:"varint,1,opt,name=prefix,proto3" json:"prefix,omitempty"`
	Suffix               []byte   `protobuf:"bytes,2,opt,name=suffix,proto3" json:"suffix,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EntrySet_String proto.InternalMessageInfo

func (m *EntrySet_String) GetPrefix() int32 {
	if m != nil {
		return m.Prefix
	}
	return 0
}

func (m *EntrySet_String) GetSuffix() []byte {
	if m != nil {
		return m.Suffix
	}
	return nil
}

func init() {
	proto.RegisterType((*EntrySet)(nil), "kythe.storage.EntrySet")
	proto.RegisterType((*EntrySet_Node)(nil), "kythe.storage.EntrySet.Node")
	proto.RegisterType((*EntrySet_Fact)(nil), "kythe.storage.EntrySet.Fact")
	proto.RegisterType((*EntrySet_FactGroup)(nil), "kythe.storage.EntrySet.FactGroup")
	proto.RegisterType((*EntrySet_Edge)(nil), "kythe.storage.EntrySet.Edge")
	proto.RegisterType((*EntrySet_EdgeGroup)(nil), "kythe.storage.EntrySet.EdgeGroup")
	proto.RegisterType((*EntrySet_String)(nil), "kythe.storage.EntrySet.String")
}

func init() { proto.RegisterFile("kythe/proto/entryset.proto", fileDescriptor_d82fe1fc380de7f6) }

var fileDescriptor_d82fe1fc380de7f6 = []byte{
	// 377 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x31, 0x6f, 0xf2, 0x30,
	0x14, 0x14, 0x90, 0xf0, 0xc1, 0xe3, 0xfb, 0x86, 0xcf, 0xad, 0xaa, 0x28, 0x42, 0x55, 0xdb, 0x89,
	0x29, 0x54, 0x74, 0x61, 0xab, 0x84, 0x44, 0xbb, 0x75, 0x08, 0x5b, 0x17, 0x64, 0xc8, 0x8b, 0x89,
	0x80, 0x38, 0xb2, 0x9d, 0xaa, 0x6c, 0xfd, 0x33, 0xfd, 0x9f, 0xd5, 0xb3, 0x63, 0xaa, 0x0e, 0x94,
	0x29, 0xef, 0xce, 0x77, 0xef, 0x94, 0xb3, 0x21, 0xde, 0x1e, 0xcc, 0x06, 0xc7, 0x95, 0x92, 0x46,
	0x8e, 0xb1, 0x34, 0xea, 0xa0, 0xd1, 0x24, 0x16, 0xb2, 0x7f, 0xf6, 0x2c, 0xd1, 0x46, 0x2a, 0x2e,
	0xf0, 0xee, 0x33, 0x84, 0xde, 0x9c, 0x14, 0x0b, 0x34, 0x6c, 0x02, 0x61, 0x29, 0x33, 0xd4, 0x51,
	0xeb, 0xa6, 0x33, 0x1a, 0x4c, 0x86, 0xc9, 0x0f, 0x6d, 0xe2, 0x75, 0xc9, 0x8b, 0xcc, 0x30, 0x75,
	0x52, 0x36, 0x83, 0x41, 0xce, 0xd7, 0x66, 0x29, 0x94, 0xac, 0x2b, 0x1d, 0xb5, 0xad, 0xf3, 0xf6,
	0x94, 0xf3, 0x89, 0xaf, 0xcd, 0x33, 0x29, 0x53, 0xc8, 0xfd, 0x68, 0x77, 0x60, 0x26, 0xd0, 0xef,
	0xe8, 0xfc, 0xbe, 0x63, 0x9e, 0x09, 0x6c, 0x76, 0xa0, 0x1f, 0x35, 0x9b, 0xc2, 0x1f, 0x7d, 0xd8,
	0xaf, 0xe4, 0x4e, 0x47, 0x81, 0xf5, 0x5f, 0x9f, 0xf2, 0x2f, 0x8c, 0x2a, 0x4a, 0x91, 0x7a, 0x79,
	0xfc, 0xd1, 0x82, 0x80, 0xfe, 0x88, 0x5d, 0x41, 0x77, 0x2d, 0x55, 0x55, 0xd3, 0xff, 0xb7, 0x46,
	0x61, 0xda, 0x20, 0x16, 0x43, 0x6f, 0xc7, 0x4b, 0x51, 0x73, 0x81, 0x51, 0xdb, 0x9e, 0x1c, 0x31,
	0x63, 0x10, 0x54, 0xdc, 0x6c, 0xa2, 0x8e, 0xe5, 0xed, 0x4c, 0x9c, 0x92, 0xd2, 0x44, 0x81, 0xe3,
	0x68, 0x66, 0x43, 0xe8, 0xeb, 0x42, 0x94, 0xdc, 0xd4, 0x0a, 0xa3, 0xd0, 0x1e, 0x7c, 0x13, 0xf1,
	0x3d, 0x04, 0xd4, 0x0c, 0x39, 0x4b, 0xbe, 0xc7, 0x26, 0xdf, 0xce, 0xec, 0x12, 0xc2, 0x37, 0xbe,
	0xab, 0x7d, 0xb4, 0x03, 0xf1, 0x23, 0xf4, 0x8f, 0x5d, 0xd2, 0xbd, 0x51, 0x9b, 0x67, 0xef, 0x8d,
	0x1c, 0xa9, 0x93, 0xc6, 0x13, 0x08, 0xa8, 0x48, 0x8a, 0xdc, 0x16, 0x65, 0xe6, 0x23, 0x69, 0xa6,
	0x22, 0x0c, 0x57, 0x02, 0x4d, 0x93, 0xd9, 0x20, 0x0a, 0x3d, 0x96, 0x4f, 0xa1, 0x54, 0xff, 0xd9,
	0x50, 0x72, 0xa4, 0x4e, 0x1a, 0x4f, 0xa1, 0xeb, 0xda, 0xa7, 0x88, 0x4a, 0x61, 0x5e, 0xbc, 0xfb,
	0xae, 0x1d, 0x22, 0x5e, 0xd7, 0x39, 0xf1, 0x14, 0xfd, 0x37, 0x6d, 0xd0, 0xec, 0xe2, 0xf5, 0xbf,
	0x7f, 0xc8, 0x4b, 0x21, 0x97, 0xf6, 0x2d, 0xaf, 0xba, 0xf6, 0xf3, 0xf0, 0x15, 0x00, 0x00, 0xff,
	0xff, 0x6e, 0xf0, 0x3f, 0x47, 0xf0, 0x02, 0x00, 0x00,
}
