// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: internal/testprotos/lazy/lazy_opaque/lazy_tree.opaque.proto

package lazy_opaque

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	_ "google.golang.org/protobuf/types/gofeaturespb"
	reflect "reflect"
	unsafe "unsafe"
)

type Node struct {
	state               protoimpl.MessageState `protogen:"opaque.v1"`
	xxx_hidden_Nested   *Node                  `protobuf:"bytes,99,opt,name=nested"`
	xxx_hidden_Int32    int32                  `protobuf:"varint,1,opt,name=int32"`
	xxx_hidden_Int64    int64                  `protobuf:"varint,2,opt,name=int64"`
	xxx_hidden_Uint32   uint32                 `protobuf:"varint,3,opt,name=uint32"`
	xxx_hidden_Uint64   uint64                 `protobuf:"varint,4,opt,name=uint64"`
	xxx_hidden_Sint32   int32                  `protobuf:"zigzag32,5,opt,name=sint32"`
	xxx_hidden_Sint64   int64                  `protobuf:"zigzag64,6,opt,name=sint64"`
	xxx_hidden_Fixed32  uint32                 `protobuf:"fixed32,7,opt,name=fixed32"`
	xxx_hidden_Fixed64  uint64                 `protobuf:"fixed64,8,opt,name=fixed64"`
	xxx_hidden_Sfixed32 int32                  `protobuf:"fixed32,9,opt,name=sfixed32"`
	xxx_hidden_Sfixed64 int64                  `protobuf:"fixed64,10,opt,name=sfixed64"`
	xxx_hidden_Float    float32                `protobuf:"fixed32,11,opt,name=float"`
	xxx_hidden_Double   float64                `protobuf:"fixed64,12,opt,name=double"`
	xxx_hidden_Bool     bool                   `protobuf:"varint,13,opt,name=bool"`
	xxx_hidden_String_  *string                `protobuf:"bytes,14,opt,name=string"`
	xxx_hidden_Bytes    []byte                 `protobuf:"bytes,15,opt,name=bytes"`
	// Deprecated: Do not use. This will be deleted in the near future.
	XXX_lazyUnmarshalInfo  protoimpl.LazyUnmarshalInfo
	XXX_raceDetectHookData protoimpl.RaceDetectHookData
	XXX_presence           [1]uint32
	unknownFields          protoimpl.UnknownFields
	sizeCache              protoimpl.SizeCache
}

func (x *Node) Reset() {
	*x = Node{}
	mi := &file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Node) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Node) ProtoMessage() {}

func (x *Node) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

func (x *Node) GetNested() *Node {
	if x != nil {
		if protoimpl.X.Present(&(x.XXX_presence[0]), 0) {
			if protoimpl.X.AtomicCheckPointerIsNil(&x.xxx_hidden_Nested) {
				protoimpl.X.UnmarshalField(x, 99)
			}
			var rv *Node
			protoimpl.X.AtomicLoadPointer(protoimpl.Pointer(&x.xxx_hidden_Nested), protoimpl.Pointer(&rv))
			return rv
		}
	}
	return nil
}

func (x *Node) GetInt32() int32 {
	if x != nil {
		return x.xxx_hidden_Int32
	}
	return 0
}

func (x *Node) GetInt64() int64 {
	if x != nil {
		return x.xxx_hidden_Int64
	}
	return 0
}

func (x *Node) GetUint32() uint32 {
	if x != nil {
		return x.xxx_hidden_Uint32
	}
	return 0
}

func (x *Node) GetUint64() uint64 {
	if x != nil {
		return x.xxx_hidden_Uint64
	}
	return 0
}

func (x *Node) GetSint32() int32 {
	if x != nil {
		return x.xxx_hidden_Sint32
	}
	return 0
}

func (x *Node) GetSint64() int64 {
	if x != nil {
		return x.xxx_hidden_Sint64
	}
	return 0
}

func (x *Node) GetFixed32() uint32 {
	if x != nil {
		return x.xxx_hidden_Fixed32
	}
	return 0
}

func (x *Node) GetFixed64() uint64 {
	if x != nil {
		return x.xxx_hidden_Fixed64
	}
	return 0
}

func (x *Node) GetSfixed32() int32 {
	if x != nil {
		return x.xxx_hidden_Sfixed32
	}
	return 0
}

func (x *Node) GetSfixed64() int64 {
	if x != nil {
		return x.xxx_hidden_Sfixed64
	}
	return 0
}

func (x *Node) GetFloat() float32 {
	if x != nil {
		return x.xxx_hidden_Float
	}
	return 0
}

func (x *Node) GetDouble() float64 {
	if x != nil {
		return x.xxx_hidden_Double
	}
	return 0
}

func (x *Node) GetBool() bool {
	if x != nil {
		return x.xxx_hidden_Bool
	}
	return false
}

func (x *Node) GetString() string {
	if x != nil {
		if x.xxx_hidden_String_ != nil {
			return *x.xxx_hidden_String_
		}
		return ""
	}
	return ""
}

