// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/protobuf/descriptor.proto

package descriptor_proto

import (
	protoapi "github.com/golang/protobuf/protoapi"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	prototype "github.com/golang/protobuf/v2/reflect/prototype"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
)

type FieldDescriptorProto_Type int32

const (
	// 0 is reserved for errors.
	// Order is weird for historical reasons.
	FieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1
	FieldDescriptorProto_TYPE_FLOAT  FieldDescriptorProto_Type = 2
	// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
	// negative values are likely.
	FieldDescriptorProto_TYPE_INT64  FieldDescriptorProto_Type = 3
	FieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4
	// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
	// negative values are likely.
	FieldDescriptorProto_TYPE_INT32   FieldDescriptorProto_Type = 5
	FieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6
	FieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7
	FieldDescriptorProto_TYPE_BOOL    FieldDescriptorProto_Type = 8
	FieldDescriptorProto_TYPE_STRING  FieldDescriptorProto_Type = 9
	// Tag-delimited aggregate.
	// Group type is deprecated and not supported in proto3. However, Proto3
	// implementations should still be able to parse the group wire format and
	// treat group fields as unknown fields.
	FieldDescriptorProto_TYPE_GROUP   FieldDescriptorProto_Type = 10
	FieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11
	// New in version 2.
	FieldDescriptorProto_TYPE_BYTES    FieldDescriptorProto_Type = 12
	FieldDescriptorProto_TYPE_UINT32   FieldDescriptorProto_Type = 13
	FieldDescriptorProto_TYPE_ENUM     FieldDescriptorProto_Type = 14
	FieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15
	FieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16
	FieldDescriptorProto_TYPE_SINT32   FieldDescriptorProto_Type = 17
	FieldDescriptorProto_TYPE_SINT64   FieldDescriptorProto_Type = 18
)

func (e FieldDescriptorProto_Type) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[0]
}
func (e FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldDescriptorProto_Type_name = map[int32]string{
	1:  "TYPE_DOUBLE",
	2:  "TYPE_FLOAT",
	3:  "TYPE_INT64",
	4:  "TYPE_UINT64",
	5:  "TYPE_INT32",
	6:  "TYPE_FIXED64",
	7:  "TYPE_FIXED32",
	8:  "TYPE_BOOL",
	9:  "TYPE_STRING",
	10: "TYPE_GROUP",
	11: "TYPE_MESSAGE",
	12: "TYPE_BYTES",
	13: "TYPE_UINT32",
	14: "TYPE_ENUM",
	15: "TYPE_SFIXED32",
	16: "TYPE_SFIXED64",
	17: "TYPE_SINT32",
	18: "TYPE_SINT64",
}

var FieldDescriptorProto_Type_value = map[string]int32{
	"TYPE_DOUBLE":   1,
	"TYPE_FLOAT":    2,
	"TYPE_INT64":    3,
	"TYPE_UINT64":   4,
	"TYPE_INT32":    5,
	"TYPE_FIXED64":  6,
	"TYPE_FIXED32":  7,
	"TYPE_BOOL":     8,
	"TYPE_STRING":   9,
	"TYPE_GROUP":    10,
	"TYPE_MESSAGE":  11,
	"TYPE_BYTES":    12,
	"TYPE_UINT32":   13,
	"TYPE_ENUM":     14,
	"TYPE_SFIXED32": 15,
	"TYPE_SFIXED64": 16,
	"TYPE_SINT32":   17,
	"TYPE_SINT64":   18,
}

func (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type {
	p := new(FieldDescriptorProto_Type)
	*p = x
	return p
}

func (x FieldDescriptorProto_Type) String() string {
	return protoapi.EnumName(FieldDescriptorProto_Type_name, int32(x))
}

func (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, "FieldDescriptorProto_Type")
	if err != nil {
		return err
	}
	*x = FieldDescriptorProto_Type(value)
	return nil
}

func (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4, 0}
}

type FieldDescriptorProto_Label int32

const (
	// 0 is reserved for errors
	FieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1
	FieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2
	FieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3
)

func (e FieldDescriptorProto_Label) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[1]
}
func (e FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldDescriptorProto_Label_name = map[int32]string{
	1: "LABEL_OPTIONAL",
	2: "LABEL_REQUIRED",
	3: "LABEL_REPEATED",
}

var FieldDescriptorProto_Label_value = map[string]int32{
	"LABEL_OPTIONAL": 1,
	"LABEL_REQUIRED": 2,
	"LABEL_REPEATED": 3,
}

func (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label {
	p := new(FieldDescriptorProto_Label)
	*p = x
	return p
}

func (x FieldDescriptorProto_Label) String() string {
	return protoapi.EnumName(FieldDescriptorProto_Label_name, int32(x))
}

func (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, "FieldDescriptorProto_Label")
	if err != nil {
		return err
	}
	*x = FieldDescriptorProto_Label(value)
	return nil
}

func (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4, 1}
}

// Generated classes can be optimized for speed or code size.
type FileOptions_OptimizeMode int32

const (
	FileOptions_SPEED FileOptions_OptimizeMode = 1
	// etc.
	FileOptions_CODE_SIZE    FileOptions_OptimizeMode = 2
	FileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3
)

func (e FileOptions_OptimizeMode) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[2]
}
func (e FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FileOptions_OptimizeMode_name = map[int32]string{
	1: "SPEED",
	2: "CODE_SIZE",
	3: "LITE_RUNTIME",
}

var FileOptions_OptimizeMode_value = map[string]int32{
	"SPEED":        1,
	"CODE_SIZE":    2,
	"LITE_RUNTIME": 3,
}

func (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode {
	p := new(FileOptions_OptimizeMode)
	*p = x
	return p
}

func (x FileOptions_OptimizeMode) String() string {
	return protoapi.EnumName(FileOptions_OptimizeMode_name, int32(x))
}

func (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, "FileOptions_OptimizeMode")
	if err != nil {
		return err
	}
	*x = FileOptions_OptimizeMode(value)
	return nil
}

func (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{10, 0}
}

type FieldOptions_CType int32

const (
	// Default mode.
	FieldOptions_STRING       FieldOptions_CType = 0
	FieldOptions_CORD         FieldOptions_CType = 1
	FieldOptions_STRING_PIECE FieldOptions_CType = 2
)

func (e FieldOptions_CType) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[3]
}
func (e FieldOptions_CType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldOptions_CType_name = map[int32]string{
	0: "STRING",
	1: "CORD",
	2: "STRING_PIECE",
}

var FieldOptions_CType_value = map[string]int32{
	"STRING":       0,
	"CORD":         1,
	"STRING_PIECE": 2,
}

func (x FieldOptions_CType) Enum() *FieldOptions_CType {
	p := new(FieldOptions_CType)
	*p = x
	return p
}

func (x FieldOptions_CType) String() string {
	return protoapi.EnumName(FieldOptions_CType_name, int32(x))
}

func (x *FieldOptions_CType) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldOptions_CType_value, data, "FieldOptions_CType")
	if err != nil {
		return err
	}
	*x = FieldOptions_CType(value)
	return nil
}

func (FieldOptions_CType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12, 0}
}

type FieldOptions_JSType int32

const (
	// Use the default type.
	FieldOptions_JS_NORMAL FieldOptions_JSType = 0
	// Use JavaScript strings.
	FieldOptions_JS_STRING FieldOptions_JSType = 1
	// Use JavaScript numbers.
	FieldOptions_JS_NUMBER FieldOptions_JSType = 2
)

func (e FieldOptions_JSType) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[4]
}
func (e FieldOptions_JSType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var FieldOptions_JSType_name = map[int32]string{
	0: "JS_NORMAL",
	1: "JS_STRING",
	2: "JS_NUMBER",
}

var FieldOptions_JSType_value = map[string]int32{
	"JS_NORMAL": 0,
	"JS_STRING": 1,
	"JS_NUMBER": 2,
}

func (x FieldOptions_JSType) Enum() *FieldOptions_JSType {
	p := new(FieldOptions_JSType)
	*p = x
	return p
}

func (x FieldOptions_JSType) String() string {
	return protoapi.EnumName(FieldOptions_JSType_name, int32(x))
}

func (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(FieldOptions_JSType_value, data, "FieldOptions_JSType")
	if err != nil {
		return err
	}
	*x = FieldOptions_JSType(value)
	return nil
}

func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12, 1}
}

// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
// or neither? HTTP based RPC implementation may choose GET verb for safe
// methods, and PUT verb for idempotent methods instead of the default POST.
type MethodOptions_IdempotencyLevel int32

const (
	MethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0
	MethodOptions_NO_SIDE_EFFECTS     MethodOptions_IdempotencyLevel = 1
	MethodOptions_IDEMPOTENT          MethodOptions_IdempotencyLevel = 2
)

func (e MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
	return xxx_Descriptor_ProtoFile_EnumTypes[5]
}
func (e MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(e)
}

var MethodOptions_IdempotencyLevel_name = map[int32]string{
	0: "IDEMPOTENCY_UNKNOWN",
	1: "NO_SIDE_EFFECTS",
	2: "IDEMPOTENT",
}

var MethodOptions_IdempotencyLevel_value = map[string]int32{
	"IDEMPOTENCY_UNKNOWN": 0,
	"NO_SIDE_EFFECTS":     1,
	"IDEMPOTENT":          2,
}

func (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel {
	p := new(MethodOptions_IdempotencyLevel)
	*p = x
	return p
}

func (x MethodOptions_IdempotencyLevel) String() string {
	return protoapi.EnumName(MethodOptions_IdempotencyLevel_name, int32(x))
}

func (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error {
	value, err := protoapi.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, "MethodOptions_IdempotencyLevel")
	if err != nil {
		return err
	}
	*x = MethodOptions_IdempotencyLevel(value)
	return nil
}

func (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{17, 0}
}

// The protocol compiler can output a FileDescriptorSet containing the .proto
// files it parses.
type FileDescriptorSet struct {
	File                 []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

type xxx_FileDescriptorSet struct{ m *FileDescriptorSet }

func (m *FileDescriptorSet) ProtoReflect() protoreflect.Message {
	return xxx_FileDescriptorSet{m}
}
func (m xxx_FileDescriptorSet) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].Type
}
func (m xxx_FileDescriptorSet) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].KnownFieldsOf(m.m)
}
func (m xxx_FileDescriptorSet) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[0].UnknownFieldsOf(m.m)
}
func (m xxx_FileDescriptorSet) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *FileDescriptorSet) Reset()         { *m = FileDescriptorSet{} }
func (m *FileDescriptorSet) String() string { return protoapi.CompactTextString(m) }
func (*FileDescriptorSet) ProtoMessage()    {}
func (*FileDescriptorSet) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{0}
}

func (m *FileDescriptorSet) GetFile() []*FileDescriptorProto {
	if m != nil {
		return m.File
	}
	return nil
}

