// Code generated by protoc-gen-go. DO NOT EDIT.
// source: reflection/grpc_testing/proto2_ext2.proto

package grpc_testing

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type AnotherExtension struct {
	Whatchamacallit      *int32   `protobuf:"varint,1,opt,name=whatchamacallit" json:"whatchamacallit,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AnotherExtension proto.InternalMessageInfo

func (m *AnotherExtension) GetWhatchamacallit() int32 {
	if m != nil && m.Whatchamacallit != nil {
		return *m.Whatchamacallit
	}
	return 0
}

var E_Frob = &proto.ExtensionDesc{
	ExtendedType:  (*ToBeExtended)(nil),
	ExtensionType: (*string)(nil),
	Field:         23,
	Name:          "grpc.testing.frob",
	Tag:           "bytes,23,opt,name=frob",
	Filename:      "reflection/grpc_testing/proto2_ext2.proto",
}

var E_Nitz = &proto.ExtensionDesc{
	ExtendedType:  (*ToBeExtended)(nil),
	ExtensionType: (*AnotherExtension)(nil),
	Field:         29,
	Name:          "grpc.testing.nitz",
	Tag:           "bytes,29,opt,name=nitz",
	Filename:      "reflection/grpc_testing/proto2_ext2.proto",
}

func init() {
	proto.RegisterType((*AnotherExtension)(nil), "grpc.testing.AnotherExtension")
	proto.RegisterExtension(E_Frob)
	proto.RegisterExtension(E_Nitz)
}

func init() {
	proto.RegisterFile("reflection/grpc_testing/proto2_ext2.proto", fileDescriptor_ead6f7bd8a66fb18)
}

var fileDescriptor_ead6f7bd8a66fb18 = []byte{
	// 208 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x8f, 0x31, 0x4b, 0xc7, 0x30,
	0x10, 0xc5, 0x09, 0xfc, 0x1d, 0x8c, 0x82, 0xd2, 0xc5, 0x52, 0x50, 0x8a, 0x38, 0xc4, 0xe5, 0x2a,
	0x1d, 0x8b, 0x8b, 0x05, 0x57, 0x87, 0xe2, 0xe4, 0x52, 0x62, 0x7a, 0x4d, 0x03, 0x31, 0x57, 0xd2,
	0x03, 0x8b, 0x9f, 0x5e, 0x8c, 0x0e, 0x5a, 0xb0, 0xdb, 0x71, 0xef, 0xf7, 0xde, 0xdd, 0x93, 0xb7,
	0x11, 0x47, 0x8f, 0x86, 0x1d, 0x85, 0xca, 0xc6, 0xd9, 0xf4, 0x8c, 0x0b, 0xbb, 0x60, 0xab, 0x39,
	0x12, 0x53, 0xdd, 0xe3, 0xca, 0x35, 0xa4, 0x39, 0x3b, 0xfd, 0xd2, 0xe1, 0x47, 0x2f, 0x6e, 0xf6,
	0x8d, 0xdf, 0x9e, 0xeb, 0x7b, 0x79, 0xfe, 0x10, 0x88, 0x27, 0x8c, 0x8f, 0x2b, 0x63, 0x58, 0x1c,
	0x85, 0x4c, 0xc9, 0xb3, 0xf7, 0x49, 0xb3, 0x99, 0xf4, 0x9b, 0x36, 0xda, 0x7b, 0xc7, 0xb9, 0x28,
	0x85, 0x3a, 0xea, 0xb6, 0xeb, 0x06, 0xe4, 0x61, 0x8c, 0xf4, 0x9a, 0x15, 0xf0, 0xfb, 0x34, 0x3c,
	0x53, 0x8b, 0x29, 0x6e, 0xc0, 0x21, 0xbf, 0x28, 0x85, 0x3a, 0xee, 0x12, 0xd7, 0x3c, 0xc9, 0x43,
	0x70, 0xfc, 0xb1, 0xcb, 0x5f, 0x96, 0x42, 0x9d, 0xd4, 0x57, 0x7f, 0x89, 0xed, 0x8f, 0x5d, 0xca,
	0x69, 0xef, 0x5e, 0xc0, 0x12, 0x59, 0x8f, 0x60, 0xc9, 0xeb, 0x60, 0x81, 0xa2, 0x4d, 0x65, 0xab,
	0x7f, 0xca, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x18, 0x74, 0xc1, 0x53, 0x4f, 0x01, 0x00, 0x00,
}