func (x *Node) GetBytes() []byte {
	if x != nil {
		return x.xxx_hidden_Bytes
	}
	return nil
}

func (x *Node) SetNested(v *Node) {
	protoimpl.X.AtomicSetPointer(&x.xxx_hidden_Nested, v)
	if v == nil {
		protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	} else {
		protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 16)
	}
}

func (x *Node) SetInt32(v int32) {
	x.xxx_hidden_Int32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 16)
}

func (x *Node) SetInt64(v int64) {
	x.xxx_hidden_Int64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 16)
}

func (x *Node) SetUint32(v uint32) {
	x.xxx_hidden_Uint32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 16)
}

func (x *Node) SetUint64(v uint64) {
	x.xxx_hidden_Uint64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 16)
}

func (x *Node) SetSint32(v int32) {
	x.xxx_hidden_Sint32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 5, 16)
}

func (x *Node) SetSint64(v int64) {
	x.xxx_hidden_Sint64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 6, 16)
}

func (x *Node) SetFixed32(v uint32) {
	x.xxx_hidden_Fixed32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 7, 16)
}

func (x *Node) SetFixed64(v uint64) {
	x.xxx_hidden_Fixed64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 8, 16)
}

func (x *Node) SetSfixed32(v int32) {
	x.xxx_hidden_Sfixed32 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 9, 16)
}

func (x *Node) SetSfixed64(v int64) {
	x.xxx_hidden_Sfixed64 = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 10, 16)
}

func (x *Node) SetFloat(v float32) {
	x.xxx_hidden_Float = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 11, 16)
}

func (x *Node) SetDouble(v float64) {
	x.xxx_hidden_Double = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 12, 16)
}

func (x *Node) SetBool(v bool) {
	x.xxx_hidden_Bool = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 13, 16)
}

func (x *Node) SetString(v string) {
	x.xxx_hidden_String_ = &v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 14, 16)
}

func (x *Node) SetBytes(v []byte) {
	if v == nil {
		v = []byte{}
	}
	x.xxx_hidden_Bytes = v
	protoimpl.X.SetPresent(&(x.XXX_presence[0]), 15, 16)
}

func (x *Node) HasNested() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 0)
}

func (x *Node) HasInt32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 1)
}

func (x *Node) HasInt64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 2)
}

func (x *Node) HasUint32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 3)
}

func (x *Node) HasUint64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 4)
}

func (x *Node) HasSint32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 5)
}

func (x *Node) HasSint64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 6)
}

func (x *Node) HasFixed32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 7)
}

func (x *Node) HasFixed64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 8)
}

func (x *Node) HasSfixed32() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 9)
}

func (x *Node) HasSfixed64() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 10)
}

func (x *Node) HasFloat() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 11)
}

func (x *Node) HasDouble() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 12)
}

func (x *Node) HasBool() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 13)
}

func (x *Node) HasString() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 14)
}

func (x *Node) HasBytes() bool {
	if x == nil {
		return false
	}
	return protoimpl.X.Present(&(x.XXX_presence[0]), 15)
}

func (x *Node) ClearNested() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0)
	protoimpl.X.AtomicSetPointer(&x.xxx_hidden_Nested, (*Node)(nil))
}

func (x *Node) ClearInt32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1)
	x.xxx_hidden_Int32 = 0
}

func (x *Node) ClearInt64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2)
	x.xxx_hidden_Int64 = 0
}

func (x *Node) ClearUint32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3)
	x.xxx_hidden_Uint32 = 0
}

func (x *Node) ClearUint64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 4)
	x.xxx_hidden_Uint64 = 0
}

func (x *Node) ClearSint32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 5)
	x.xxx_hidden_Sint32 = 0
}

func (x *Node) ClearSint64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 6)
	x.xxx_hidden_Sint64 = 0
}

func (x *Node) ClearFixed32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 7)
	x.xxx_hidden_Fixed32 = 0
}

func (x *Node) ClearFixed64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 8)
	x.xxx_hidden_Fixed64 = 0
}

func (x *Node) ClearSfixed32() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 9)
	x.xxx_hidden_Sfixed32 = 0
}

func (x *Node) ClearSfixed64() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 10)
	x.xxx_hidden_Sfixed64 = 0
}

func (x *Node) ClearFloat() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 11)
	x.xxx_hidden_Float = 0
}

func (x *Node) ClearDouble() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 12)
	x.xxx_hidden_Double = 0
}

func (x *Node) ClearBool() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 13)
	x.xxx_hidden_Bool = false
}

func (x *Node) ClearString() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 14)
	x.xxx_hidden_String_ = nil
}

func (x *Node) ClearBytes() {
	protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 15)
	x.xxx_hidden_Bytes = nil
}