// Describes a complete .proto file.
type FileDescriptorProto struct {
	Name    *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"`
	// Names of files imported by this file.
	Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"`
	// Indexes of the public imported files in the dependency list above.
	PublicDependency []int32 `protobuf:"varint,10,rep,name=public_dependency,json=publicDependency" json:"public_dependency,omitempty"`
	// Indexes of the weak imported files in the dependency list.
	// For Google-internal migration only. Do not use.
	WeakDependency []int32 `protobuf:"varint,11,rep,name=weak_dependency,json=weakDependency" json:"weak_dependency,omitempty"`
	// All top-level definitions in this file.
	MessageType []*DescriptorProto        `protobuf:"bytes,4,rep,name=message_type,json=messageType" json:"message_type,omitempty"`
	EnumType    []*EnumDescriptorProto    `protobuf:"bytes,5,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"`
	Service     []*ServiceDescriptorProto `protobuf:"bytes,6,rep,name=service" json:"service,omitempty"`
	Extension   []*FieldDescriptorProto   `protobuf:"bytes,7,rep,name=extension" json:"extension,omitempty"`
	Options     *FileOptions              `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"`
	// This field contains optional information about the original source code.
	// You may safely remove this entire field without harming runtime
	// functionality of the descriptors -- the information is needed only by
	// development tools.
	SourceCodeInfo *SourceCodeInfo `protobuf:"bytes,9,opt,name=source_code_info,json=sourceCodeInfo" json:"source_code_info,omitempty"`
	// The syntax of the proto file.
	// The supported values are "proto2" and "proto3".
	Syntax               *string  `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_FileDescriptorProto struct{ m *FileDescriptorProto }

func (m *FileDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_FileDescriptorProto{m}
}
func (m xxx_FileDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].Type
}
func (m xxx_FileDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].KnownFieldsOf(m.m)
}
func (m xxx_FileDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[1].UnknownFieldsOf(m.m)
}
func (m xxx_FileDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *FileDescriptorProto) Reset()         { *m = FileDescriptorProto{} }
func (m *FileDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*FileDescriptorProto) ProtoMessage()    {}
func (*FileDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{1}
}

func (m *FileDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *FileDescriptorProto) GetPackage() string {
	if m != nil && m.Package != nil {
		return *m.Package
	}
	return ""
}

func (m *FileDescriptorProto) GetDependency() []string {
	if m != nil {
		return m.Dependency
	}
	return nil
}

func (m *FileDescriptorProto) GetPublicDependency() []int32 {
	if m != nil {
		return m.PublicDependency
	}
	return nil
}

func (m *FileDescriptorProto) GetWeakDependency() []int32 {
	if m != nil {
		return m.WeakDependency
	}
	return nil
}

func (m *FileDescriptorProto) GetMessageType() []*DescriptorProto {
	if m != nil {
		return m.MessageType
	}
	return nil
}

func (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto {
	if m != nil {
		return m.EnumType
	}
	return nil
}

func (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto {
	if m != nil {
		return m.Service
	}
	return nil
}

func (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto {
	if m != nil {
		return m.Extension
	}
	return nil
}

func (m *FileDescriptorProto) GetOptions() *FileOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo {
	if m != nil {
		return m.SourceCodeInfo
	}
	return nil
}

func (m *FileDescriptorProto) GetSyntax() string {
	if m != nil && m.Syntax != nil {
		return *m.Syntax
	}
	return ""
}

// Describes a message type.
type DescriptorProto struct {
	Name           *string                           `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Field          []*FieldDescriptorProto           `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"`
	Extension      []*FieldDescriptorProto           `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"`
	NestedType     []*DescriptorProto                `protobuf:"bytes,3,rep,name=nested_type,json=nestedType" json:"nested_type,omitempty"`
	EnumType       []*EnumDescriptorProto            `protobuf:"bytes,4,rep,name=enum_type,json=enumType" json:"enum_type,omitempty"`
	ExtensionRange []*DescriptorProto_ExtensionRange `protobuf:"bytes,5,rep,name=extension_range,json=extensionRange" json:"extension_range,omitempty"`
	OneofDecl      []*OneofDescriptorProto           `protobuf:"bytes,8,rep,name=oneof_decl,json=oneofDecl" json:"oneof_decl,omitempty"`
	Options        *MessageOptions                   `protobuf:"bytes,7,opt,name=options" json:"options,omitempty"`
	ReservedRange  []*DescriptorProto_ReservedRange  `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"`
	// Reserved field names, which may not be used by fields in the same message.
	// A given name may only be reserved once.
	ReservedName         []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_DescriptorProto struct{ m *DescriptorProto }

func (m *DescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto{m}
}
func (m xxx_DescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].Type
}
func (m xxx_DescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[2].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *DescriptorProto) Reset()         { *m = DescriptorProto{} }
func (m *DescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto) ProtoMessage()    {}
func (*DescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2}
}

func (m *DescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *DescriptorProto) GetField() []*FieldDescriptorProto {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *DescriptorProto) GetExtension() []*FieldDescriptorProto {
	if m != nil {
		return m.Extension
	}
	return nil
}

func (m *DescriptorProto) GetNestedType() []*DescriptorProto {
	if m != nil {
		return m.NestedType
	}
	return nil
}

func (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto {
	if m != nil {
		return m.EnumType
	}
	return nil
}

func (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange {
	if m != nil {
		return m.ExtensionRange
	}
	return nil
}

func (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto {
	if m != nil {
		return m.OneofDecl
	}
	return nil
}

func (m *DescriptorProto) GetOptions() *MessageOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange {
	if m != nil {
		return m.ReservedRange
	}
	return nil
}

func (m *DescriptorProto) GetReservedName() []string {
	if m != nil {
		return m.ReservedName
	}
	return nil
}

type ExtensionRangeOptions struct {
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_ExtensionRangeOptions struct{ m *ExtensionRangeOptions }

func (m *ExtensionRangeOptions) ProtoReflect() protoreflect.Message {
	return xxx_ExtensionRangeOptions{m}
}
func (m xxx_ExtensionRangeOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].Type
}
func (m xxx_ExtensionRangeOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].KnownFieldsOf(m.m)
}
func (m xxx_ExtensionRangeOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[3].UnknownFieldsOf(m.m)
}
func (m xxx_ExtensionRangeOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *ExtensionRangeOptions) Reset()         { *m = ExtensionRangeOptions{} }
func (m *ExtensionRangeOptions) String() string { return protoapi.CompactTextString(m) }
func (*ExtensionRangeOptions) ProtoMessage()    {}
func (*ExtensionRangeOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{3}
}

var extRange_ExtensionRangeOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*ExtensionRangeOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_ExtensionRangeOptions
}

func (m *ExtensionRangeOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

// Describes a field within a message.
type FieldDescriptorProto struct {
	Name   *string                     `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Number *int32                      `protobuf:"varint,3,opt,name=number" json:"number,omitempty"`
	Label  *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"`
	// If type_name is set, this need not be set.  If both this and type_name
	// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
	Type *FieldDescriptorProto_Type `protobuf:"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type" json:"type,omitempty"`
	// For message and enum types, this is the name of the type.  If the name
	// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
	// rules are used to find the type (i.e. first the nested types within this
	// message are searched, then within the parent, on up to the root
	// namespace).
	TypeName *string `protobuf:"bytes,6,opt,name=type_name,json=typeName" json:"type_name,omitempty"`
	// For extensions, this is the name of the type being extended.  It is
	// resolved in the same manner as type_name.
	Extendee *string `protobuf:"bytes,2,opt,name=extendee" json:"extendee,omitempty"`
	// For numeric types, contains the original text representation of the value.
	// For booleans, "true" or "false".
	// For strings, contains the default text contents (not escaped in any way).
	// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
	// TODO(kenton):  Base-64 encode?
	DefaultValue *string `protobuf:"bytes,7,opt,name=default_value,json=defaultValue" json:"default_value,omitempty"`
	// If set, gives the index of a oneof in the containing type's oneof_decl
	// list.  This field is a member of that oneof.
	OneofIndex *int32 `protobuf:"varint,9,opt,name=oneof_index,json=oneofIndex" json:"oneof_index,omitempty"`
	// JSON name of this field. The value is set by protocol compiler. If the
	// user has set a "json_name" option on this field, that option's value
	// will be used. Otherwise, it's deduced from the field's name by converting
	// it to camelCase.
	JsonName             *string       `protobuf:"bytes,10,opt,name=json_name,json=jsonName" json:"json_name,omitempty"`
	Options              *FieldOptions `protobuf:"bytes,8,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

type xxx_FieldDescriptorProto struct{ m *FieldDescriptorProto }

func (m *FieldDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_FieldDescriptorProto{m}
}
func (m xxx_FieldDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].Type
}
func (m xxx_FieldDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].KnownFieldsOf(m.m)
}
func (m xxx_FieldDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[4].UnknownFieldsOf(m.m)
}
func (m xxx_FieldDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *FieldDescriptorProto) Reset()         { *m = FieldDescriptorProto{} }
func (m *FieldDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*FieldDescriptorProto) ProtoMessage()    {}
func (*FieldDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{4}
}

func (m *FieldDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *FieldDescriptorProto) GetNumber() int32 {
	if m != nil && m.Number != nil {
		return *m.Number
	}
	return 0
}

func (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label {
	if m != nil && m.Label != nil {
		return *m.Label
	}
	return FieldDescriptorProto_LABEL_OPTIONAL
}

func (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type {
	if m != nil && m.Type != nil {
		return *m.Type
	}
	return FieldDescriptorProto_TYPE_DOUBLE
}

func (m *FieldDescriptorProto) GetTypeName() string {
	if m != nil && m.TypeName != nil {
		return *m.TypeName
	}
	return ""
}

func (m *FieldDescriptorProto) GetExtendee() string {
	if m != nil && m.Extendee != nil {
		return *m.Extendee
	}
	return ""
}

func (m *FieldDescriptorProto) GetDefaultValue() string {
	if m != nil && m.DefaultValue != nil {
		return *m.DefaultValue
	}
	return ""
}

func (m *FieldDescriptorProto) GetOneofIndex() int32 {
	if m != nil && m.OneofIndex != nil {
		return *m.OneofIndex
	}
	return 0
}

func (m *FieldDescriptorProto) GetJsonName() string {
	if m != nil && m.JsonName != nil {
		return *m.JsonName
	}
	return ""
}

func (m *FieldDescriptorProto) GetOptions() *FieldOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a oneof.
type OneofDescriptorProto struct {
	Name                 *string       `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Options              *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

type xxx_OneofDescriptorProto struct{ m *OneofDescriptorProto }

func (m *OneofDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_OneofDescriptorProto{m}
}
func (m xxx_OneofDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].Type
}
func (m xxx_OneofDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].KnownFieldsOf(m.m)
}
func (m xxx_OneofDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[5].UnknownFieldsOf(m.m)
}
func (m xxx_OneofDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *OneofDescriptorProto) Reset()         { *m = OneofDescriptorProto{} }
func (m *OneofDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*OneofDescriptorProto) ProtoMessage()    {}
func (*OneofDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{5}
}

func (m *OneofDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *OneofDescriptorProto) GetOptions() *OneofOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes an enum type.
type EnumDescriptorProto struct {
	Name    *string                     `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Value   []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"`
	Options *EnumOptions                `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	// Range of reserved numeric values. Reserved numeric values may not be used
	// by enum values in the same enum declaration. Reserved ranges may not
	// overlap.
	ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"`
	// Reserved enum value names, which may not be reused. A given name may only
	// be reserved once.
	ReservedName         []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_EnumDescriptorProto struct{ m *EnumDescriptorProto }

func (m *EnumDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_EnumDescriptorProto{m}
}
func (m xxx_EnumDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].Type
}
func (m xxx_EnumDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].KnownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[6].UnknownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *EnumDescriptorProto) Reset()         { *m = EnumDescriptorProto{} }
func (m *EnumDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*EnumDescriptorProto) ProtoMessage()    {}
func (*EnumDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{6}
}

func (m *EnumDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *EnumDescriptorProto) GetOptions() *EnumOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *EnumDescriptorProto) GetReservedRange() []*EnumDescriptorProto_EnumReservedRange {
	if m != nil {
		return m.ReservedRange
	}
	return nil
}

func (m *EnumDescriptorProto) GetReservedName() []string {
	if m != nil {
		return m.ReservedName
	}
	return nil
}