type Node_builder struct {
	_ [0]func() // Prevents comparability and use of unkeyed literals for the builder.

	Nested   *Node
	Int32    *int32
	Int64    *int64
	Uint32   *uint32
	Uint64   *uint64
	Sint32   *int32
	Sint64   *int64
	Fixed32  *uint32
	Fixed64  *uint64
	Sfixed32 *int32
	Sfixed64 *int64
	Float    *float32
	Double   *float64
	Bool     *bool
	String   *string
	Bytes    []byte
}

func (b0 Node_builder) Build() *Node {
	m0 := &Node{}
	b, x := &b0, m0
	_, _ = b, x
	if b.Nested != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 16)
		x.xxx_hidden_Nested = b.Nested
	}
	if b.Int32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 16)
		x.xxx_hidden_Int32 = *b.Int32
	}
	if b.Int64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 16)
		x.xxx_hidden_Int64 = *b.Int64
	}
	if b.Uint32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 16)
		x.xxx_hidden_Uint32 = *b.Uint32
	}
	if b.Uint64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 16)
		x.xxx_hidden_Uint64 = *b.Uint64
	}
	if b.Sint32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 5, 16)
		x.xxx_hidden_Sint32 = *b.Sint32
	}
	if b.Sint64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 6, 16)
		x.xxx_hidden_Sint64 = *b.Sint64
	}
	if b.Fixed32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 7, 16)
		x.xxx_hidden_Fixed32 = *b.Fixed32
	}
	if b.Fixed64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 8, 16)
		x.xxx_hidden_Fixed64 = *b.Fixed64
	}
	if b.Sfixed32 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 9, 16)
		x.xxx_hidden_Sfixed32 = *b.Sfixed32
	}
	if b.Sfixed64 != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 10, 16)
		x.xxx_hidden_Sfixed64 = *b.Sfixed64
	}
	if b.Float != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 11, 16)
		x.xxx_hidden_Float = *b.Float
	}
	if b.Double != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 12, 16)
		x.xxx_hidden_Double = *b.Double
	}
	if b.Bool != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 13, 16)
		x.xxx_hidden_Bool = *b.Bool
	}
	if b.String != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 14, 16)
		x.xxx_hidden_String_ = b.String
	}
	if b.Bytes != nil {
		protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 15, 16)
		x.xxx_hidden_Bytes = b.Bytes
	}
	return m0
}

var File_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto protoreflect.FileDescriptor

var file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_rawDesc = string([]byte{
	0x0a, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x5f,
	0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x74, 0x72, 0x65, 0x65,
	0x2e, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x6f,
	0x70, 0x61, 0x71, 0x75, 0x65, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x1a,
	0x21, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x67, 0x6f, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xa2, 0x03, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x6e,
	0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70,
	0x61, 0x71, 0x75, 0x65, 0x2e, 0x6c, 0x61, 0x7a, 0x79, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x2e, 0x4e,
	0x6f, 0x64, 0x65, 0x42, 0x02, 0x28, 0x01, 0x52, 0x06, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12,
	0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
	0x69, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x16, 0x0a, 0x06, 0x75,
	0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x75, 0x69, 0x6e,
	0x74, 0x33, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x16, 0x0a, 0x06, 0x73,
	0x69, 0x6e, 0x74, 0x33, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x69, 0x6e,
	0x74, 0x33, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x06, 0x20,
	0x01, 0x28, 0x12, 0x52, 0x06, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, 0x07, 0x66,
	0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x07, 0x20, 0x01, 0x28, 0x07, 0x52, 0x07, 0x66, 0x69,
	0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34,
	0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x07, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12,
	0x1a, 0x0a, 0x08, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x18, 0x09, 0x20, 0x01, 0x28,
	0x0f, 0x52, 0x08, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x73,
	0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x10, 0x52, 0x08, 0x73,
	0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74,
	0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x16, 0x0a,
	0x06, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x64,
	0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x0d, 0x20,
	0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72,
	0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e,
	0x67, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0c,
	0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x42, 0x49, 0x5a, 0x3f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x61, 0x7a, 0x79, 0x2f, 0x6c,
	0x61, 0x7a, 0x79, 0x5f, 0x6f, 0x70, 0x61, 0x71, 0x75, 0x65, 0x92, 0x03, 0x05, 0xd2, 0x3e, 0x02,
	0x10, 0x03, 0x62, 0x08, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x70, 0xe8, 0x07,
})

var file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_goTypes = []any{
	(*Node)(nil), // 0: opaque.lazy_tree.Node
}
var file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_depIdxs = []int32{
	0, // 0: opaque.lazy_tree.Node.nested:type_name -> opaque.lazy_tree.Node
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_init() }
func file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_init() {
	if File_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_rawDesc), len(file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_depIdxs,
		MessageInfos:      file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_msgTypes,
	}.Build()
	File_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto = out.File
	file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_goTypes = nil
	file_internal_testprotos_lazy_lazy_opaque_lazy_tree_opaque_proto_depIdxs = nil
}