// Describes a value within an enum.
type EnumValueDescriptorProto struct {
	Name                 *string           `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Number               *int32            `protobuf:"varint,2,opt,name=number" json:"number,omitempty"`
	Options              *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

type xxx_EnumValueDescriptorProto struct{ m *EnumValueDescriptorProto }

func (m *EnumValueDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_EnumValueDescriptorProto{m}
}
func (m xxx_EnumValueDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].Type
}
func (m xxx_EnumValueDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].KnownFieldsOf(m.m)
}
func (m xxx_EnumValueDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[7].UnknownFieldsOf(m.m)
}
func (m xxx_EnumValueDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *EnumValueDescriptorProto) Reset()         { *m = EnumValueDescriptorProto{} }
func (m *EnumValueDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*EnumValueDescriptorProto) ProtoMessage()    {}
func (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{7}
}

func (m *EnumValueDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *EnumValueDescriptorProto) GetNumber() int32 {
	if m != nil && m.Number != nil {
		return *m.Number
	}
	return 0
}

func (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a service.
type ServiceDescriptorProto struct {
	Name                 *string                  `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Method               []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"`
	Options              *ServiceOptions          `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

type xxx_ServiceDescriptorProto struct{ m *ServiceDescriptorProto }

func (m *ServiceDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_ServiceDescriptorProto{m}
}
func (m xxx_ServiceDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].Type
}
func (m xxx_ServiceDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].KnownFieldsOf(m.m)
}
func (m xxx_ServiceDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[8].UnknownFieldsOf(m.m)
}
func (m xxx_ServiceDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *ServiceDescriptorProto) Reset()         { *m = ServiceDescriptorProto{} }
func (m *ServiceDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*ServiceDescriptorProto) ProtoMessage()    {}
func (*ServiceDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{8}
}

func (m *ServiceDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto {
	if m != nil {
		return m.Method
	}
	return nil
}

func (m *ServiceDescriptorProto) GetOptions() *ServiceOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Describes a method of a service.
type MethodDescriptorProto struct {
	Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	// Input and output type names.  These are resolved in the same way as
	// FieldDescriptorProto.type_name, but must refer to a message type.
	InputType  *string        `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"`
	OutputType *string        `protobuf:"bytes,3,opt,name=output_type,json=outputType" json:"output_type,omitempty"`
	Options    *MethodOptions `protobuf:"bytes,4,opt,name=options" json:"options,omitempty"`
	// Identifies if client streams multiple client messages
	ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"`
	// Identifies if server streams multiple server messages
	ServerStreaming      *bool    `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_MethodDescriptorProto struct{ m *MethodDescriptorProto }

func (m *MethodDescriptorProto) ProtoReflect() protoreflect.Message {
	return xxx_MethodDescriptorProto{m}
}
func (m xxx_MethodDescriptorProto) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].Type
}
func (m xxx_MethodDescriptorProto) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].KnownFieldsOf(m.m)
}
func (m xxx_MethodDescriptorProto) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[9].UnknownFieldsOf(m.m)
}
func (m xxx_MethodDescriptorProto) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *MethodDescriptorProto) Reset()         { *m = MethodDescriptorProto{} }
func (m *MethodDescriptorProto) String() string { return protoapi.CompactTextString(m) }
func (*MethodDescriptorProto) ProtoMessage()    {}
func (*MethodDescriptorProto) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{9}
}

const Default_MethodDescriptorProto_ClientStreaming bool = false
const Default_MethodDescriptorProto_ServerStreaming bool = false

func (m *MethodDescriptorProto) GetName() string {
	if m != nil && m.Name != nil {
		return *m.Name
	}
	return ""
}

func (m *MethodDescriptorProto) GetInputType() string {
	if m != nil && m.InputType != nil {
		return *m.InputType
	}
	return ""
}

func (m *MethodDescriptorProto) GetOutputType() string {
	if m != nil && m.OutputType != nil {
		return *m.OutputType
	}
	return ""
}

func (m *MethodDescriptorProto) GetOptions() *MethodOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

func (m *MethodDescriptorProto) GetClientStreaming() bool {
	if m != nil && m.ClientStreaming != nil {
		return *m.ClientStreaming
	}
	return Default_MethodDescriptorProto_ClientStreaming
}

func (m *MethodDescriptorProto) GetServerStreaming() bool {
	if m != nil && m.ServerStreaming != nil {
		return *m.ServerStreaming
	}
	return Default_MethodDescriptorProto_ServerStreaming
}

type FileOptions struct {
	// Sets the Java package where classes generated from this .proto will be
	// placed.  By default, the proto package is used, but this is often
	// inappropriate because proto packages do not normally start with backwards
	// domain names.
	JavaPackage *string `protobuf:"bytes,1,opt,name=java_package,json=javaPackage" json:"java_package,omitempty"`
	// If set, all the classes from the .proto file are wrapped in a single
	// outer class with the given name.  This applies to both Proto1
	// (equivalent to the old "--one_java_file" option) and Proto2 (where
	// a .proto always translates to a single class, but you may want to
	// explicitly choose the class name).
	JavaOuterClassname *string `protobuf:"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname" json:"java_outer_classname,omitempty"`
	// If set true, then the Java code generator will generate a separate .java
	// file for each top-level message, enum, and service defined in the .proto
	// file.  Thus, these types will *not* be nested inside the outer class
	// named by java_outer_classname.  However, the outer class will still be
	// generated to contain the file's getDescriptor() method as well as any
	// top-level extensions defined in the file.
	JavaMultipleFiles *bool `protobuf:"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0" json:"java_multiple_files,omitempty"`
	// This option does nothing.
	JavaGenerateEqualsAndHash *bool `protobuf:"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash" json:"java_generate_equals_and_hash,omitempty"` // Deprecated: Do not use.
	// If set true, then the Java2 code generator will generate code that
	// throws an exception whenever an attempt is made to assign a non-UTF-8
	// byte sequence to a string field.
	// Message reflection will do the same.
	// However, an extension field still accepts non-UTF-8 byte sequences.
	// This option has no effect on when used with the lite runtime.
	JavaStringCheckUtf8 *bool                     `protobuf:"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0" json:"java_string_check_utf8,omitempty"`
	OptimizeFor         *FileOptions_OptimizeMode `protobuf:"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1" json:"optimize_for,omitempty"`
	// Sets the Go package where structs generated from this .proto will be
	// placed. If omitted, the Go package will be derived from the following:
	//   - The basename of the package import path, if provided.
	//   - Otherwise, the package statement in the .proto file, if present.
	//   - Otherwise, the basename of the .proto file, without extension.
	GoPackage *string `protobuf:"bytes,11,opt,name=go_package,json=goPackage" json:"go_package,omitempty"`
	// Should generic services be generated in each language?  "Generic" services
	// are not specific to any particular RPC system.  They are generated by the
	// main code generators in each language (without additional plugins).
	// Generic services were the only kind of service generation supported by
	// early versions of google.protobuf.
	//
	// Generic services are now considered deprecated in favor of using plugins
	// that generate code specific to your particular RPC system.  Therefore,
	// these default to false.  Old code which depends on generic services should
	// explicitly set them to true.
	CcGenericServices   *bool `protobuf:"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0" json:"cc_generic_services,omitempty"`
	JavaGenericServices *bool `protobuf:"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0" json:"java_generic_services,omitempty"`
	PyGenericServices   *bool `protobuf:"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0" json:"py_generic_services,omitempty"`
	PhpGenericServices  *bool `protobuf:"varint,42,opt,name=php_generic_services,json=phpGenericServices,def=0" json:"php_generic_services,omitempty"`
	// Is this file deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for everything in the file, or it will be completely ignored; in the very
	// least, this is a formalization for deprecating files.
	Deprecated *bool `protobuf:"varint,23,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// Enables the use of arenas for the proto messages in this file. This applies
	// only to generated classes for C++.
	CcEnableArenas *bool `protobuf:"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0" json:"cc_enable_arenas,omitempty"`
	// Sets the objective c class prefix which is prepended to all objective c
	// generated classes from this .proto. There is no default.
	ObjcClassPrefix *string `protobuf:"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix" json:"objc_class_prefix,omitempty"`
	// Namespace for generated classes; defaults to the package.
	CsharpNamespace *string `protobuf:"bytes,37,opt,name=csharp_namespace,json=csharpNamespace" json:"csharp_namespace,omitempty"`
	// By default Swift generators will take the proto package and CamelCase it
	// replacing '.' with underscore and use that to prefix the types/symbols
	// defined. When this options is provided, they will use this value instead
	// to prefix the types/symbols defined.
	SwiftPrefix *string `protobuf:"bytes,39,opt,name=swift_prefix,json=swiftPrefix" json:"swift_prefix,omitempty"`
	// Sets the php class prefix which is prepended to all php generated classes
	// from this .proto. Default is empty.
	PhpClassPrefix *string `protobuf:"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix" json:"php_class_prefix,omitempty"`
	// Use this option to change the namespace of php generated classes. Default
	// is empty. When this option is empty, the package name will be used for
	// determining the namespace.
	PhpNamespace *string `protobuf:"bytes,41,opt,name=php_namespace,json=phpNamespace" json:"php_namespace,omitempty"`
	// Use this option to change the namespace of php generated metadata classes.
	// Default is empty. When this option is empty, the proto file name will be used
	// for determining the namespace.
	PhpMetadataNamespace *string `protobuf:"bytes,44,opt,name=php_metadata_namespace,json=phpMetadataNamespace" json:"php_metadata_namespace,omitempty"`
	// Use this option to change the package of ruby generated classes. Default
	// is empty. When this option is not set, the package name will be used for
	// determining the ruby package.
	RubyPackage *string `protobuf:"bytes,45,opt,name=ruby_package,json=rubyPackage" json:"ruby_package,omitempty"`
	// The parser stores options it doesn't recognize here.
	// See the documentation for the "Options" section above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_FileOptions struct{ m *FileOptions }

func (m *FileOptions) ProtoReflect() protoreflect.Message {
	return xxx_FileOptions{m}
}
func (m xxx_FileOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].Type
}
func (m xxx_FileOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].KnownFieldsOf(m.m)
}
func (m xxx_FileOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[10].UnknownFieldsOf(m.m)
}
func (m xxx_FileOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *FileOptions) Reset()         { *m = FileOptions{} }
func (m *FileOptions) String() string { return protoapi.CompactTextString(m) }
func (*FileOptions) ProtoMessage()    {}
func (*FileOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{10}
}

var extRange_FileOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*FileOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_FileOptions
}

const Default_FileOptions_JavaMultipleFiles bool = false
const Default_FileOptions_JavaStringCheckUtf8 bool = false
const Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED
const Default_FileOptions_CcGenericServices bool = false
const Default_FileOptions_JavaGenericServices bool = false
const Default_FileOptions_PyGenericServices bool = false
const Default_FileOptions_PhpGenericServices bool = false
const Default_FileOptions_Deprecated bool = false
const Default_FileOptions_CcEnableArenas bool = false

func (m *FileOptions) GetJavaPackage() string {
	if m != nil && m.JavaPackage != nil {
		return *m.JavaPackage
	}
	return ""
}

func (m *FileOptions) GetJavaOuterClassname() string {
	if m != nil && m.JavaOuterClassname != nil {
		return *m.JavaOuterClassname
	}
	return ""
}

func (m *FileOptions) GetJavaMultipleFiles() bool {
	if m != nil && m.JavaMultipleFiles != nil {
		return *m.JavaMultipleFiles
	}
	return Default_FileOptions_JavaMultipleFiles
}

// Deprecated: Do not use.
func (m *FileOptions) GetJavaGenerateEqualsAndHash() bool {
	if m != nil && m.JavaGenerateEqualsAndHash != nil {
		return *m.JavaGenerateEqualsAndHash
	}
	return false
}

func (m *FileOptions) GetJavaStringCheckUtf8() bool {
	if m != nil && m.JavaStringCheckUtf8 != nil {
		return *m.JavaStringCheckUtf8
	}
	return Default_FileOptions_JavaStringCheckUtf8
}

func (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode {
	if m != nil && m.OptimizeFor != nil {
		return *m.OptimizeFor
	}
	return Default_FileOptions_OptimizeFor
}

func (m *FileOptions) GetGoPackage() string {
	if m != nil && m.GoPackage != nil {
		return *m.GoPackage
	}
	return ""
}

func (m *FileOptions) GetCcGenericServices() bool {
	if m != nil && m.CcGenericServices != nil {
		return *m.CcGenericServices
	}
	return Default_FileOptions_CcGenericServices
}

func (m *FileOptions) GetJavaGenericServices() bool {
	if m != nil && m.JavaGenericServices != nil {
		return *m.JavaGenericServices
	}
	return Default_FileOptions_JavaGenericServices
}

func (m *FileOptions) GetPyGenericServices() bool {
	if m != nil && m.PyGenericServices != nil {
		return *m.PyGenericServices
	}
	return Default_FileOptions_PyGenericServices
}

func (m *FileOptions) GetPhpGenericServices() bool {
	if m != nil && m.PhpGenericServices != nil {
		return *m.PhpGenericServices
	}
	return Default_FileOptions_PhpGenericServices
}

func (m *FileOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_FileOptions_Deprecated
}

func (m *FileOptions) GetCcEnableArenas() bool {
	if m != nil && m.CcEnableArenas != nil {
		return *m.CcEnableArenas
	}
	return Default_FileOptions_CcEnableArenas
}

func (m *FileOptions) GetObjcClassPrefix() string {
	if m != nil && m.ObjcClassPrefix != nil {
		return *m.ObjcClassPrefix
	}
	return ""
}

func (m *FileOptions) GetCsharpNamespace() string {
	if m != nil && m.CsharpNamespace != nil {
		return *m.CsharpNamespace
	}
	return ""
}

func (m *FileOptions) GetSwiftPrefix() string {
	if m != nil && m.SwiftPrefix != nil {
		return *m.SwiftPrefix
	}
	return ""
}

func (m *FileOptions) GetPhpClassPrefix() string {
	if m != nil && m.PhpClassPrefix != nil {
		return *m.PhpClassPrefix
	}
	return ""
}

func (m *FileOptions) GetPhpNamespace() string {
	if m != nil && m.PhpNamespace != nil {
		return *m.PhpNamespace
	}
	return ""
}

func (m *FileOptions) GetPhpMetadataNamespace() string {
	if m != nil && m.PhpMetadataNamespace != nil {
		return *m.PhpMetadataNamespace
	}
	return ""
}

func (m *FileOptions) GetRubyPackage() string {
	if m != nil && m.RubyPackage != nil {
		return *m.RubyPackage
	}
	return ""
}

func (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type MessageOptions struct {
	// Set true to use the old proto1 MessageSet wire format for extensions.
	// This is provided for backwards-compatibility with the MessageSet wire
	// format.  You should not use this for any other reason:  It's less
	// efficient, has fewer features, and is more complicated.
	//
	// The message must be defined exactly as follows:
	//   message Foo {
	//     option message_set_wire_format = true;
	//     extensions 4 to max;
	//   }
	// Note that the message cannot have any defined fields; MessageSets only
	// have extensions.
	//
	// All extensions of your type must be singular messages; e.g. they cannot
	// be int32s, enums, or repeated messages.
	//
	// Because this is an option, the above two restrictions are not enforced by
	// the protocol compiler.
	MessageSetWireFormat *bool `protobuf:"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0" json:"message_set_wire_format,omitempty"`
	// Disables the generation of the standard "descriptor()" accessor, which can
	// conflict with a field of the same name.  This is meant to make migration
	// from proto1 easier; new code should avoid fields named "descriptor".
	NoStandardDescriptorAccessor *bool `protobuf:"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0" json:"no_standard_descriptor_accessor,omitempty"`
	// Is this message deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the message, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating messages.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// Whether the message is an automatically generated map entry type for the
	// maps field.
	//
	// For maps fields:
	//     map<KeyType, ValueType> map_field = 1;
	// The parsed descriptor looks like:
	//     message MapFieldEntry {
	//         option map_entry = true;
	//         optional KeyType key = 1;
	//         optional ValueType value = 2;
	//     }
	//     repeated MapFieldEntry map_field = 1;
	//
	// Implementations may choose not to generate the map_entry=true message, but
	// use a native map in the target language to hold the keys and values.
	// The reflection APIs in such implementions still need to work as
	// if the field is a repeated message field.
	//
	// NOTE: Do not set the option in .proto files. Always use the maps syntax
	// instead. The option should only be implicitly set by the proto compiler
	// parser.
	MapEntry *bool `protobuf:"varint,7,opt,name=map_entry,json=mapEntry" json:"map_entry,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_MessageOptions struct{ m *MessageOptions }

func (m *MessageOptions) ProtoReflect() protoreflect.Message {
	return xxx_MessageOptions{m}
}
func (m xxx_MessageOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].Type
}
func (m xxx_MessageOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].KnownFieldsOf(m.m)
}
func (m xxx_MessageOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[11].UnknownFieldsOf(m.m)
}
func (m xxx_MessageOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *MessageOptions) Reset()         { *m = MessageOptions{} }
func (m *MessageOptions) String() string { return protoapi.CompactTextString(m) }
func (*MessageOptions) ProtoMessage()    {}
func (*MessageOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{11}
}

var extRange_MessageOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*MessageOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_MessageOptions
}

const Default_MessageOptions_MessageSetWireFormat bool = false
const Default_MessageOptions_NoStandardDescriptorAccessor bool = false
const Default_MessageOptions_Deprecated bool = false

func (m *MessageOptions) GetMessageSetWireFormat() bool {
	if m != nil && m.MessageSetWireFormat != nil {
		return *m.MessageSetWireFormat
	}
	return Default_MessageOptions_MessageSetWireFormat
}

func (m *MessageOptions) GetNoStandardDescriptorAccessor() bool {
	if m != nil && m.NoStandardDescriptorAccessor != nil {
		return *m.NoStandardDescriptorAccessor
	}
	return Default_MessageOptions_NoStandardDescriptorAccessor
}

func (m *MessageOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_MessageOptions_Deprecated
}

func (m *MessageOptions) GetMapEntry() bool {
	if m != nil && m.MapEntry != nil {
		return *m.MapEntry
	}
	return false
}

func (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type FieldOptions struct {
	// The ctype option instructs the C++ code generator to use a different
	// representation of the field than it normally would.  See the specific
	// options below.  This option is not yet implemented in the open source
	// release -- sorry, we'll try to include it in a future version!
	Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"`
	// The packed option can be enabled for repeated primitive fields to enable
	// a more efficient representation on the wire. Rather than repeatedly
	// writing the tag and type for each element, the entire array is encoded as
	// a single length-delimited blob. In proto3, only explicit setting it to
	// false will avoid using packed encoding.
	Packed *bool `protobuf:"varint,2,opt,name=packed" json:"packed,omitempty"`
	// The jstype option determines the JavaScript type used for values of the
	// field.  The option is permitted only for 64 bit integral and fixed types
	// (int64, uint64, sint64, fixed64, sfixed64).  A field with jstype JS_STRING
	// is represented as JavaScript string, which avoids loss of precision that
	// can happen when a large value is converted to a floating point JavaScript.
	// Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
	// use the JavaScript "number" type.  The behavior of the default option
	// JS_NORMAL is implementation dependent.
	//
	// This option is an enum to permit additional types to be added, e.g.
	// goog.math.Integer.
	Jstype *FieldOptions_JSType `protobuf:"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0" json:"jstype,omitempty"`
	// Should this field be parsed lazily?  Lazy applies only to message-type
	// fields.  It means that when the outer message is initially parsed, the
	// inner message's contents will not be parsed but instead stored in encoded
	// form.  The inner message will actually be parsed when it is first accessed.
	//
	// This is only a hint.  Implementations are free to choose whether to use
	// eager or lazy parsing regardless of the value of this option.  However,
	// setting this option true suggests that the protocol author believes that
	// using lazy parsing on this field is worth the additional bookkeeping
	// overhead typically needed to implement it.
	//
	// This option does not affect the public interface of any generated code;
	// all method signatures remain the same.  Furthermore, thread-safety of the
	// interface is not affected by this option; const methods remain safe to
	// call from multiple threads concurrently, while non-const methods continue
	// to require exclusive access.
	//
	//
	// Note that implementations may choose not to check required fields within
	// a lazy sub-message.  That is, calling IsInitialized() on the outer message
	// may return true even if the inner message has missing required fields.
	// This is necessary because otherwise the inner message would have to be
	// parsed in order to perform the check, defeating the purpose of lazy
	// parsing.  An implementation which chooses not to check required fields
	// must be consistent about it.  That is, for any particular sub-message, the
	// implementation must either *always* check its required fields, or *never*
	// check its required fields, regardless of whether or not the message has
	// been parsed.
	Lazy *bool `protobuf:"varint,5,opt,name=lazy,def=0" json:"lazy,omitempty"`
	// Is this field deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for accessors, or it will be completely ignored; in the very least, this
	// is a formalization for deprecating fields.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// For Google-internal migration only. Do not use.
	Weak *bool `protobuf:"varint,10,opt,name=weak,def=0" json:"weak,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_FieldOptions struct{ m *FieldOptions }

func (m *FieldOptions) ProtoReflect() protoreflect.Message {
	return xxx_FieldOptions{m}
}
func (m xxx_FieldOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].Type
}
func (m xxx_FieldOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].KnownFieldsOf(m.m)
}
func (m xxx_FieldOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[12].UnknownFieldsOf(m.m)
}
func (m xxx_FieldOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *FieldOptions) Reset()         { *m = FieldOptions{} }
func (m *FieldOptions) String() string { return protoapi.CompactTextString(m) }
func (*FieldOptions) ProtoMessage()    {}
func (*FieldOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{12}
}

var extRange_FieldOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*FieldOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_FieldOptions
}

const Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING
const Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL
const Default_FieldOptions_Lazy bool = false
const Default_FieldOptions_Deprecated bool = false
const Default_FieldOptions_Weak bool = false

func (m *FieldOptions) GetCtype() FieldOptions_CType {
	if m != nil && m.Ctype != nil {
		return *m.Ctype
	}
	return Default_FieldOptions_Ctype
}

func (m *FieldOptions) GetPacked() bool {
	if m != nil && m.Packed != nil {
		return *m.Packed
	}
	return false
}

func (m *FieldOptions) GetJstype() FieldOptions_JSType {
	if m != nil && m.Jstype != nil {
		return *m.Jstype
	}
	return Default_FieldOptions_Jstype
}

func (m *FieldOptions) GetLazy() bool {
	if m != nil && m.Lazy != nil {
		return *m.Lazy
	}
	return Default_FieldOptions_Lazy
}

func (m *FieldOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_FieldOptions_Deprecated
}

func (m *FieldOptions) GetWeak() bool {
	if m != nil && m.Weak != nil {
		return *m.Weak
	}
	return Default_FieldOptions_Weak
}

func (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type OneofOptions struct {
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_OneofOptions struct{ m *OneofOptions }

func (m *OneofOptions) ProtoReflect() protoreflect.Message {
	return xxx_OneofOptions{m}
}
func (m xxx_OneofOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].Type
}
func (m xxx_OneofOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].KnownFieldsOf(m.m)
}
func (m xxx_OneofOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[13].UnknownFieldsOf(m.m)
}
func (m xxx_OneofOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *OneofOptions) Reset()         { *m = OneofOptions{} }
func (m *OneofOptions) String() string { return protoapi.CompactTextString(m) }
func (*OneofOptions) ProtoMessage()    {}
func (*OneofOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{13}
}

var extRange_OneofOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*OneofOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_OneofOptions
}

func (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type EnumOptions struct {
	// Set this option to true to allow mapping different tag names to the same
	// value.
	AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"`
	// Is this enum deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the enum, or it will be completely ignored; in the very least, this
	// is a formalization for deprecating enums.
	Deprecated *bool `protobuf:"varint,3,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_EnumOptions struct{ m *EnumOptions }

func (m *EnumOptions) ProtoReflect() protoreflect.Message {
	return xxx_EnumOptions{m}
}
func (m xxx_EnumOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].Type
}
func (m xxx_EnumOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].KnownFieldsOf(m.m)
}
func (m xxx_EnumOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[14].UnknownFieldsOf(m.m)
}
func (m xxx_EnumOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *EnumOptions) Reset()         { *m = EnumOptions{} }
func (m *EnumOptions) String() string { return protoapi.CompactTextString(m) }
func (*EnumOptions) ProtoMessage()    {}
func (*EnumOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{14}
}

var extRange_EnumOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*EnumOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_EnumOptions
}

const Default_EnumOptions_Deprecated bool = false

func (m *EnumOptions) GetAllowAlias() bool {
	if m != nil && m.AllowAlias != nil {
		return *m.AllowAlias
	}
	return false
}

func (m *EnumOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_EnumOptions_Deprecated
}

func (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type EnumValueOptions struct {
	// Is this enum value deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the enum value, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating enum values.
	Deprecated *bool `protobuf:"varint,1,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_EnumValueOptions struct{ m *EnumValueOptions }

func (m *EnumValueOptions) ProtoReflect() protoreflect.Message {
	return xxx_EnumValueOptions{m}
}
func (m xxx_EnumValueOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].Type
}
func (m xxx_EnumValueOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].KnownFieldsOf(m.m)
}
func (m xxx_EnumValueOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[15].UnknownFieldsOf(m.m)
}
func (m xxx_EnumValueOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *EnumValueOptions) Reset()         { *m = EnumValueOptions{} }
func (m *EnumValueOptions) String() string { return protoapi.CompactTextString(m) }
func (*EnumValueOptions) ProtoMessage()    {}
func (*EnumValueOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{15}
}

var extRange_EnumValueOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*EnumValueOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_EnumValueOptions
}

const Default_EnumValueOptions_Deprecated bool = false

func (m *EnumValueOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_EnumValueOptions_Deprecated
}

func (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type ServiceOptions struct {
	// Is this service deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the service, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating services.
	Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_ServiceOptions struct{ m *ServiceOptions }

func (m *ServiceOptions) ProtoReflect() protoreflect.Message {
	return xxx_ServiceOptions{m}
}
func (m xxx_ServiceOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].Type
}
func (m xxx_ServiceOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].KnownFieldsOf(m.m)
}
func (m xxx_ServiceOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[16].UnknownFieldsOf(m.m)
}
func (m xxx_ServiceOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *ServiceOptions) Reset()         { *m = ServiceOptions{} }
func (m *ServiceOptions) String() string { return protoapi.CompactTextString(m) }
func (*ServiceOptions) ProtoMessage()    {}
func (*ServiceOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{16}
}

var extRange_ServiceOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*ServiceOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_ServiceOptions
}

const Default_ServiceOptions_Deprecated bool = false

func (m *ServiceOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_ServiceOptions_Deprecated
}

func (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

type MethodOptions struct {
	// Is this method deprecated?
	// Depending on the target platform, this can emit Deprecated annotations
	// for the method, or it will be completely ignored; in the very least,
	// this is a formalization for deprecating methods.
	Deprecated       *bool                           `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"`
	IdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0" json:"idempotency_level,omitempty"`
	// The parser stores options it doesn't recognize here. See above.
	UninterpretedOption             []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"`
	XXX_NoUnkeyedLiteral            struct{}               `json:"-"`
	protoapi.XXX_InternalExtensions `json:"-"`
	XXX_unrecognized                []byte `json:"-"`
	XXX_sizecache                   int32  `json:"-"`
}

type xxx_MethodOptions struct{ m *MethodOptions }

func (m *MethodOptions) ProtoReflect() protoreflect.Message {
	return xxx_MethodOptions{m}
}
func (m xxx_MethodOptions) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].Type
}
func (m xxx_MethodOptions) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].KnownFieldsOf(m.m)
}
func (m xxx_MethodOptions) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[17].UnknownFieldsOf(m.m)
}
func (m xxx_MethodOptions) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *MethodOptions) Reset()         { *m = MethodOptions{} }
func (m *MethodOptions) String() string { return protoapi.CompactTextString(m) }
func (*MethodOptions) ProtoMessage()    {}
func (*MethodOptions) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{17}
}

var extRange_MethodOptions = []protoapi.ExtensionRange{
	{Start: 1000, End: 536870911},
}

func (*MethodOptions) ExtensionRangeArray() []protoapi.ExtensionRange {
	return extRange_MethodOptions
}

const Default_MethodOptions_Deprecated bool = false
const Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN

func (m *MethodOptions) GetDeprecated() bool {
	if m != nil && m.Deprecated != nil {
		return *m.Deprecated
	}
	return Default_MethodOptions_Deprecated
}

func (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel {
	if m != nil && m.IdempotencyLevel != nil {
		return *m.IdempotencyLevel
	}
	return Default_MethodOptions_IdempotencyLevel
}

func (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption {
	if m != nil {
		return m.UninterpretedOption
	}
	return nil
}

// A message representing a option the parser does not recognize. This only
// appears in options protos created by the compiler::Parser class.
// DescriptorPool resolves these when building Descriptor objects. Therefore,
// options protos in descriptor objects (e.g. returned by Descriptor::options(),
// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
// in them.
type UninterpretedOption struct {
	Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"`
	// The value of the uninterpreted option, in whatever type the tokenizer
	// identified it as during parsing. Exactly one of these should be set.
	IdentifierValue      *string  `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"`
	PositiveIntValue     *uint64  `protobuf:"varint,4,opt,name=positive_int_value,json=positiveIntValue" json:"positive_int_value,omitempty"`
	NegativeIntValue     *int64   `protobuf:"varint,5,opt,name=negative_int_value,json=negativeIntValue" json:"negative_int_value,omitempty"`
	DoubleValue          *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"`
	StringValue          []byte   `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"`
	AggregateValue       *string  `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_UninterpretedOption struct{ m *UninterpretedOption }

func (m *UninterpretedOption) ProtoReflect() protoreflect.Message {
	return xxx_UninterpretedOption{m}
}
func (m xxx_UninterpretedOption) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].Type
}
func (m xxx_UninterpretedOption) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].KnownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[18].UnknownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *UninterpretedOption) Reset()         { *m = UninterpretedOption{} }
func (m *UninterpretedOption) String() string { return protoapi.CompactTextString(m) }
func (*UninterpretedOption) ProtoMessage()    {}
func (*UninterpretedOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{18}
}

func (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *UninterpretedOption) GetIdentifierValue() string {
	if m != nil && m.IdentifierValue != nil {
		return *m.IdentifierValue
	}
	return ""
}

func (m *UninterpretedOption) GetPositiveIntValue() uint64 {
	if m != nil && m.PositiveIntValue != nil {
		return *m.PositiveIntValue
	}
	return 0
}

func (m *UninterpretedOption) GetNegativeIntValue() int64 {
	if m != nil && m.NegativeIntValue != nil {
		return *m.NegativeIntValue
	}
	return 0
}

func (m *UninterpretedOption) GetDoubleValue() float64 {
	if m != nil && m.DoubleValue != nil {
		return *m.DoubleValue
	}
	return 0
}

func (m *UninterpretedOption) GetStringValue() []byte {
	if m != nil {
		return m.StringValue
	}
	return nil
}

func (m *UninterpretedOption) GetAggregateValue() string {
	if m != nil && m.AggregateValue != nil {
		return *m.AggregateValue
	}
	return ""
}

// Encapsulates information about the original source file from which a
// FileDescriptorProto was generated.
type SourceCodeInfo struct {
	// A Location identifies a piece of source code in a .proto file which
	// corresponds to a particular definition.  This information is intended
	// to be useful to IDEs, code indexers, documentation generators, and similar
	// tools.
	//
	// For example, say we have a file like:
	//   message Foo {
	//     optional string foo = 1;
	//   }
	// Let's look at just the field definition:
	//   optional string foo = 1;
	//   ^       ^^     ^^  ^  ^^^
	//   a       bc     de  f  ghi
	// We have the following locations:
	//   span   path               represents
	//   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
	//   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
	//   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
	//   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
	//   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
	//
	// Notes:
	// - A location may refer to a repeated field itself (i.e. not to any
	//   particular index within it).  This is used whenever a set of elements are
	//   logically enclosed in a single code segment.  For example, an entire
	//   extend block (possibly containing multiple extension definitions) will
	//   have an outer location whose path refers to the "extensions" repeated
	//   field without an index.
	// - Multiple locations may have the same path.  This happens when a single
	//   logical declaration is spread out across multiple places.  The most
	//   obvious example is the "extend" block again -- there may be multiple
	//   extend blocks in the same scope, each of which will have the same path.
	// - A location's span is not always a subset of its parent's span.  For
	//   example, the "extendee" of an extension declaration appears at the
	//   beginning of the "extend" block and is shared by all extensions within
	//   the block.
	// - Just because a location's span is a subset of some other location's span
	//   does not mean that it is a descendent.  For example, a "group" defines
	//   both a type and a field in a single declaration.  Thus, the locations
	//   corresponding to the type and field and their components will overlap.
	// - Code which tries to interpret locations should probably be designed to
	//   ignore those that it doesn't understand, as more types of locations could
	//   be recorded in the future.
	Location             []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

type xxx_SourceCodeInfo struct{ m *SourceCodeInfo }

func (m *SourceCodeInfo) ProtoReflect() protoreflect.Message {
	return xxx_SourceCodeInfo{m}
}
func (m xxx_SourceCodeInfo) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].Type
}
func (m xxx_SourceCodeInfo) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].KnownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[19].UnknownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *SourceCodeInfo) Reset()         { *m = SourceCodeInfo{} }
func (m *SourceCodeInfo) String() string { return protoapi.CompactTextString(m) }
func (*SourceCodeInfo) ProtoMessage()    {}
func (*SourceCodeInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{19}
}

func (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location {
	if m != nil {
		return m.Location
	}
	return nil
}

// Describes the relationship between generated code and its original source
// file. A GeneratedCodeInfo message is associated with only one generated
// source file, but may contain references to different source .proto files.
type GeneratedCodeInfo struct {
	// An Annotation connects some span of text in generated code to an element
	// of its generating .proto file.
	Annotation           []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

type xxx_GeneratedCodeInfo struct{ m *GeneratedCodeInfo }

func (m *GeneratedCodeInfo) ProtoReflect() protoreflect.Message {
	return xxx_GeneratedCodeInfo{m}
}
func (m xxx_GeneratedCodeInfo) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].Type
}
func (m xxx_GeneratedCodeInfo) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].KnownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[20].UnknownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *GeneratedCodeInfo) Reset()         { *m = GeneratedCodeInfo{} }
func (m *GeneratedCodeInfo) String() string { return protoapi.CompactTextString(m) }
func (*GeneratedCodeInfo) ProtoMessage()    {}
func (*GeneratedCodeInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{20}
}

func (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation {
	if m != nil {
		return m.Annotation
	}
	return nil
}

type DescriptorProto_ExtensionRange struct {
	Start                *int32                 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32                 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	Options              *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

type xxx_DescriptorProto_ExtensionRange struct {
	m *DescriptorProto_ExtensionRange
}

func (m *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto_ExtensionRange{m}
}
func (m xxx_DescriptorProto_ExtensionRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].Type
}
func (m xxx_DescriptorProto_ExtensionRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ExtensionRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[21].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ExtensionRange) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *DescriptorProto_ExtensionRange) Reset()         { *m = DescriptorProto_ExtensionRange{} }
func (m *DescriptorProto_ExtensionRange) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto_ExtensionRange) ProtoMessage()    {}
func (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2, 0}
}

func (m *DescriptorProto_ExtensionRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *DescriptorProto_ExtensionRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

func (m *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions {
	if m != nil {
		return m.Options
	}
	return nil
}

// Range of reserved tag numbers. Reserved tag numbers may not be used by
// fields or extension ranges in the same message. Reserved ranges may
// not overlap.
type DescriptorProto_ReservedRange struct {
	Start                *int32   `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32   `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_DescriptorProto_ReservedRange struct {
	m *DescriptorProto_ReservedRange
}

func (m *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message {
	return xxx_DescriptorProto_ReservedRange{m}
}
func (m xxx_DescriptorProto_ReservedRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].Type
}
func (m xxx_DescriptorProto_ReservedRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].KnownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ReservedRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[22].UnknownFieldsOf(m.m)
}
func (m xxx_DescriptorProto_ReservedRange) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *DescriptorProto_ReservedRange) Reset()         { *m = DescriptorProto_ReservedRange{} }
func (m *DescriptorProto_ReservedRange) String() string { return protoapi.CompactTextString(m) }
func (*DescriptorProto_ReservedRange) ProtoMessage()    {}
func (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{2, 1}
}

func (m *DescriptorProto_ReservedRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *DescriptorProto_ReservedRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

// Range of reserved numeric values. Reserved values may not be used by
// entries in the same enum. Reserved ranges may not overlap.
//
// Note that this is distinct from DescriptorProto.ReservedRange in that it
// is inclusive such that it can appropriately represent the entire int32
// domain.
type EnumDescriptorProto_EnumReservedRange struct {
	Start                *int32   `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
	End                  *int32   `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_EnumDescriptorProto_EnumReservedRange struct {
	m *EnumDescriptorProto_EnumReservedRange
}

func (m *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message {
	return xxx_EnumDescriptorProto_EnumReservedRange{m}
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].Type
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].KnownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[23].UnknownFieldsOf(m.m)
}
func (m xxx_EnumDescriptorProto_EnumReservedRange) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *EnumDescriptorProto_EnumReservedRange) Reset()         { *m = EnumDescriptorProto_EnumReservedRange{} }
func (m *EnumDescriptorProto_EnumReservedRange) String() string { return protoapi.CompactTextString(m) }
func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage()    {}
func (*EnumDescriptorProto_EnumReservedRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{6, 0}
}

func (m *EnumDescriptorProto_EnumReservedRange) GetStart() int32 {
	if m != nil && m.Start != nil {
		return *m.Start
	}
	return 0
}

func (m *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

// The name of the uninterpreted option.  Each string represents a segment in
// a dot-separated name.  is_extension is true iff a segment represents an
// extension (denoted with parentheses in options specs in .proto files).
// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
// "foo.(bar.baz).qux".
type UninterpretedOption_NamePart struct {
	NamePart             *string  `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"`
	IsExtension          *bool    `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_UninterpretedOption_NamePart struct{ m *UninterpretedOption_NamePart }

func (m *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message {
	return xxx_UninterpretedOption_NamePart{m}
}
func (m xxx_UninterpretedOption_NamePart) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].Type
}
func (m xxx_UninterpretedOption_NamePart) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].KnownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption_NamePart) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[24].UnknownFieldsOf(m.m)
}
func (m xxx_UninterpretedOption_NamePart) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *UninterpretedOption_NamePart) Reset()         { *m = UninterpretedOption_NamePart{} }
func (m *UninterpretedOption_NamePart) String() string { return protoapi.CompactTextString(m) }
func (*UninterpretedOption_NamePart) ProtoMessage()    {}
func (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{18, 0}
}

func (m *UninterpretedOption_NamePart) GetNamePart() string {
	if m != nil && m.NamePart != nil {
		return *m.NamePart
	}
	return ""
}

func (m *UninterpretedOption_NamePart) GetIsExtension() bool {
	if m != nil && m.IsExtension != nil {
		return *m.IsExtension
	}
	return false
}

type SourceCodeInfo_Location struct {
	// Identifies which part of the FileDescriptorProto was defined at this
	// location.
	//
	// Each element is a field number or an index.  They form a path from
	// the root FileDescriptorProto to the place where the definition.  For
	// example, this path:
	//   [ 4, 3, 2, 7, 1 ]
	// refers to:
	//   file.message_type(3)  // 4, 3
	//       .field(7)         // 2, 7
	//       .name()           // 1
	// This is because FileDescriptorProto.message_type has field number 4:
	//   repeated DescriptorProto message_type = 4;
	// and DescriptorProto.field has field number 2:
	//   repeated FieldDescriptorProto field = 2;
	// and FieldDescriptorProto.name has field number 1:
	//   optional string name = 1;
	//
	// Thus, the above path gives the location of a field name.  If we removed
	// the last element:
	//   [ 4, 3, 2, 7 ]
	// this path refers to the whole field declaration (from the beginning
	// of the label to the terminating semicolon).
	Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"`
	// Always has exactly three or four elements: start line, start column,
	// end line (optional, otherwise assumed same as start line), end column.
	// These are packed into a single field for efficiency.  Note that line
	// and column numbers are zero-based -- typically you will want to add
	// 1 to each before displaying to a user.
	Span []int32 `protobuf:"varint,2,rep,packed,name=span" json:"span,omitempty"`
	// If this SourceCodeInfo represents a complete declaration, these are any
	// comments appearing before and after the declaration which appear to be
	// attached to the declaration.
	//
	// A series of line comments appearing on consecutive lines, with no other
	// tokens appearing on those lines, will be treated as a single comment.
	//
	// leading_detached_comments will keep paragraphs of comments that appear
	// before (but not connected to) the current element. Each paragraph,
	// separated by empty lines, will be one comment element in the repeated
	// field.
	//
	// Only the comment content is provided; comment markers (e.g. //) are
	// stripped out.  For block comments, leading whitespace and an asterisk
	// will be stripped from the beginning of each line other than the first.
	// Newlines are included in the output.
	//
	// Examples:
	//
	//   optional int32 foo = 1;  // Comment attached to foo.
	//   // Comment attached to bar.
	//   optional int32 bar = 2;
	//
	//   optional string baz = 3;
	//   // Comment attached to baz.
	//   // Another line attached to baz.
	//
	//   // Comment attached to qux.
	//   //
	//   // Another line attached to qux.
	//   optional double qux = 4;
	//
	//   // Detached comment for corge. This is not leading or trailing comments
	//   // to qux or corge because there are blank lines separating it from
	//   // both.
	//
	//   // Detached comment for corge paragraph 2.
	//
	//   optional string corge = 5;
	//   /* Block comment attached
	//    * to corge.  Leading asterisks
	//    * will be removed. */
	//   /* Block comment attached to
	//    * grault. */
	//   optional int32 grault = 6;
	//
	//   // ignored detached comments.
	LeadingComments         *string  `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"`
	TrailingComments        *string  `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"`
	LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

type xxx_SourceCodeInfo_Location struct{ m *SourceCodeInfo_Location }

func (m *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message {
	return xxx_SourceCodeInfo_Location{m}
}
func (m xxx_SourceCodeInfo_Location) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].Type
}
func (m xxx_SourceCodeInfo_Location) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].KnownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo_Location) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[25].UnknownFieldsOf(m.m)
}
func (m xxx_SourceCodeInfo_Location) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *SourceCodeInfo_Location) Reset()         { *m = SourceCodeInfo_Location{} }
func (m *SourceCodeInfo_Location) String() string { return protoapi.CompactTextString(m) }
func (*SourceCodeInfo_Location) ProtoMessage()    {}
func (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{19, 0}
}

func (m *SourceCodeInfo_Location) GetPath() []int32 {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *SourceCodeInfo_Location) GetSpan() []int32 {
	if m != nil {
		return m.Span
	}
	return nil
}

func (m *SourceCodeInfo_Location) GetLeadingComments() string {
	if m != nil && m.LeadingComments != nil {
		return *m.LeadingComments
	}
	return ""
}

func (m *SourceCodeInfo_Location) GetTrailingComments() string {
	if m != nil && m.TrailingComments != nil {
		return *m.TrailingComments
	}
	return ""
}

func (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string {
	if m != nil {
		return m.LeadingDetachedComments
	}
	return nil
}

type GeneratedCodeInfo_Annotation struct {
	// Identifies the element in the original source .proto file. This field
	// is formatted the same as SourceCodeInfo.Location.path.
	Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"`
	// Identifies the filesystem path to the original source .proto.
	SourceFile *string `protobuf:"bytes,2,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"`
	// Identifies the starting offset in bytes in the generated code
	// that relates to the identified object.
	Begin *int32 `protobuf:"varint,3,opt,name=begin" json:"begin,omitempty"`
	// Identifies the ending offset in bytes in the generated code that
	// relates to the identified offset. The end offset should be one past
	// the last relevant byte (so the length of the text = end - begin).
	End                  *int32   `protobuf:"varint,4,opt,name=end" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

type xxx_GeneratedCodeInfo_Annotation struct{ m *GeneratedCodeInfo_Annotation }

func (m *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {
	return xxx_GeneratedCodeInfo_Annotation{m}
}
func (m xxx_GeneratedCodeInfo_Annotation) Type() protoreflect.MessageType {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].Type
}
func (m xxx_GeneratedCodeInfo_Annotation) KnownFields() protoreflect.KnownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].KnownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo_Annotation) UnknownFields() protoreflect.UnknownFields {
	return xxx_Descriptor_ProtoFile_MessageTypes[26].UnknownFieldsOf(m.m)
}
func (m xxx_GeneratedCodeInfo_Annotation) Interface() protoreflect.ProtoMessage {
	return m.m
}

func (m *GeneratedCodeInfo_Annotation) Reset()         { *m = GeneratedCodeInfo_Annotation{} }
func (m *GeneratedCodeInfo_Annotation) String() string { return protoapi.CompactTextString(m) }
func (*GeneratedCodeInfo_Annotation) ProtoMessage()    {}
func (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {
	return fileDescriptor_e5baabe45344a177, []int{20, 0}
}

func (m *GeneratedCodeInfo_Annotation) GetPath() []int32 {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *GeneratedCodeInfo_Annotation) GetSourceFile() string {
	if m != nil && m.SourceFile != nil {
		return *m.SourceFile
	}
	return ""
}

func (m *GeneratedCodeInfo_Annotation) GetBegin() int32 {
	if m != nil && m.Begin != nil {
		return *m.Begin
	}
	return 0
}

func (m *GeneratedCodeInfo_Annotation) GetEnd() int32 {
	if m != nil && m.End != nil {
		return *m.End
	}
	return 0
}

func init() {
	protoapi.RegisterFile("google/protobuf/descriptor.proto", fileDescriptor_e5baabe45344a177)
	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Type", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value)
	protoapi.RegisterEnum("google.protobuf.FieldDescriptorProto_Label", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value)
	protoapi.RegisterEnum("google.protobuf.FileOptions_OptimizeMode", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value)
	protoapi.RegisterEnum("google.protobuf.FieldOptions_CType", FieldOptions_CType_name, FieldOptions_CType_value)
	protoapi.RegisterEnum("google.protobuf.FieldOptions_JSType", FieldOptions_JSType_name, FieldOptions_JSType_value)
	protoapi.RegisterEnum("google.protobuf.MethodOptions_IdempotencyLevel", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value)
	protoapi.RegisterType((*FileDescriptorSet)(nil), "google.protobuf.FileDescriptorSet")
	protoapi.RegisterType((*FileDescriptorProto)(nil), "google.protobuf.FileDescriptorProto")
	protoapi.RegisterType((*DescriptorProto)(nil), "google.protobuf.DescriptorProto")
	protoapi.RegisterType((*ExtensionRangeOptions)(nil), "google.protobuf.ExtensionRangeOptions")
	protoapi.RegisterType((*FieldDescriptorProto)(nil), "google.protobuf.FieldDescriptorProto")
	protoapi.RegisterType((*OneofDescriptorProto)(nil), "google.protobuf.OneofDescriptorProto")
	protoapi.RegisterType((*EnumDescriptorProto)(nil), "google.protobuf.EnumDescriptorProto")
	protoapi.RegisterType((*EnumValueDescriptorProto)(nil), "google.protobuf.EnumValueDescriptorProto")
	protoapi.RegisterType((*ServiceDescriptorProto)(nil), "google.protobuf.ServiceDescriptorProto")
	protoapi.RegisterType((*MethodDescriptorProto)(nil), "google.protobuf.MethodDescriptorProto")
	protoapi.RegisterType((*FileOptions)(nil), "google.protobuf.FileOptions")
	protoapi.RegisterType((*MessageOptions)(nil), "google.protobuf.MessageOptions")
	protoapi.RegisterType((*FieldOptions)(nil), "google.protobuf.FieldOptions")
	protoapi.RegisterType((*OneofOptions)(nil), "google.protobuf.OneofOptions")
	protoapi.RegisterType((*EnumOptions)(nil), "google.protobuf.EnumOptions")
	protoapi.RegisterType((*EnumValueOptions)(nil), "google.protobuf.EnumValueOptions")
	protoapi.RegisterType((*ServiceOptions)(nil), "google.protobuf.ServiceOptions")
	protoapi.RegisterType((*MethodOptions)(nil), "google.protobuf.MethodOptions")
	protoapi.RegisterType((*UninterpretedOption)(nil), "google.protobuf.UninterpretedOption")
	protoapi.RegisterType((*SourceCodeInfo)(nil), "google.protobuf.SourceCodeInfo")
	protoapi.RegisterType((*GeneratedCodeInfo)(nil), "google.protobuf.GeneratedCodeInfo")
	protoapi.RegisterType((*DescriptorProto_ExtensionRange)(nil), "google.protobuf.DescriptorProto.ExtensionRange")
	protoapi.RegisterType((*DescriptorProto_ReservedRange)(nil), "google.protobuf.DescriptorProto.ReservedRange")
	protoapi.RegisterType((*EnumDescriptorProto_EnumReservedRange)(nil), "google.protobuf.EnumDescriptorProto.EnumReservedRange")
	protoapi.RegisterType((*UninterpretedOption_NamePart)(nil), "google.protobuf.UninterpretedOption.NamePart")
	protoapi.RegisterType((*SourceCodeInfo_Location)(nil), "google.protobuf.SourceCodeInfo.Location")
	protoapi.RegisterType((*GeneratedCodeInfo_Annotation)(nil), "google.protobuf.GeneratedCodeInfo.Annotation")
}

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

func init() {
	xxx_Descriptor_ProtoFile_FileDesc.Messages = xxx_Descriptor_ProtoFile_MessageDescs[0:21]
	xxx_Descriptor_ProtoFile_MessageDescs[2].Messages = xxx_Descriptor_ProtoFile_MessageDescs[21:23]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Enums = xxx_Descriptor_ProtoFile_EnumDescs[0:2]
	xxx_Descriptor_ProtoFile_MessageDescs[6].Messages = xxx_Descriptor_ProtoFile_MessageDescs[23:24]
	xxx_Descriptor_ProtoFile_MessageDescs[10].Enums = xxx_Descriptor_ProtoFile_EnumDescs[2:3]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Enums = xxx_Descriptor_ProtoFile_EnumDescs[3:5]
	xxx_Descriptor_ProtoFile_MessageDescs[17].Enums = xxx_Descriptor_ProtoFile_EnumDescs[5:6]
	xxx_Descriptor_ProtoFile_MessageDescs[18].Messages = xxx_Descriptor_ProtoFile_MessageDescs[24:25]
	xxx_Descriptor_ProtoFile_MessageDescs[19].Messages = xxx_Descriptor_ProtoFile_MessageDescs[25:26]
	xxx_Descriptor_ProtoFile_MessageDescs[20].Messages = xxx_Descriptor_ProtoFile_MessageDescs[26:27]
	xxx_Descriptor_ProtoFile_MessageDescs[0].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[1].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[5].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[2].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[6].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[7].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[8].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[8].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[9].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[10].Type
	xxx_Descriptor_ProtoFile_MessageDescs[1].Fields[10].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[19].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[4].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[2].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[4].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[6].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[5].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[21].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[5].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[7].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[11].Type
	xxx_Descriptor_ProtoFile_MessageDescs[2].Fields[8].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[22].Type
	xxx_Descriptor_ProtoFile_MessageDescs[3].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[2].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[1]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[3].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[0]
	xxx_Descriptor_ProtoFile_MessageDescs[4].Fields[9].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[12].Type
	xxx_Descriptor_ProtoFile_MessageDescs[5].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[13].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[7].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[14].Type
	xxx_Descriptor_ProtoFile_MessageDescs[6].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[23].Type
	xxx_Descriptor_ProtoFile_MessageDescs[7].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[15].Type
	xxx_Descriptor_ProtoFile_MessageDescs[8].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[9].Type
	xxx_Descriptor_ProtoFile_MessageDescs[8].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[16].Type
	xxx_Descriptor_ProtoFile_MessageDescs[9].Fields[3].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[17].Type
	xxx_Descriptor_ProtoFile_MessageDescs[10].Fields[5].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[2]
	xxx_Descriptor_ProtoFile_MessageDescs[10].Fields[20].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[11].Fields[4].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[0].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[3]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[2].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[4]
	xxx_Descriptor_ProtoFile_MessageDescs[12].Fields[6].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[13].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[14].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[15].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[16].Fields[1].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[17].Fields[1].EnumType = xxx_Descriptor_ProtoFile_EnumTypes[5]
	xxx_Descriptor_ProtoFile_MessageDescs[17].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[18].Type
	xxx_Descriptor_ProtoFile_MessageDescs[18].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[24].Type
	xxx_Descriptor_ProtoFile_MessageDescs[19].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[25].Type
	xxx_Descriptor_ProtoFile_MessageDescs[20].Fields[0].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[26].Type
	xxx_Descriptor_ProtoFile_MessageDescs[21].Fields[2].MessageType = xxx_Descriptor_ProtoFile_MessageTypes[3].Type
	var err error
	Descriptor_ProtoFile, err = prototype.NewFile(&xxx_Descriptor_ProtoFile_FileDesc)
	if err != nil {
		panic(err)
	}
	prototype.X.RegisterExtensionRangeOptions((*ExtensionRangeOptions)(nil))
	prototype.X.RegisterFileOptions((*FileOptions)(nil))
	prototype.X.RegisterMessageOptions((*MessageOptions)(nil))
	prototype.X.RegisterFieldOptions((*FieldOptions)(nil))
	prototype.X.RegisterOneofOptions((*OneofOptions)(nil))
	prototype.X.RegisterEnumOptions((*EnumOptions)(nil))
	prototype.X.RegisterEnumValueOptions((*EnumValueOptions)(nil))
	prototype.X.RegisterServiceOptions((*ServiceOptions)(nil))
	prototype.X.RegisterMethodOptions((*MethodOptions)(nil))
}

const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)

var Descriptor_ProtoFile protoreflect.FileDescriptor

var xxx_Descriptor_ProtoFile_FileDesc = prototype.File{
	Syntax:  protoreflect.Proto2,
	Path:    "google/protobuf/descriptor.proto",
	Package: "google.protobuf",
}
var xxx_Descriptor_ProtoFile_EnumTypes = [6]protoreflect.EnumType{
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[0].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return FieldDescriptorProto_Type(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[1].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return FieldDescriptorProto_Label(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[2].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return FileOptions_OptimizeMode(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[3].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return FieldOptions_CType(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[4].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return FieldOptions_JSType(n)
		},
	),
	prototype.GoEnum(
		xxx_Descriptor_ProtoFile_EnumDescs[5].Reference(),
		func(_ protoreflect.EnumType, n protoreflect.EnumNumber) protoreflect.Enum {
			return MethodOptions_IdempotencyLevel(n)
		},
	),
}
var xxx_Descriptor_ProtoFile_EnumDescs = [6]prototype.Enum{
	{
		Name: "Type",
		Values: []prototype.EnumValue{
			{Name: "TYPE_DOUBLE", Number: 1},
			{Name: "TYPE_FLOAT", Number: 2},
			{Name: "TYPE_INT64", Number: 3},
			{Name: "TYPE_UINT64", Number: 4},
			{Name: "TYPE_INT32", Number: 5},
			{Name: "TYPE_FIXED64", Number: 6},
			{Name: "TYPE_FIXED32", Number: 7},
			{Name: "TYPE_BOOL", Number: 8},
			{Name: "TYPE_STRING", Number: 9},
			{Name: "TYPE_GROUP", Number: 10},
			{Name: "TYPE_MESSAGE", Number: 11},
			{Name: "TYPE_BYTES", Number: 12},
			{Name: "TYPE_UINT32", Number: 13},
			{Name: "TYPE_ENUM", Number: 14},
			{Name: "TYPE_SFIXED32", Number: 15},
			{Name: "TYPE_SFIXED64", Number: 16},
			{Name: "TYPE_SINT32", Number: 17},
			{Name: "TYPE_SINT64", Number: 18},
		},
	},
	{
		Name: "Label",
		Values: []prototype.EnumValue{
			{Name: "LABEL_OPTIONAL", Number: 1},
			{Name: "LABEL_REQUIRED", Number: 2},
			{Name: "LABEL_REPEATED", Number: 3},
		},
	},
	{
		Name: "OptimizeMode",
		Values: []prototype.EnumValue{
			{Name: "SPEED", Number: 1},
			{Name: "CODE_SIZE", Number: 2},
			{Name: "LITE_RUNTIME", Number: 3},
		},
	},
	{
		Name: "CType",
		Values: []prototype.EnumValue{
			{Name: "STRING", Number: 0},
			{Name: "CORD", Number: 1},
			{Name: "STRING_PIECE", Number: 2},
		},
	},
	{
		Name: "JSType",
		Values: []prototype.EnumValue{
			{Name: "JS_NORMAL", Number: 0},
			{Name: "JS_STRING", Number: 1},
			{Name: "JS_NUMBER", Number: 2},
		},
	},
	{
		Name: "IdempotencyLevel",
		Values: []prototype.EnumValue{
			{Name: "IDEMPOTENCY_UNKNOWN", Number: 0},
			{Name: "NO_SIDE_EFFECTS", Number: 1},
			{Name: "IDEMPOTENT", Number: 2},
		},
	},
}
var xxx_Descriptor_ProtoFile_MessageTypes = [27]protoimpl.MessageType{
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[0].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_FileDescriptorSet{new(FileDescriptorSet)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[1].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_FileDescriptorProto{new(FileDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[2].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_DescriptorProto{new(DescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[3].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_ExtensionRangeOptions{new(ExtensionRangeOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[4].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_FieldDescriptorProto{new(FieldDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[5].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_OneofDescriptorProto{new(OneofDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[6].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_EnumDescriptorProto{new(EnumDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[7].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_EnumValueDescriptorProto{new(EnumValueDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[8].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_ServiceDescriptorProto{new(ServiceDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[9].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_MethodDescriptorProto{new(MethodDescriptorProto)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[10].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_FileOptions{new(FileOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[11].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_MessageOptions{new(MessageOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[12].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_FieldOptions{new(FieldOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[13].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_OneofOptions{new(OneofOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[14].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_EnumOptions{new(EnumOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[15].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_EnumValueOptions{new(EnumValueOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[16].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_ServiceOptions{new(ServiceOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[17].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_MethodOptions{new(MethodOptions)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[18].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_UninterpretedOption{new(UninterpretedOption)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[19].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_SourceCodeInfo{new(SourceCodeInfo)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[20].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_GeneratedCodeInfo{new(GeneratedCodeInfo)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[21].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_DescriptorProto_ExtensionRange{new(DescriptorProto_ExtensionRange)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[22].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_DescriptorProto_ReservedRange{new(DescriptorProto_ReservedRange)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[23].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_EnumDescriptorProto_EnumReservedRange{new(EnumDescriptorProto_EnumReservedRange)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[24].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_UninterpretedOption_NamePart{new(UninterpretedOption_NamePart)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[25].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_SourceCodeInfo_Location{new(SourceCodeInfo_Location)}
		},
	)},
	{Type: prototype.GoMessage(
		xxx_Descriptor_ProtoFile_MessageDescs[26].Reference(),
		func(protoreflect.MessageType) protoreflect.Message {
			return xxx_GeneratedCodeInfo_Annotation{new(GeneratedCodeInfo_Annotation)}
		},
	)},
}
var xxx_Descriptor_ProtoFile_MessageDescs = [27]prototype.Message{
	{
		Name: "FileDescriptorSet",
		Fields: []prototype.Field{
			{
				Name:        "file",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "file",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "FileDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "package",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "package",
				IsPacked:    prototype.False,
			},
			{
				Name:        "dependency",
				Number:      3,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "dependency",
				IsPacked:    prototype.False,
			},
			{
				Name:        "public_dependency",
				Number:      10,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "publicDependency",
				IsPacked:    prototype.False,
			},
			{
				Name:        "weak_dependency",
				Number:      11,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "weakDependency",
				IsPacked:    prototype.False,
			},
			{
				Name:        "message_type",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "messageType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "enum_type",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "enumType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "service",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "service",
				IsPacked:    prototype.False,
			},
			{
				Name:        "extension",
				Number:      7,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extension",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
			{
				Name:        "source_code_info",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "sourceCodeInfo",
				IsPacked:    prototype.False,
			},
			{
				Name:        "syntax",
				Number:      12,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "syntax",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "DescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "field",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "field",
				IsPacked:    prototype.False,
			},
			{
				Name:        "extension",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extension",
				IsPacked:    prototype.False,
			},
			{
				Name:        "nested_type",
				Number:      3,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "nestedType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "enum_type",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "enumType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "extension_range",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "extensionRange",
				IsPacked:    prototype.False,
			},
			{
				Name:        "oneof_decl",
				Number:      8,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "oneofDecl",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
			{
				Name:        "reserved_range",
				Number:      9,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "reservedRange",
				IsPacked:    prototype.False,
			},
			{
				Name:        "reserved_name",
				Number:      10,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "reservedName",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "ExtensionRangeOptions",
		Fields: []prototype.Field{
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "FieldDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "number",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "number",
				IsPacked:    prototype.False,
			},
			{
				Name:        "label",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "label",
				IsPacked:    prototype.False,
			},
			{
				Name:        "type",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "type",
				IsPacked:    prototype.False,
			},
			{
				Name:        "type_name",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "typeName",
				IsPacked:    prototype.False,
			},
			{
				Name:        "extendee",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "extendee",
				IsPacked:    prototype.False,
			},
			{
				Name:        "default_value",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "defaultValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "oneof_index",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "oneofIndex",
				IsPacked:    prototype.False,
			},
			{
				Name:        "json_name",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "jsonName",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "OneofDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "EnumDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "value",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "value",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
			{
				Name:        "reserved_range",
				Number:      4,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "reservedRange",
				IsPacked:    prototype.False,
			},
			{
				Name:        "reserved_name",
				Number:      5,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "reservedName",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "EnumValueDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "number",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "number",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "ServiceDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "method",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "method",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "MethodDescriptorProto",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "input_type",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "inputType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "output_type",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "outputType",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
			{
				Name:        "client_streaming",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "clientStreaming",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "server_streaming",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "serverStreaming",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "FileOptions",
		Fields: []prototype.Field{
			{
				Name:        "java_package",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "javaPackage",
				IsPacked:    prototype.False,
			},
			{
				Name:        "java_outer_classname",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "javaOuterClassname",
				IsPacked:    prototype.False,
			},
			{
				Name:        "java_multiple_files",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaMultipleFiles",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "java_generate_equals_and_hash",
				Number:      20,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaGenerateEqualsAndHash",
				IsPacked:    prototype.False,
			},
			{
				Name:        "java_string_check_utf8",
				Number:      27,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaStringCheckUtf8",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "optimize_for",
				Number:      9,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "optimizeFor",
				Default:     protoreflect.ValueOf(string("SPEED")),
				IsPacked:    prototype.False,
			},
			{
				Name:        "go_package",
				Number:      11,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "goPackage",
				IsPacked:    prototype.False,
			},
			{
				Name:        "cc_generic_services",
				Number:      16,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "ccGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "java_generic_services",
				Number:      17,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "javaGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "py_generic_services",
				Number:      18,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "pyGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "php_generic_services",
				Number:      42,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "phpGenericServices",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "deprecated",
				Number:      23,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "cc_enable_arenas",
				Number:      31,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "ccEnableArenas",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "objc_class_prefix",
				Number:      36,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "objcClassPrefix",
				IsPacked:    prototype.False,
			},
			{
				Name:        "csharp_namespace",
				Number:      37,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "csharpNamespace",
				IsPacked:    prototype.False,
			},
			{
				Name:        "swift_prefix",
				Number:      39,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "swiftPrefix",
				IsPacked:    prototype.False,
			},
			{
				Name:        "php_class_prefix",
				Number:      40,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpClassPrefix",
				IsPacked:    prototype.False,
			},
			{
				Name:        "php_namespace",
				Number:      41,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpNamespace",
				IsPacked:    prototype.False,
			},
			{
				Name:        "php_metadata_namespace",
				Number:      44,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "phpMetadataNamespace",
				IsPacked:    prototype.False,
			},
			{
				Name:        "ruby_package",
				Number:      45,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "rubyPackage",
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ReservedRanges:  [][2]protoreflect.FieldNumber{{38, 39}},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "MessageOptions",
		Fields: []prototype.Field{
			{
				Name:        "message_set_wire_format",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "messageSetWireFormat",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "no_standard_descriptor_accessor",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "noStandardDescriptorAccessor",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "map_entry",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "mapEntry",
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ReservedRanges:  [][2]protoreflect.FieldNumber{{8, 9}, {9, 10}},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "FieldOptions",
		Fields: []prototype.Field{
			{
				Name:        "ctype",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "ctype",
				Default:     protoreflect.ValueOf(string("STRING")),
				IsPacked:    prototype.False,
			},
			{
				Name:        "packed",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "packed",
				IsPacked:    prototype.False,
			},
			{
				Name:        "jstype",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "jstype",
				Default:     protoreflect.ValueOf(string("JS_NORMAL")),
				IsPacked:    prototype.False,
			},
			{
				Name:        "lazy",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "lazy",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "weak",
				Number:      10,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "weak",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ReservedRanges:  [][2]protoreflect.FieldNumber{{4, 5}},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "OneofOptions",
		Fields: []prototype.Field{
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "EnumOptions",
		Fields: []prototype.Field{
			{
				Name:        "allow_alias",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "allowAlias",
				IsPacked:    prototype.False,
			},
			{
				Name:        "deprecated",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ReservedRanges:  [][2]protoreflect.FieldNumber{{5, 6}},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "EnumValueOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "ServiceOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      33,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "MethodOptions",
		Fields: []prototype.Field{
			{
				Name:        "deprecated",
				Number:      33,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BoolKind,
				JSONName:    "deprecated",
				Default:     protoreflect.ValueOf(bool(false)),
				IsPacked:    prototype.False,
			},
			{
				Name:        "idempotency_level",
				Number:      34,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.EnumKind,
				JSONName:    "idempotencyLevel",
				Default:     protoreflect.ValueOf(string("IDEMPOTENCY_UNKNOWN")),
				IsPacked:    prototype.False,
			},
			{
				Name:        "uninterpreted_option",
				Number:      999,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "uninterpretedOption",
				IsPacked:    prototype.False,
			},
		},
		ExtensionRanges: [][2]protoreflect.FieldNumber{{1000, 536870912}},
	},
	{
		Name: "UninterpretedOption",
		Fields: []prototype.Field{
			{
				Name:        "name",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "name",
				IsPacked:    prototype.False,
			},
			{
				Name:        "identifier_value",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "identifierValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "positive_int_value",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Uint64Kind,
				JSONName:    "positiveIntValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "negative_int_value",
				Number:      5,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int64Kind,
				JSONName:    "negativeIntValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "double_value",
				Number:      6,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.DoubleKind,
				JSONName:    "doubleValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "string_value",
				Number:      7,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.BytesKind,
				JSONName:    "stringValue",
				IsPacked:    prototype.False,
			},
			{
				Name:        "aggregate_value",
				Number:      8,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "aggregateValue",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "SourceCodeInfo",
		Fields: []prototype.Field{
			{
				Name:        "location",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "location",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "GeneratedCodeInfo",
		Fields: []prototype.Field{
			{
				Name:        "annotation",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.MessageKind,
				JSONName:    "annotation",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "ExtensionRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
				IsPacked:    prototype.False,
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
				IsPacked:    prototype.False,
			},
			{
				Name:        "options",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.MessageKind,
				JSONName:    "options",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "ReservedRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
				IsPacked:    prototype.False,
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "EnumReservedRange",
		Fields: []prototype.Field{
			{
				Name:        "start",
				Number:      1,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "start",
				IsPacked:    prototype.False,
			},
			{
				Name:        "end",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "NamePart",
		Fields: []prototype.Field{
			{
				Name:        "name_part",
				Number:      1,
				Cardinality: protoreflect.Required,
				Kind:        protoreflect.StringKind,
				JSONName:    "namePart",
				IsPacked:    prototype.False,
			},
			{
				Name:        "is_extension",
				Number:      2,
				Cardinality: protoreflect.Required,
				Kind:        protoreflect.BoolKind,
				JSONName:    "isExtension",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "Location",
		Fields: []prototype.Field{
			{
				Name:        "path",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "path",
				IsPacked:    prototype.True,
			},
			{
				Name:        "span",
				Number:      2,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "span",
				IsPacked:    prototype.True,
			},
			{
				Name:        "leading_comments",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "leadingComments",
				IsPacked:    prototype.False,
			},
			{
				Name:        "trailing_comments",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "trailingComments",
				IsPacked:    prototype.False,
			},
			{
				Name:        "leading_detached_comments",
				Number:      6,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.StringKind,
				JSONName:    "leadingDetachedComments",
				IsPacked:    prototype.False,
			},
		},
	},
	{
		Name: "Annotation",
		Fields: []prototype.Field{
			{
				Name:        "path",
				Number:      1,
				Cardinality: protoreflect.Repeated,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "path",
				IsPacked:    prototype.True,
			},
			{
				Name:        "source_file",
				Number:      2,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.StringKind,
				JSONName:    "sourceFile",
				IsPacked:    prototype.False,
			},
			{
				Name:        "begin",
				Number:      3,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "begin",
				IsPacked:    prototype.False,
			},
			{
				Name:        "end",
				Number:      4,
				Cardinality: protoreflect.Optional,
				Kind:        protoreflect.Int32Kind,
				JSONName:    "end",
				IsPacked:    prototype.False,
			},
		},
	},
}
