diff --git a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
index f7bd25e..685bafa 100644
--- a/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
+++ b/cmd/protoc-gen-go-grpc/testdata/grpc/grpc.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Request struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Request) ProtoMessage() {}
 
 func (x *Request) ProtoReflect() protoreflect.Message {
-	return file_grpc_grpc_proto_msgTypes[0].MessageOf(x)
+	mi := &file_grpc_grpc_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Request) XXX_Methods() *protoiface.Methods {
+func (x *Request) XXX_Methods() *protoiface.Methods {
 	return file_grpc_grpc_proto_msgTypes[0].Methods()
 }
 
@@ -46,6 +55,7 @@
 }
 
 type Response struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -61,10 +71,18 @@
 func (*Response) ProtoMessage() {}
 
 func (x *Response) ProtoReflect() protoreflect.Message {
-	return file_grpc_grpc_proto_msgTypes[1].MessageOf(x)
+	mi := &file_grpc_grpc_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Response) XXX_Methods() *protoiface.Methods {
+func (x *Response) XXX_Methods() *protoiface.Methods {
 	return file_grpc_grpc_proto_msgTypes[1].Methods()
 }
 
@@ -149,8 +167,10 @@
 		file_grpc_grpc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Request); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -159,8 +179,10 @@
 		file_grpc_grpc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Response); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 219d79a..67f3071 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -48,10 +48,14 @@
 	// ExtensionRangeArray method for messages that support extensions.
 	generateExtensionRangeMethods = true
 
-	// generateWKTMarkerMethods specifes whether to generate
+	// generateWKTMarkerMethods specifies whether to generate
 	// XXX_WellKnownType methods on well-known types.
 	generateWKTMarkerMethods = false
 
+	// generateMessateStateFields specifies whether to generate an unexported
+	// protoimpl.MessageState as the first field.
+	generateMessateStateFields = true
+
 	// generateNoUnkeyedLiteralFields specifies whether to generate
 	// the XXX_NoUnkeyedLiteral field.
 	generateNoUnkeyedLiteralFields = false
@@ -395,6 +399,10 @@
 	g.Annotate(message.GoIdent.GoName, message.Location)
 	g.P("type ", message.GoIdent, " struct {")
 	sf := f.allMessageFieldsByPtr[message]
+	if generateMessateStateFields {
+		g.P("state ", protoimplPackage.Ident("MessageState"))
+		sf.append("state")
+	}
 	for _, field := range message.Fields {
 		if field.Oneof != nil {
 			// It would be a bit simpler to iterate over the oneofs below,
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index b7c5261..43099b2 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -293,12 +293,25 @@
 
 	// ProtoReflect method.
 	g.P("func (x *", message.GoIdent, ") ProtoReflect() ", protoreflectPackage.Ident("Message"), " {")
-	g.P("return ", typesVar, "[", idx, "].MessageOf(x)")
+	g.P("mi := &", typesVar, "[", idx, "]")
+	if generateMessateStateFields {
+		g.P("if ", protoimplPackage.Ident("UnsafeEnabled"), " && x != nil {")
+		g.P("ms := ", protoimplPackage.Ident("X"), ".MessageStateOf(", protoimplPackage.Ident("Pointer"), "(x))")
+		g.P("if ms.LoadMessageInfo() == nil {")
+		g.P("ms.StoreMessageInfo(mi)")
+		g.P("}")
+		g.P("return ms")
+		g.P("}")
+	}
+	g.P("return mi.MessageOf(x)")
 	g.P("}")
 	g.P()
-	g.P("func (m *", message.GoIdent, ") XXX_Methods() *", protoifacePackage.Ident("Methods"), " {")
+
+	// XXX_Methods method.
+	g.P("func (x *", message.GoIdent, ") XXX_Methods() *", protoifacePackage.Ident("Methods"), " {")
 	g.P("return ", typesVar, "[", idx, "].Methods()")
 	g.P("}")
+	g.P()
 }
 
 func fileVarName(f *protogen.File, suffix string) string {
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index da6e752..895886f 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -66,6 +66,7 @@
 }
 
 type AnnotationsTestMessage struct {
+	state                protoimpl.MessageState
 	AnnotationsTestField *string `protobuf:"bytes,1,opt,name=AnnotationsTestField" json:"AnnotationsTestField,omitempty"`
 	sizeCache            protoimpl.SizeCache
 	unknownFields        protoimpl.UnknownFields
@@ -82,10 +83,18 @@
 func (*AnnotationsTestMessage) ProtoMessage() {}
 
 func (x *AnnotationsTestMessage) ProtoReflect() protoreflect.Message {
-	return file_annotations_annotations_proto_msgTypes[0].MessageOf(x)
+	mi := &file_annotations_annotations_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *AnnotationsTestMessage) XXX_Methods() *protoiface.Methods {
+func (x *AnnotationsTestMessage) XXX_Methods() *protoiface.Methods {
 	return file_annotations_annotations_proto_msgTypes[0].Methods()
 }
 
@@ -157,9 +166,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_annotations_annotations_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*AnnotationsTestMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
index 6450f14..4debc0d 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
@@ -1 +1 @@
-annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:631 end:650} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:667 end:714} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1821 end:1843} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1854 end:1874} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2796 end:2819}
\ No newline at end of file
+annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:631 end:650} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:667 end:714} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1821 end:1843} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1899 end:1919} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:3032 end:3055}
\ No newline at end of file
diff --git a/cmd/protoc-gen-go/testdata/comments/comments.pb.go b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
index ae1e989..b01afe9 100644
--- a/cmd/protoc-gen-go/testdata/comments/comments.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/comments.pb.go
@@ -21,6 +21,7 @@
 
 // COMMENT: Message1
 type Message1 struct {
+	state protoimpl.MessageState
 	// COMMENT: Field1A
 	Field1A *string `protobuf:"bytes,1,opt,name=Field1A" json:"Field1A,omitempty"`
 	// COMMENT: Oneof1A
@@ -44,10 +45,18 @@
 func (*Message1) ProtoMessage() {}
 
 func (x *Message1) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[0].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1) XXX_Methods() *protoiface.Methods {
+func (x *Message1) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[0].Methods()
 }
 
@@ -89,6 +98,7 @@
 
 // COMMENT: Message2
 type Message2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -104,10 +114,18 @@
 func (*Message2) ProtoMessage() {}
 
 func (x *Message2) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[1].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2) XXX_Methods() *protoiface.Methods {
+func (x *Message2) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[1].Methods()
 }
 
@@ -118,6 +136,7 @@
 
 // COMMENT: Message1A
 type Message1_Message1A struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -133,10 +152,18 @@
 func (*Message1_Message1A) ProtoMessage() {}
 
 func (x *Message1_Message1A) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[2].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1_Message1A) XXX_Methods() *protoiface.Methods {
+func (x *Message1_Message1A) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[2].Methods()
 }
 
@@ -147,6 +174,7 @@
 
 // COMMENT: Message1B
 type Message1_Message1B struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -162,10 +190,18 @@
 func (*Message1_Message1B) ProtoMessage() {}
 
 func (x *Message1_Message1B) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[3].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1_Message1B) XXX_Methods() *protoiface.Methods {
+func (x *Message1_Message1B) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[3].Methods()
 }
 
@@ -176,6 +212,7 @@
 
 // COMMENT: Message2A
 type Message2_Message2A struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -191,10 +228,18 @@
 func (*Message2_Message2A) ProtoMessage() {}
 
 func (x *Message2_Message2A) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[4].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2_Message2A) XXX_Methods() *protoiface.Methods {
+func (x *Message2_Message2A) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[4].Methods()
 }
 
@@ -205,6 +250,7 @@
 
 // COMMENT: Message2B
 type Message2_Message2B struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -220,10 +266,18 @@
 func (*Message2_Message2B) ProtoMessage() {}
 
 func (x *Message2_Message2B) ProtoReflect() protoreflect.Message {
-	return file_comments_comments_proto_msgTypes[5].MessageOf(x)
+	mi := &file_comments_comments_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2_Message2B) XXX_Methods() *protoiface.Methods {
+func (x *Message2_Message2B) XXX_Methods() *protoiface.Methods {
 	return file_comments_comments_proto_msgTypes[5].Methods()
 }
 
@@ -291,9 +345,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_comments_comments_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -302,8 +358,10 @@
 		file_comments_comments_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -312,8 +370,10 @@
 		file_comments_comments_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1_Message1A); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -322,8 +382,10 @@
 		file_comments_comments_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1_Message1B); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -332,8 +394,10 @@
 		file_comments_comments_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2_Message2A); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -342,8 +406,10 @@
 		file_comments_comments_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2_Message2B); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
index b0d7ce9..0cb5754 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -56,6 +56,7 @@
 
 // Deprecated: Do not use.
 type DeprecatedMessage struct {
+	state           protoimpl.MessageState
 	DeprecatedField string `protobuf:"bytes,1,opt,name=deprecated_field,json=deprecatedField,proto3" json:"deprecated_field,omitempty"` // Deprecated: Do not use.
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
@@ -72,10 +73,18 @@
 func (*DeprecatedMessage) ProtoMessage() {}
 
 func (x *DeprecatedMessage) ProtoReflect() protoreflect.Message {
-	return file_comments_deprecated_proto_msgTypes[0].MessageOf(x)
+	mi := &file_comments_deprecated_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *DeprecatedMessage) XXX_Methods() *protoiface.Methods {
+func (x *DeprecatedMessage) XXX_Methods() *protoiface.Methods {
 	return file_comments_deprecated_proto_msgTypes[0].Methods()
 }
 
@@ -147,9 +156,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_comments_deprecated_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DeprecatedMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
index dde0588..dc14c4c 100644
--- a/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/base/base.pb.go
@@ -18,6 +18,7 @@
 )
 
 type BaseMessage struct {
+	state           protoimpl.MessageState
 	Field           *string `protobuf:"bytes,1,opt,name=field" json:"field,omitempty"`
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
@@ -35,10 +36,18 @@
 func (*BaseMessage) ProtoMessage() {}
 
 func (x *BaseMessage) ProtoReflect() protoreflect.Message {
-	return file_extensions_base_base_proto_msgTypes[0].MessageOf(x)
+	mi := &file_extensions_base_base_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *BaseMessage) XXX_Methods() *protoiface.Methods {
+func (x *BaseMessage) XXX_Methods() *protoiface.Methods {
 	return file_extensions_base_base_proto_msgTypes[0].Methods()
 }
 
@@ -65,6 +74,7 @@
 }
 
 type MessageSetWireFormatMessage struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -81,10 +91,18 @@
 func (*MessageSetWireFormatMessage) ProtoMessage() {}
 
 func (x *MessageSetWireFormatMessage) ProtoReflect() protoreflect.Message {
-	return file_extensions_base_base_proto_msgTypes[1].MessageOf(x)
+	mi := &file_extensions_base_base_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MessageSetWireFormatMessage) XXX_Methods() *protoiface.Methods {
+func (x *MessageSetWireFormatMessage) XXX_Methods() *protoiface.Methods {
 	return file_extensions_base_base_proto_msgTypes[1].Methods()
 }
 
@@ -155,11 +173,13 @@
 	if !protoimpl.UnsafeEnabled {
 		file_extensions_base_base_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BaseMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 3:
+				return &v.unknownFields
+			case 4:
 				return &v.extensionFields
 			default:
 				return nil
@@ -168,10 +188,12 @@
 		file_extensions_base_base_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSetWireFormatMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
index b989089..9a6167d 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -68,6 +68,7 @@
 }
 
 type Message struct {
+	state         protoimpl.MessageState
 	Data          []byte `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -84,10 +85,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[0].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[0].Methods()
 }
 
@@ -104,6 +113,7 @@
 }
 
 type ExtensionGroup struct {
+	state          protoimpl.MessageState
 	ExtensionGroup *string `protobuf:"bytes,120,opt,name=extension_group,json=extensionGroup" json:"extension_group,omitempty"`
 	sizeCache      protoimpl.SizeCache
 	unknownFields  protoimpl.UnknownFields
@@ -120,10 +130,18 @@
 func (*ExtensionGroup) ProtoMessage() {}
 
 func (x *ExtensionGroup) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[1].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtensionGroup) XXX_Methods() *protoiface.Methods {
+func (x *ExtensionGroup) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[1].Methods()
 }
 
@@ -141,6 +159,7 @@
 
 // Extend in the scope of another type.
 type ExtendingMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -156,10 +175,18 @@
 func (*ExtendingMessage) ProtoMessage() {}
 
 func (x *ExtendingMessage) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[2].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtendingMessage) XXX_Methods() *protoiface.Methods {
+func (x *ExtendingMessage) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[2].Methods()
 }
 
@@ -169,6 +196,7 @@
 }
 
 type RepeatedGroup struct {
+	state          protoimpl.MessageState
 	RepeatedXGroup []string `protobuf:"bytes,319,rep,name=repeated_x_group,json=repeatedXGroup" json:"repeated_x_group,omitempty"`
 	sizeCache      protoimpl.SizeCache
 	unknownFields  protoimpl.UnknownFields
@@ -185,10 +213,18 @@
 func (*RepeatedGroup) ProtoMessage() {}
 
 func (x *RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[3].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[3].Methods()
 }
 
@@ -206,6 +242,7 @@
 
 // An extension of an extension.
 type Extendable struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -222,10 +259,18 @@
 func (*Extendable) ProtoMessage() {}
 
 func (x *Extendable) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[4].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Extendable) XXX_Methods() *protoiface.Methods {
+func (x *Extendable) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[4].Methods()
 }
 
@@ -245,6 +290,7 @@
 
 // Message set wire format.
 type MessageSetWireFormatExtension struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -260,10 +306,18 @@
 func (*MessageSetWireFormatExtension) ProtoMessage() {}
 
 func (x *MessageSetWireFormatExtension) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[5].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MessageSetWireFormatExtension) XXX_Methods() *protoiface.Methods {
+func (x *MessageSetWireFormatExtension) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[5].Methods()
 }
 
@@ -273,6 +327,7 @@
 }
 
 type Message_M struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -288,10 +343,18 @@
 func (*Message_M) ProtoMessage() {}
 
 func (x *Message_M) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[6].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message_M) XXX_Methods() *protoiface.Methods {
+func (x *Message_M) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[6].Methods()
 }
 
@@ -301,6 +364,7 @@
 }
 
 type ExtendingMessage_ExtendingMessageSubmessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -316,10 +380,18 @@
 func (*ExtendingMessage_ExtendingMessageSubmessage) ProtoMessage() {}
 
 func (x *ExtendingMessage_ExtendingMessageSubmessage) ProtoReflect() protoreflect.Message {
-	return file_extensions_ext_ext_proto_msgTypes[7].MessageOf(x)
+	mi := &file_extensions_ext_ext_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtendingMessage_ExtendingMessageSubmessage) XXX_Methods() *protoiface.Methods {
+func (x *ExtendingMessage_ExtendingMessageSubmessage) XXX_Methods() *protoiface.Methods {
 	return file_extensions_ext_ext_proto_msgTypes[7].Methods()
 }
 
@@ -1233,9 +1305,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_extensions_ext_ext_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1243,9 +1317,11 @@
 		}
 		file_extensions_ext_ext_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtensionGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1254,8 +1330,10 @@
 		file_extensions_ext_ext_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtendingMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1263,9 +1341,11 @@
 		}
 		file_extensions_ext_ext_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1274,10 +1354,12 @@
 		file_extensions_ext_ext_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Extendable); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -1286,8 +1368,10 @@
 		file_extensions_ext_ext_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSetWireFormatExtension); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1296,8 +1380,10 @@
 		file_extensions_ext_ext_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message_M); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1306,8 +1392,10 @@
 		file_extensions_ext_ext_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtendingMessage_ExtendingMessageSubmessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
index 639b0ab..04468fb 100644
--- a/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/extra/extra.pb.go
@@ -18,6 +18,7 @@
 )
 
 type ExtraMessage struct {
+	state         protoimpl.MessageState
 	Data          []byte `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -34,10 +35,18 @@
 func (*ExtraMessage) ProtoMessage() {}
 
 func (x *ExtraMessage) ProtoReflect() protoreflect.Message {
-	return file_extensions_extra_extra_proto_msgTypes[0].MessageOf(x)
+	mi := &file_extensions_extra_extra_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtraMessage) XXX_Methods() *protoiface.Methods {
+func (x *ExtraMessage) XXX_Methods() *protoiface.Methods {
 	return file_extensions_extra_extra_proto_msgTypes[0].Methods()
 }
 
@@ -101,9 +110,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_extensions_extra_extra_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtraMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index d8ec9d7..df5e65b 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -57,6 +57,7 @@
 }
 
 type Message struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -72,10 +73,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_extensions_proto3_ext3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_extensions_proto3_ext3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_extensions_proto3_ext3_proto_msgTypes[0].Methods()
 }
 
@@ -745,8 +754,10 @@
 		file_extensions_proto3_ext3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
index 1aa62b7..52fc8f5 100644
--- a/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
+++ b/cmd/protoc-gen-go/testdata/fieldnames/fieldnames.pb.go
@@ -23,6 +23,7 @@
 // This exists to demonstrate the current behavior and catch unintended
 // changes in it.
 type Message struct {
+	state protoimpl.MessageState
 	// Various CamelCase conversions.
 	FieldOne   *string `protobuf:"bytes,1,opt,name=field_one,json=fieldOne" json:"field_one,omitempty"`
 	FieldTwo   *string `protobuf:"bytes,2,opt,name=FieldTwo" json:"FieldTwo,omitempty"`
@@ -72,10 +73,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_fieldnames_fieldnames_proto_msgTypes[0].MessageOf(x)
+	mi := &file_fieldnames_fieldnames_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_fieldnames_fieldnames_proto_msgTypes[0].Methods()
 }
 
@@ -268,6 +277,7 @@
 func (*Message_OneofMessageConflict_) isMessage_OneofConflictC() {}
 
 type Message_OneofMessageConflict struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -283,10 +293,18 @@
 func (*Message_OneofMessageConflict) ProtoMessage() {}
 
 func (x *Message_OneofMessageConflict) ProtoReflect() protoreflect.Message {
-	return file_fieldnames_fieldnames_proto_msgTypes[1].MessageOf(x)
+	mi := &file_fieldnames_fieldnames_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message_OneofMessageConflict) XXX_Methods() *protoiface.Methods {
+func (x *Message_OneofMessageConflict) XXX_Methods() *protoiface.Methods {
 	return file_fieldnames_fieldnames_proto_msgTypes[1].Methods()
 }
 
@@ -385,9 +403,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_fieldnames_fieldnames_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
-			case 17:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 18:
+				return &v.sizeCache
+			case 19:
 				return &v.unknownFields
 			default:
 				return nil
@@ -396,8 +416,10 @@
 		file_fieldnames_fieldnames_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message_OneofMessageConflict); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
index 89e81e4..28f50ba 100644
--- a/cmd/protoc-gen-go/testdata/import_public/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/a.pb.go
@@ -57,6 +57,7 @@
 var E_ExtensionField = sub.E_ExtensionField
 
 type Public struct {
+	state         protoimpl.MessageState
 	M             *sub.M `protobuf:"bytes,1,opt,name=m" json:"m,omitempty"`
 	E             *sub.E `protobuf:"varint,2,opt,name=e,enum=goproto.protoc.import_public.sub.E" json:"e,omitempty"`
 	Local         *Local `protobuf:"bytes,3,opt,name=local" json:"local,omitempty"`
@@ -75,10 +76,18 @@
 func (*Public) ProtoMessage() {}
 
 func (x *Public) ProtoReflect() protoreflect.Message {
-	return file_import_public_a_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_a_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Public) XXX_Methods() *protoiface.Methods {
+func (x *Public) XXX_Methods() *protoiface.Methods {
 	return file_import_public_a_proto_msgTypes[0].Methods()
 }
 
@@ -174,9 +183,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_import_public_a_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Public); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
index 1cc48ea..2b26113 100644
--- a/cmd/protoc-gen-go/testdata/import_public/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/b.pb.go
@@ -19,6 +19,7 @@
 )
 
 type Local struct {
+	state         protoimpl.MessageState
 	M             *sub.M `protobuf:"bytes,1,opt,name=m" json:"m,omitempty"`
 	E             *sub.E `protobuf:"varint,2,opt,name=e,enum=goproto.protoc.import_public.sub.E" json:"e,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -36,10 +37,18 @@
 func (*Local) ProtoMessage() {}
 
 func (x *Local) ProtoReflect() protoreflect.Message {
-	return file_import_public_b_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_b_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Local) XXX_Methods() *protoiface.Methods {
+func (x *Local) XXX_Methods() *protoiface.Methods {
 	return file_import_public_b_proto_msgTypes[0].Methods()
 }
 
@@ -120,9 +129,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_import_public_b_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Local); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/c.pb.go b/cmd/protoc-gen-go/testdata/import_public/c.pb.go
index f863ac5..5c2b346 100644
--- a/cmd/protoc-gen-go/testdata/import_public/c.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/c.pb.go
@@ -19,6 +19,7 @@
 )
 
 type UsingPublicImport struct {
+	state protoimpl.MessageState
 	// Local is declared in b.proto, which is a public import of a.proto.
 	Local *Local `protobuf:"bytes,1,opt,name=local" json:"local,omitempty"`
 	// Sub2Message is declared in sub2/a.proto, which is a public import of
@@ -39,10 +40,18 @@
 func (*UsingPublicImport) ProtoMessage() {}
 
 func (x *UsingPublicImport) ProtoReflect() protoreflect.Message {
-	return file_import_public_c_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_c_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UsingPublicImport) XXX_Methods() *protoiface.Methods {
+func (x *UsingPublicImport) XXX_Methods() *protoiface.Methods {
 	return file_import_public_c_proto_msgTypes[0].Methods()
 }
 
@@ -126,9 +135,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_import_public_c_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UsingPublicImport); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
index f4e3a63..49bc41e 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
@@ -166,6 +166,7 @@
 }
 
 type M struct {
+	state protoimpl.MessageState
 	// Field using a type in the same Go package, but a different source file.
 	M2 *M2      `protobuf:"bytes,1,opt,name=m2" json:"m2,omitempty"`
 	S  *string  `protobuf:"bytes,4,opt,name=s,def=default" json:"s,omitempty"`
@@ -191,10 +192,18 @@
 func (*M) ProtoMessage() {}
 
 func (x *M) ProtoReflect() protoreflect.Message {
-	return file_import_public_sub_a_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_sub_a_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M) XXX_Methods() *protoiface.Methods {
+func (x *M) XXX_Methods() *protoiface.Methods {
 	return file_import_public_sub_a_proto_msgTypes[0].Methods()
 }
 
@@ -283,6 +292,7 @@
 func (*M_OneofInt64) isM_OneofField() {}
 
 type M_Submessage struct {
+	state protoimpl.MessageState
 	// Types that are valid to be assigned to SubmessageOneofField:
 	//	*M_Submessage_SubmessageOneofInt32
 	//	*M_Submessage_SubmessageOneofInt64
@@ -302,10 +312,18 @@
 func (*M_Submessage) ProtoMessage() {}
 
 func (x *M_Submessage) ProtoReflect() protoreflect.Message {
-	return file_import_public_sub_a_proto_msgTypes[1].MessageOf(x)
+	mi := &file_import_public_sub_a_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M_Submessage) XXX_Methods() *protoiface.Methods {
+func (x *M_Submessage) XXX_Methods() *protoiface.Methods {
 	return file_import_public_sub_a_proto_msgTypes[1].Methods()
 }
 
@@ -457,11 +475,13 @@
 	if !protoimpl.UnsafeEnabled {
 		file_import_public_sub_a_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 7:
+				return &v.unknownFields
+			case 8:
 				return &v.extensionFields
 			default:
 				return nil
@@ -469,9 +489,11 @@
 		}
 		file_import_public_sub_a_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M_Submessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
index 33c51fe..32d6473 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/b.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M2) ProtoMessage() {}
 
 func (x *M2) ProtoReflect() protoreflect.Message {
-	return file_import_public_sub_b_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_sub_b_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M2) XXX_Methods() *protoiface.Methods {
+func (x *M2) XXX_Methods() *protoiface.Methods {
 	return file_import_public_sub_b_proto_msgTypes[0].Methods()
 }
 
@@ -92,8 +101,10 @@
 		file_import_public_sub_b_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
index d5f6c72..ef605ea 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub2/a.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Sub2Message struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Sub2Message) ProtoMessage() {}
 
 func (x *Sub2Message) ProtoReflect() protoreflect.Message {
-	return file_import_public_sub2_a_proto_msgTypes[0].MessageOf(x)
+	mi := &file_import_public_sub2_a_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Sub2Message) XXX_Methods() *protoiface.Methods {
+func (x *Sub2Message) XXX_Methods() *protoiface.Methods {
 	return file_import_public_sub2_a_proto_msgTypes[0].Methods()
 }
 
@@ -93,8 +102,10 @@
 		file_import_public_sub2_a_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Sub2Message); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
index 9acc5d0..dc7568b 100644
--- a/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/fmt/m.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M) ProtoMessage() {}
 
 func (x *M) ProtoReflect() protoreflect.Message {
-	return file_imports_fmt_m_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_fmt_m_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M) XXX_Methods() *protoiface.Methods {
+func (x *M) XXX_Methods() *protoiface.Methods {
 	return file_imports_fmt_m_proto_msgTypes[0].Methods()
 }
 
@@ -90,8 +99,10 @@
 		file_imports_fmt_m_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
index 20dbd48..52d5391 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
@@ -56,6 +56,7 @@
 }
 
 type M1 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -71,10 +72,18 @@
 func (*M1) ProtoMessage() {}
 
 func (x *M1) ProtoReflect() protoreflect.Message {
-	return file_imports_test_a_1_m1_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_a_1_m1_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M1) XXX_Methods() *protoiface.Methods {
+func (x *M1) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_a_1_m1_proto_msgTypes[0].Methods()
 }
 
@@ -84,6 +93,7 @@
 }
 
 type M1_1 struct {
+	state         protoimpl.MessageState
 	M1            *M1 `protobuf:"bytes,1,opt,name=m1,proto3" json:"m1,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -100,10 +110,18 @@
 func (*M1_1) ProtoMessage() {}
 
 func (x *M1_1) ProtoReflect() protoreflect.Message {
-	return file_imports_test_a_1_m1_proto_msgTypes[1].MessageOf(x)
+	mi := &file_imports_test_a_1_m1_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M1_1) XXX_Methods() *protoiface.Methods {
+func (x *M1_1) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_a_1_m1_proto_msgTypes[1].Methods()
 }
 
@@ -173,8 +191,10 @@
 		file_imports_test_a_1_m1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M1); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -182,9 +202,11 @@
 		}
 		file_imports_test_a_1_m1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M1_1); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
index ed81393..0433505 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M2) ProtoMessage() {}
 
 func (x *M2) ProtoReflect() protoreflect.Message {
-	return file_imports_test_a_1_m2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_a_1_m2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M2) XXX_Methods() *protoiface.Methods {
+func (x *M2) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_a_1_m2_proto_msgTypes[0].Methods()
 }
 
@@ -91,8 +100,10 @@
 		file_imports_test_a_1_m2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
index 2365425..6121ed4 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m3.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M3 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M3) ProtoMessage() {}
 
 func (x *M3) ProtoReflect() protoreflect.Message {
-	return file_imports_test_a_2_m3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_a_2_m3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M3) XXX_Methods() *protoiface.Methods {
+func (x *M3) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_a_2_m3_proto_msgTypes[0].Methods()
 }
 
@@ -91,8 +100,10 @@
 		file_imports_test_a_2_m3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M3); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
index 356427b..eda832a 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_2/m4.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M4 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M4) ProtoMessage() {}
 
 func (x *M4) ProtoReflect() protoreflect.Message {
-	return file_imports_test_a_2_m4_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_a_2_m4_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M4) XXX_Methods() *protoiface.Methods {
+func (x *M4) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_a_2_m4_proto_msgTypes[0].Methods()
 }
 
@@ -91,8 +100,10 @@
 		file_imports_test_a_2_m4_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M4); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
index f8485df..3a4677e 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m1.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M1 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M1) ProtoMessage() {}
 
 func (x *M1) ProtoReflect() protoreflect.Message {
-	return file_imports_test_b_1_m1_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_b_1_m1_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M1) XXX_Methods() *protoiface.Methods {
+func (x *M1) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_b_1_m1_proto_msgTypes[0].Methods()
 }
 
@@ -92,8 +101,10 @@
 		file_imports_test_b_1_m1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M1); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
index 0c4a73c..c2558c9 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_b_1/m2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type M2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*M2) ProtoMessage() {}
 
 func (x *M2) ProtoReflect() protoreflect.Message {
-	return file_imports_test_b_1_m2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_b_1_m2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *M2) XXX_Methods() *protoiface.Methods {
+func (x *M2) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_b_1_m2_proto_msgTypes[0].Methods()
 }
 
@@ -92,8 +101,10 @@
 		file_imports_test_b_1_m2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*M2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
index 8d790d3..c310d52 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m1.pb.go
@@ -19,6 +19,7 @@
 )
 
 type A1M1 struct {
+	state         protoimpl.MessageState
 	F             *test_a_1.M1 `protobuf:"bytes,1,opt,name=f,proto3" json:"f,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -35,10 +36,18 @@
 func (*A1M1) ProtoMessage() {}
 
 func (x *A1M1) ProtoReflect() protoreflect.Message {
-	return file_imports_test_import_a1m1_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_import_a1m1_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *A1M1) XXX_Methods() *protoiface.Methods {
+func (x *A1M1) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_import_a1m1_proto_msgTypes[0].Methods()
 }
 
@@ -104,9 +113,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_imports_test_import_a1m1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*A1M1); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
index 0483904..c07111b 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_a1m2.pb.go
@@ -19,6 +19,7 @@
 )
 
 type A1M2 struct {
+	state         protoimpl.MessageState
 	F             *test_a_1.M2 `protobuf:"bytes,1,opt,name=f,proto3" json:"f,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -35,10 +36,18 @@
 func (*A1M2) ProtoMessage() {}
 
 func (x *A1M2) ProtoReflect() protoreflect.Message {
-	return file_imports_test_import_a1m2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_import_a1m2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *A1M2) XXX_Methods() *protoiface.Methods {
+func (x *A1M2) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_import_a1m2_proto_msgTypes[0].Methods()
 }
 
@@ -104,9 +113,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_imports_test_import_a1m2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*A1M2); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
index 0475375..a872359 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_import_all.pb.go
@@ -22,6 +22,7 @@
 )
 
 type All struct {
+	state         protoimpl.MessageState
 	Am1           *test_a_1.M1 `protobuf:"bytes,1,opt,name=am1,proto3" json:"am1,omitempty"`
 	Am2           *test_a_1.M2 `protobuf:"bytes,2,opt,name=am2,proto3" json:"am2,omitempty"`
 	Bm1           *test_b_1.M1 `protobuf:"bytes,5,opt,name=bm1,proto3" json:"bm1,omitempty"`
@@ -42,10 +43,18 @@
 func (*All) ProtoMessage() {}
 
 func (x *All) ProtoReflect() protoreflect.Message {
-	return file_imports_test_import_all_proto_msgTypes[0].MessageOf(x)
+	mi := &file_imports_test_import_all_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *All) XXX_Methods() *protoiface.Methods {
+func (x *All) XXX_Methods() *protoiface.Methods {
 	return file_imports_test_import_all_proto_msgTypes[0].Methods()
 }
 
@@ -165,9 +174,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_imports_test_import_all_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*All); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go b/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
index 5d9bd7d..47a2f03 100644
--- a/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
+++ b/cmd/protoc-gen-go/testdata/issue780_oneof_conflict/test.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Foo struct {
+	state protoimpl.MessageState
 	// Types that are valid to be assigned to Bar:
 	//	*Foo_GetBar
 	Bar           isFoo_Bar `protobuf_oneof:"bar"`
@@ -36,10 +37,18 @@
 func (*Foo) ProtoMessage() {}
 
 func (x *Foo) ProtoReflect() protoreflect.Message {
-	return file_issue780_oneof_conflict_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_issue780_oneof_conflict_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Foo) XXX_Methods() *protoiface.Methods {
+func (x *Foo) XXX_Methods() *protoiface.Methods {
 	return file_issue780_oneof_conflict_test_proto_msgTypes[0].Methods()
 }
 
@@ -115,9 +124,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_issue780_oneof_conflict_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Foo); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
index 0026f3e..c1fb2a0 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -66,6 +66,7 @@
 }
 
 type Message struct {
+	state         protoimpl.MessageState
 	StringField   *string `protobuf:"bytes,1,opt,name=string_field,json=stringField" json:"string_field,omitempty"`
 	EnumField     *Enum   `protobuf:"varint,2,opt,name=enum_field,json=enumField,enum=Enum,def=0" json:"enum_field,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -83,10 +84,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_nopackage_nopackage_proto_msgTypes[0].MessageOf(x)
+	mi := &file_nopackage_nopackage_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_nopackage_nopackage_proto_msgTypes[0].Methods()
 }
 
@@ -160,9 +169,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_nopackage_nopackage_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
index 8f92f17..8df45bc 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -314,6 +314,7 @@
 }
 
 type EnumContainerMessage1 struct {
+	state             protoimpl.MessageState
 	DefaultDuplicate1 *EnumType2 `protobuf:"varint,1,opt,name=default_duplicate1,json=defaultDuplicate1,enum=goproto.protoc.proto2.EnumType2,def=1" json:"default_duplicate1,omitempty"`
 	DefaultDuplicate2 *EnumType2 `protobuf:"varint,2,opt,name=default_duplicate2,json=defaultDuplicate2,enum=goproto.protoc.proto2.EnumType2,def=1" json:"default_duplicate2,omitempty"`
 	sizeCache         protoimpl.SizeCache
@@ -331,10 +332,18 @@
 func (*EnumContainerMessage1) ProtoMessage() {}
 
 func (x *EnumContainerMessage1) ProtoReflect() protoreflect.Message {
-	return file_proto2_enum_proto_msgTypes[0].MessageOf(x)
+	mi := &file_proto2_enum_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumContainerMessage1) XXX_Methods() *protoiface.Methods {
+func (x *EnumContainerMessage1) XXX_Methods() *protoiface.Methods {
 	return file_proto2_enum_proto_msgTypes[0].Methods()
 }
 
@@ -361,6 +370,7 @@
 }
 
 type EnumContainerMessage1_EnumContainerMessage2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -376,10 +386,18 @@
 func (*EnumContainerMessage1_EnumContainerMessage2) ProtoMessage() {}
 
 func (x *EnumContainerMessage1_EnumContainerMessage2) ProtoReflect() protoreflect.Message {
-	return file_proto2_enum_proto_msgTypes[1].MessageOf(x)
+	mi := &file_proto2_enum_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumContainerMessage1_EnumContainerMessage2) XXX_Methods() *protoiface.Methods {
+func (x *EnumContainerMessage1_EnumContainerMessage2) XXX_Methods() *protoiface.Methods {
 	return file_proto2_enum_proto_msgTypes[1].Methods()
 }
 
@@ -474,9 +492,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_proto2_enum_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumContainerMessage1); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -485,8 +505,10 @@
 		file_proto2_enum_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumContainerMessage1_EnumContainerMessage2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index 054e264..794e33e 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -70,6 +70,7 @@
 }
 
 type FieldTestMessage struct {
+	state               protoimpl.MessageState
 	OptionalBool        *bool                                `protobuf:"varint,1,opt,name=optional_bool,json=optionalBool" json:"optional_bool,omitempty"`
 	OptionalEnum        *FieldTestMessage_Enum               `protobuf:"varint,2,opt,name=optional_enum,json=optionalEnum,enum=goproto.protoc.proto2.FieldTestMessage_Enum" json:"optional_enum,omitempty"`
 	OptionalInt32       *int32                               `protobuf:"varint,3,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"`
@@ -191,10 +192,18 @@
 func (*FieldTestMessage) ProtoMessage() {}
 
 func (x *FieldTestMessage) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[0].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[0].Methods()
 }
 
@@ -1094,6 +1103,7 @@
 func (*FieldTestMessage_OneofTwo_2) isFieldTestMessage_OneofTwo() {}
 
 type FieldTestMessage_OptionalGroup struct {
+	state         protoimpl.MessageState
 	OptionalGroup *string `protobuf:"bytes,19,opt,name=optional_group,json=optionalGroup" json:"optional_group,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1110,10 +1120,18 @@
 func (*FieldTestMessage_OptionalGroup) ProtoMessage() {}
 
 func (x *FieldTestMessage_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[1].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_OptionalGroup) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_OptionalGroup) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[1].Methods()
 }
 
@@ -1130,6 +1148,7 @@
 }
 
 type FieldTestMessage_RequiredGroup struct {
+	state         protoimpl.MessageState
 	RequiredGroup *string `protobuf:"bytes,119,req,name=required_group,json=requiredGroup" json:"required_group,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1146,10 +1165,18 @@
 func (*FieldTestMessage_RequiredGroup) ProtoMessage() {}
 
 func (x *FieldTestMessage_RequiredGroup) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[2].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_RequiredGroup) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_RequiredGroup) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[2].Methods()
 }
 
@@ -1166,6 +1193,7 @@
 }
 
 type FieldTestMessage_RepeatedGroup struct {
+	state         protoimpl.MessageState
 	RepeatedGroup []string `protobuf:"bytes,219,rep,name=repeated_group,json=repeatedGroup" json:"repeated_group,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1182,10 +1210,18 @@
 func (*FieldTestMessage_RepeatedGroup) ProtoMessage() {}
 
 func (x *FieldTestMessage_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[3].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[3].Methods()
 }
 
@@ -1202,6 +1238,7 @@
 }
 
 type FieldTestMessage_OneofGroup struct {
+	state           protoimpl.MessageState
 	OneofGroupField *string `protobuf:"bytes,619,opt,name=oneof_group_field,json=oneofGroupField" json:"oneof_group_field,omitempty"`
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
@@ -1218,10 +1255,18 @@
 func (*FieldTestMessage_OneofGroup) ProtoMessage() {}
 
 func (x *FieldTestMessage_OneofGroup) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[7].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_OneofGroup) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_OneofGroup) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[7].Methods()
 }
 
@@ -1238,6 +1283,7 @@
 }
 
 type FieldTestMessage_Message struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1253,10 +1299,18 @@
 func (*FieldTestMessage_Message) ProtoMessage() {}
 
 func (x *FieldTestMessage_Message) ProtoReflect() protoreflect.Message {
-	return file_proto2_fields_proto_msgTypes[8].MessageOf(x)
+	mi := &file_proto2_fields_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_Message) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_Message) XXX_Methods() *protoiface.Methods {
 	return file_proto2_fields_proto_msgTypes[8].Methods()
 }
 
@@ -1700,9 +1754,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_proto2_fields_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage); i {
-			case 83:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 84:
+				return &v.sizeCache
+			case 85:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1710,9 +1766,11 @@
 		}
 		file_proto2_fields_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_OptionalGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1720,9 +1778,11 @@
 		}
 		file_proto2_fields_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_RequiredGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1730,9 +1790,11 @@
 		}
 		file_proto2_fields_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1740,9 +1802,11 @@
 		}
 		file_proto2_fields_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_OneofGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1751,8 +1815,10 @@
 		file_proto2_fields_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_Message); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
index 8d2b452..fe60801 100644
--- a/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/nested_messages.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Layer1 struct {
+	state         protoimpl.MessageState
 	L2            *Layer1_Layer2        `protobuf:"bytes,1,opt,name=l2" json:"l2,omitempty"`
 	L3            *Layer1_Layer2_Layer3 `protobuf:"bytes,2,opt,name=l3" json:"l3,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -35,10 +36,18 @@
 func (*Layer1) ProtoMessage() {}
 
 func (x *Layer1) ProtoReflect() protoreflect.Message {
-	return file_proto2_nested_messages_proto_msgTypes[0].MessageOf(x)
+	mi := &file_proto2_nested_messages_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Layer1) XXX_Methods() *protoiface.Methods {
+func (x *Layer1) XXX_Methods() *protoiface.Methods {
 	return file_proto2_nested_messages_proto_msgTypes[0].Methods()
 }
 
@@ -62,6 +71,7 @@
 }
 
 type Layer1_Layer2 struct {
+	state         protoimpl.MessageState
 	L3            *Layer1_Layer2_Layer3 `protobuf:"bytes,1,opt,name=l3" json:"l3,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -78,10 +88,18 @@
 func (*Layer1_Layer2) ProtoMessage() {}
 
 func (x *Layer1_Layer2) ProtoReflect() protoreflect.Message {
-	return file_proto2_nested_messages_proto_msgTypes[1].MessageOf(x)
+	mi := &file_proto2_nested_messages_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Layer1_Layer2) XXX_Methods() *protoiface.Methods {
+func (x *Layer1_Layer2) XXX_Methods() *protoiface.Methods {
 	return file_proto2_nested_messages_proto_msgTypes[1].Methods()
 }
 
@@ -98,6 +116,7 @@
 }
 
 type Layer1_Layer2_Layer3 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -113,10 +132,18 @@
 func (*Layer1_Layer2_Layer3) ProtoMessage() {}
 
 func (x *Layer1_Layer2_Layer3) ProtoReflect() protoreflect.Message {
-	return file_proto2_nested_messages_proto_msgTypes[2].MessageOf(x)
+	mi := &file_proto2_nested_messages_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Layer1_Layer2_Layer3) XXX_Methods() *protoiface.Methods {
+func (x *Layer1_Layer2_Layer3) XXX_Methods() *protoiface.Methods {
 	return file_proto2_nested_messages_proto_msgTypes[2].Methods()
 }
 
@@ -188,6 +215,20 @@
 	if !protoimpl.UnsafeEnabled {
 		file_proto2_nested_messages_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Layer1); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_proto2_nested_messages_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Layer1_Layer2); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -196,21 +237,13 @@
 				return nil
 			}
 		}
-		file_proto2_nested_messages_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Layer1_Layer2); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_proto2_nested_messages_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Layer1_Layer2_Layer3); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
index 0fe3fcb..57ac220 100644
--- a/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/proto2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message struct {
+	state         protoimpl.MessageState
 	I32           *int32   `protobuf:"varint,1,opt,name=i32" json:"i32,omitempty"`
 	M             *Message `protobuf:"bytes,2,opt,name=m" json:"m,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -35,10 +36,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_proto2_proto2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_proto2_proto2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_proto2_proto2_proto_msgTypes[0].Methods()
 }
 
@@ -111,9 +120,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_proto2_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index 7333421..7646822 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -56,6 +56,7 @@
 }
 
 type FieldTestMessage struct {
+	state            protoimpl.MessageState
 	OptionalBool     string                               `protobuf:"bytes,1,opt,name=optional_bool,json=optionalBool,proto3" json:"optional_bool,omitempty"`
 	OptionalEnum     FieldTestMessage_Enum                `protobuf:"varint,2,opt,name=optional_enum,json=optionalEnum,proto3,enum=goproto.protoc.proto3.FieldTestMessage_Enum" json:"optional_enum,omitempty"`
 	OptionalInt32    int32                                `protobuf:"varint,3,opt,name=optional_int32,json=optionalInt32,proto3" json:"optional_int32,omitempty"`
@@ -108,10 +109,18 @@
 func (*FieldTestMessage) ProtoMessage() {}
 
 func (x *FieldTestMessage) ProtoReflect() protoreflect.Message {
-	return file_proto3_fields_proto_msgTypes[0].MessageOf(x)
+	mi := &file_proto3_fields_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage) XXX_Methods() *protoiface.Methods {
 	return file_proto3_fields_proto_msgTypes[0].Methods()
 }
 
@@ -380,6 +389,7 @@
 }
 
 type FieldTestMessage_Message struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -395,10 +405,18 @@
 func (*FieldTestMessage_Message) ProtoMessage() {}
 
 func (x *FieldTestMessage_Message) ProtoReflect() protoreflect.Message {
-	return file_proto3_fields_proto_msgTypes[4].MessageOf(x)
+	mi := &file_proto3_fields_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldTestMessage_Message) XXX_Methods() *protoiface.Methods {
+func (x *FieldTestMessage_Message) XXX_Methods() *protoiface.Methods {
 	return file_proto3_fields_proto_msgTypes[4].Methods()
 }
 
@@ -608,9 +626,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_proto3_fields_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage); i {
-			case 37:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 38:
+				return &v.sizeCache
+			case 39:
 				return &v.unknownFields
 			default:
 				return nil
@@ -619,8 +639,10 @@
 		file_proto3_fields_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldTestMessage_Message); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index 49cf8e8..1cadf09 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -133,6 +133,7 @@
 
 // Scalars contains optional scalar fields.
 type Scalars struct {
+	state         protoimpl.MessageState
 	OptBool       *bool    `protobuf:"varint,1,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
 	OptInt32      *int32   `protobuf:"varint,2,opt,name=opt_int32,json=optInt32" json:"opt_int32,omitempty"`
 	OptInt64      *int64   `protobuf:"varint,3,opt,name=opt_int64,json=optInt64" json:"opt_int64,omitempty"`
@@ -163,10 +164,18 @@
 func (*Scalars) ProtoMessage() {}
 
 func (x *Scalars) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Scalars) XXX_Methods() *protoiface.Methods {
+func (x *Scalars) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[0].Methods()
 }
 
@@ -282,6 +291,7 @@
 
 // Message contains enum fields.
 type Enums struct {
+	state         protoimpl.MessageState
 	OptEnum       *Enum              `protobuf:"varint,1,opt,name=opt_enum,json=optEnum,enum=pb2.Enum" json:"opt_enum,omitempty"`
 	RptEnum       []Enum             `protobuf:"varint,2,rep,name=rpt_enum,json=rptEnum,enum=pb2.Enum" json:"rpt_enum,omitempty"`
 	OptNestedEnum *Enums_NestedEnum  `protobuf:"varint,3,opt,name=opt_nested_enum,json=optNestedEnum,enum=pb2.Enums_NestedEnum" json:"opt_nested_enum,omitempty"`
@@ -301,10 +311,18 @@
 func (*Enums) ProtoMessage() {}
 
 func (x *Enums) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Enums) XXX_Methods() *protoiface.Methods {
+func (x *Enums) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[1].Methods()
 }
 
@@ -343,6 +361,7 @@
 
 // Message contains repeated fields.
 type Repeats struct {
+	state         protoimpl.MessageState
 	RptBool       []bool    `protobuf:"varint,1,rep,name=rpt_bool,json=rptBool" json:"rpt_bool,omitempty"`
 	RptInt32      []int32   `protobuf:"varint,2,rep,name=rpt_int32,json=rptInt32" json:"rpt_int32,omitempty"`
 	RptInt64      []int64   `protobuf:"varint,3,rep,name=rpt_int64,json=rptInt64" json:"rpt_int64,omitempty"`
@@ -367,10 +386,18 @@
 func (*Repeats) ProtoMessage() {}
 
 func (x *Repeats) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Repeats) XXX_Methods() *protoiface.Methods {
+func (x *Repeats) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[2].Methods()
 }
 
@@ -444,6 +471,7 @@
 
 // Message type used as submessage.
 type Nested struct {
+	state         protoimpl.MessageState
 	OptString     *string `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	OptNested     *Nested `protobuf:"bytes,2,opt,name=opt_nested,json=optNested" json:"opt_nested,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -461,10 +489,18 @@
 func (*Nested) ProtoMessage() {}
 
 func (x *Nested) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[3].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nested) XXX_Methods() *protoiface.Methods {
+func (x *Nested) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[3].Methods()
 }
 
@@ -489,6 +525,7 @@
 
 // Message contains message and group fields.
 type Nests struct {
+	state         protoimpl.MessageState
 	OptNested     *Nested           `protobuf:"bytes,1,opt,name=opt_nested,json=optNested" json:"opt_nested,omitempty"`
 	Optgroup      *Nests_OptGroup   `protobuf:"group,2,opt,name=OptGroup,json=optgroup" json:"optgroup,omitempty"`
 	RptNested     []*Nested         `protobuf:"bytes,4,rep,name=rpt_nested,json=rptNested" json:"rpt_nested,omitempty"`
@@ -508,10 +545,18 @@
 func (*Nests) ProtoMessage() {}
 
 func (x *Nests) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[4].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nests) XXX_Methods() *protoiface.Methods {
+func (x *Nests) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[4].Methods()
 }
 
@@ -550,6 +595,7 @@
 
 // Message contains required fields.
 type Requireds struct {
+	state         protoimpl.MessageState
 	ReqBool       *bool    `protobuf:"varint,1,req,name=req_bool,json=reqBool" json:"req_bool,omitempty"`
 	ReqSfixed64   *int64   `protobuf:"fixed64,2,req,name=req_sfixed64,json=reqSfixed64" json:"req_sfixed64,omitempty"`
 	ReqDouble     *float64 `protobuf:"fixed64,3,req,name=req_double,json=reqDouble" json:"req_double,omitempty"`
@@ -571,10 +617,18 @@
 func (*Requireds) ProtoMessage() {}
 
 func (x *Requireds) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[5].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Requireds) XXX_Methods() *protoiface.Methods {
+func (x *Requireds) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[5].Methods()
 }
 
@@ -627,6 +681,7 @@
 
 // Message contains both required and optional fields.
 type PartialRequired struct {
+	state         protoimpl.MessageState
 	ReqString     *string `protobuf:"bytes,1,req,name=req_string,json=reqString" json:"req_string,omitempty"`
 	OptString     *string `protobuf:"bytes,2,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -644,10 +699,18 @@
 func (*PartialRequired) ProtoMessage() {}
 
 func (x *PartialRequired) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[6].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *PartialRequired) XXX_Methods() *protoiface.Methods {
+func (x *PartialRequired) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[6].Methods()
 }
 
@@ -671,6 +734,7 @@
 }
 
 type NestedWithRequired struct {
+	state         protoimpl.MessageState
 	ReqString     *string `protobuf:"bytes,1,req,name=req_string,json=reqString" json:"req_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -687,10 +751,18 @@
 func (*NestedWithRequired) ProtoMessage() {}
 
 func (x *NestedWithRequired) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[7].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *NestedWithRequired) XXX_Methods() *protoiface.Methods {
+func (x *NestedWithRequired) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[7].Methods()
 }
 
@@ -707,6 +779,7 @@
 }
 
 type IndirectRequired struct {
+	state       protoimpl.MessageState
 	OptNested   *NestedWithRequired            `protobuf:"bytes,1,opt,name=opt_nested,json=optNested" json:"opt_nested,omitempty"`
 	RptNested   []*NestedWithRequired          `protobuf:"bytes,2,rep,name=rpt_nested,json=rptNested" json:"rpt_nested,omitempty"`
 	StrToNested map[string]*NestedWithRequired `protobuf:"bytes,3,rep,name=str_to_nested,json=strToNested" json:"str_to_nested,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
@@ -728,10 +801,18 @@
 func (*IndirectRequired) ProtoMessage() {}
 
 func (x *IndirectRequired) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[8].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *IndirectRequired) XXX_Methods() *protoiface.Methods {
+func (x *IndirectRequired) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[8].Methods()
 }
 
@@ -786,6 +867,7 @@
 func (*IndirectRequired_OneofNested) isIndirectRequired_Union() {}
 
 type Extensions struct {
+	state           protoimpl.MessageState
 	OptString       *string `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	OptBool         *bool   `protobuf:"varint,101,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
 	OptInt32        *int32  `protobuf:"varint,2,opt,name=opt_int32,json=optInt32" json:"opt_int32,omitempty"`
@@ -805,10 +887,18 @@
 func (*Extensions) ProtoMessage() {}
 
 func (x *Extensions) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[9].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Extensions) XXX_Methods() *protoiface.Methods {
+func (x *Extensions) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[9].Methods()
 }
 
@@ -848,6 +938,7 @@
 }
 
 type ExtensionsContainer struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -863,10 +954,18 @@
 func (*ExtensionsContainer) ProtoMessage() {}
 
 func (x *ExtensionsContainer) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[10].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtensionsContainer) XXX_Methods() *protoiface.Methods {
+func (x *ExtensionsContainer) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[10].Methods()
 }
 
@@ -876,6 +975,7 @@
 }
 
 type MessageSet struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -892,10 +992,18 @@
 func (*MessageSet) ProtoMessage() {}
 
 func (x *MessageSet) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[11].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MessageSet) XXX_Methods() *protoiface.Methods {
+func (x *MessageSet) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[11].Methods()
 }
 
@@ -914,6 +1022,7 @@
 }
 
 type MessageSetExtension struct {
+	state         protoimpl.MessageState
 	OptString     *string `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -930,10 +1039,18 @@
 func (*MessageSetExtension) ProtoMessage() {}
 
 func (x *MessageSetExtension) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[12].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MessageSetExtension) XXX_Methods() *protoiface.Methods {
+func (x *MessageSetExtension) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[12].Methods()
 }
 
@@ -950,6 +1067,7 @@
 }
 
 type FakeMessageSet struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -966,10 +1084,18 @@
 func (*FakeMessageSet) ProtoMessage() {}
 
 func (x *FakeMessageSet) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[13].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FakeMessageSet) XXX_Methods() *protoiface.Methods {
+func (x *FakeMessageSet) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[13].Methods()
 }
 
@@ -988,6 +1114,7 @@
 }
 
 type FakeMessageSetExtension struct {
+	state         protoimpl.MessageState
 	OptString     *string `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1004,10 +1131,18 @@
 func (*FakeMessageSetExtension) ProtoMessage() {}
 
 func (x *FakeMessageSetExtension) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[14].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FakeMessageSetExtension) XXX_Methods() *protoiface.Methods {
+func (x *FakeMessageSetExtension) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[14].Methods()
 }
 
@@ -1025,6 +1160,7 @@
 
 // Message contains well-known type fields.
 type KnownTypes struct {
+	state         protoimpl.MessageState
 	OptBool       *wrapperspb.BoolValue   `protobuf:"bytes,1,opt,name=opt_bool,json=optBool" json:"opt_bool,omitempty"`
 	OptInt32      *wrapperspb.Int32Value  `protobuf:"bytes,2,opt,name=opt_int32,json=optInt32" json:"opt_int32,omitempty"`
 	OptInt64      *wrapperspb.Int64Value  `protobuf:"bytes,3,opt,name=opt_int64,json=optInt64" json:"opt_int64,omitempty"`
@@ -1058,10 +1194,18 @@
 func (*KnownTypes) ProtoMessage() {}
 
 func (x *KnownTypes) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[15].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *KnownTypes) XXX_Methods() *protoiface.Methods {
+func (x *KnownTypes) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[15].Methods()
 }
 
@@ -1197,6 +1341,7 @@
 }
 
 type Nests_OptGroup struct {
+	state          protoimpl.MessageState
 	OptString      *string                        `protobuf:"bytes,1,opt,name=opt_string,json=optString" json:"opt_string,omitempty"`
 	OptNested      *Nested                        `protobuf:"bytes,2,opt,name=opt_nested,json=optNested" json:"opt_nested,omitempty"`
 	Optnestedgroup *Nests_OptGroup_OptNestedGroup `protobuf:"group,3,opt,name=OptNestedGroup,json=optnestedgroup" json:"optnestedgroup,omitempty"`
@@ -1215,10 +1360,18 @@
 func (*Nests_OptGroup) ProtoMessage() {}
 
 func (x *Nests_OptGroup) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[16].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nests_OptGroup) XXX_Methods() *protoiface.Methods {
+func (x *Nests_OptGroup) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[16].Methods()
 }
 
@@ -1249,6 +1402,7 @@
 }
 
 type Nests_RptGroup struct {
+	state         protoimpl.MessageState
 	RptString     []string `protobuf:"bytes,1,rep,name=rpt_string,json=rptString" json:"rpt_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1265,10 +1419,18 @@
 func (*Nests_RptGroup) ProtoMessage() {}
 
 func (x *Nests_RptGroup) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[17].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nests_RptGroup) XXX_Methods() *protoiface.Methods {
+func (x *Nests_RptGroup) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[17].Methods()
 }
 
@@ -1285,6 +1447,7 @@
 }
 
 type Nests_OptGroup_OptNestedGroup struct {
+	state         protoimpl.MessageState
 	OptFixed32    *uint32 `protobuf:"fixed32,1,opt,name=opt_fixed32,json=optFixed32" json:"opt_fixed32,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1301,10 +1464,18 @@
 func (*Nests_OptGroup_OptNestedGroup) ProtoMessage() {}
 
 func (x *Nests_OptGroup_OptNestedGroup) ProtoReflect() protoreflect.Message {
-	return file_pb2_test_proto_msgTypes[18].MessageOf(x)
+	mi := &file_pb2_test_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nests_OptGroup_OptNestedGroup) XXX_Methods() *protoiface.Methods {
+func (x *Nests_OptGroup_OptNestedGroup) XXX_Methods() *protoiface.Methods {
 	return file_pb2_test_proto_msgTypes[18].Methods()
 }
 
@@ -2043,9 +2214,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_pb2_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Scalars); i {
-			case 15:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 16:
+				return &v.sizeCache
+			case 17:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2053,9 +2226,11 @@
 		}
 		file_pb2_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Enums); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2063,9 +2238,11 @@
 		}
 		file_pb2_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Repeats); i {
-			case 9:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 10:
+				return &v.sizeCache
+			case 11:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2073,9 +2250,11 @@
 		}
 		file_pb2_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nested); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2083,9 +2262,11 @@
 		}
 		file_pb2_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2093,9 +2274,11 @@
 		}
 		file_pb2_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Requireds); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2103,9 +2286,11 @@
 		}
 		file_pb2_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*PartialRequired); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2113,9 +2298,11 @@
 		}
 		file_pb2_test_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*NestedWithRequired); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2123,9 +2310,11 @@
 		}
 		file_pb2_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*IndirectRequired); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2133,11 +2322,13 @@
 		}
 		file_pb2_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Extensions); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 5:
+				return &v.unknownFields
+			case 6:
 				return &v.extensionFields
 			default:
 				return nil
@@ -2146,8 +2337,10 @@
 		file_pb2_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtensionsContainer); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2156,10 +2349,12 @@
 		file_pb2_test_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSet); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -2167,9 +2362,11 @@
 		}
 		file_pb2_test_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageSetExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2178,10 +2375,12 @@
 		file_pb2_test_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FakeMessageSet); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -2189,9 +2388,11 @@
 		}
 		file_pb2_test_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FakeMessageSetExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2199,9 +2400,11 @@
 		}
 		file_pb2_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*KnownTypes); i {
-			case 18:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 19:
+				return &v.sizeCache
+			case 20:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2209,9 +2412,11 @@
 		}
 		file_pb2_test_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_OptGroup); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2219,9 +2424,11 @@
 		}
 		file_pb2_test_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_RptGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2229,9 +2436,11 @@
 		}
 		file_pb2_test_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests_OptGroup_OptNestedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/encoding/testprotos/pb3/test.pb.go b/encoding/testprotos/pb3/test.pb.go
index 50ecdcc..411965e 100644
--- a/encoding/testprotos/pb3/test.pb.go
+++ b/encoding/testprotos/pb3/test.pb.go
@@ -112,6 +112,7 @@
 
 // Scalars contains scalar field types.
 type Scalars struct {
+	state         protoimpl.MessageState
 	SBool         bool    `protobuf:"varint,1,opt,name=s_bool,json=sBool,proto3" json:"s_bool,omitempty"`
 	SInt32        int32   `protobuf:"varint,2,opt,name=s_int32,json=sInt32,proto3" json:"s_int32,omitempty"`
 	SInt64        int64   `protobuf:"varint,3,opt,name=s_int64,json=sInt64,proto3" json:"s_int64,omitempty"`
@@ -142,10 +143,18 @@
 func (*Scalars) ProtoMessage() {}
 
 func (x *Scalars) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Scalars) XXX_Methods() *protoiface.Methods {
+func (x *Scalars) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[0].Methods()
 }
 
@@ -261,6 +270,7 @@
 
 // Message contains enum fields.
 type Enums struct {
+	state         protoimpl.MessageState
 	SEnum         Enum             `protobuf:"varint,1,opt,name=s_enum,json=sEnum,proto3,enum=pb3.Enum" json:"s_enum,omitempty"`
 	SNestedEnum   Enums_NestedEnum `protobuf:"varint,3,opt,name=s_nested_enum,json=sNestedEnum,proto3,enum=pb3.Enums_NestedEnum" json:"s_nested_enum,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -278,10 +288,18 @@
 func (*Enums) ProtoMessage() {}
 
 func (x *Enums) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Enums) XXX_Methods() *protoiface.Methods {
+func (x *Enums) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[1].Methods()
 }
 
@@ -306,6 +324,7 @@
 
 // Message contains nested message field.
 type Nests struct {
+	state         protoimpl.MessageState
 	SNested       *Nested `protobuf:"bytes,2,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -322,10 +341,18 @@
 func (*Nests) ProtoMessage() {}
 
 func (x *Nests) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nests) XXX_Methods() *protoiface.Methods {
+func (x *Nests) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[2].Methods()
 }
 
@@ -343,6 +370,7 @@
 
 // Message type used as submessage.
 type Nested struct {
+	state         protoimpl.MessageState
 	SString       string  `protobuf:"bytes,1,opt,name=s_string,json=sString,proto3" json:"s_string,omitempty"`
 	SNested       *Nested `protobuf:"bytes,2,opt,name=s_nested,json=sNested,proto3" json:"s_nested,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -360,10 +388,18 @@
 func (*Nested) ProtoMessage() {}
 
 func (x *Nested) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[3].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Nested) XXX_Methods() *protoiface.Methods {
+func (x *Nested) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[3].Methods()
 }
 
@@ -388,6 +424,7 @@
 
 // Message contains oneof field.
 type Oneofs struct {
+	state protoimpl.MessageState
 	// Types that are valid to be assigned to Union:
 	//	*Oneofs_OneofEnum
 	//	*Oneofs_OneofString
@@ -408,10 +445,18 @@
 func (*Oneofs) ProtoMessage() {}
 
 func (x *Oneofs) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[4].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Oneofs) XXX_Methods() *protoiface.Methods {
+func (x *Oneofs) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[4].Methods()
 }
 
@@ -472,6 +517,7 @@
 
 // Message contains map fields.
 type Maps struct {
+	state         protoimpl.MessageState
 	Int32ToStr    map[int32]string   `protobuf:"bytes,1,rep,name=int32_to_str,json=int32ToStr,proto3" json:"int32_to_str,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	BoolToUint32  map[bool]uint32    `protobuf:"bytes,2,rep,name=bool_to_uint32,json=boolToUint32,proto3" json:"bool_to_uint32,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
 	Uint64ToEnum  map[uint64]Enum    `protobuf:"bytes,3,rep,name=uint64_to_enum,json=uint64ToEnum,proto3" json:"uint64_to_enum,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=pb3.Enum"`
@@ -492,10 +538,18 @@
 func (*Maps) ProtoMessage() {}
 
 func (x *Maps) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[5].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Maps) XXX_Methods() *protoiface.Methods {
+func (x *Maps) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[5].Methods()
 }
 
@@ -541,6 +595,7 @@
 
 // Message for testing json_name option.
 type JSONNames struct {
+	state         protoimpl.MessageState
 	SString       string `protobuf:"bytes,1,opt,name=s_string,json=foo_bar,proto3" json:"s_string,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -557,10 +612,18 @@
 func (*JSONNames) ProtoMessage() {}
 
 func (x *JSONNames) ProtoReflect() protoreflect.Message {
-	return file_pb3_test_proto_msgTypes[6].MessageOf(x)
+	mi := &file_pb3_test_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *JSONNames) XXX_Methods() *protoiface.Methods {
+func (x *JSONNames) XXX_Methods() *protoiface.Methods {
 	return file_pb3_test_proto_msgTypes[6].Methods()
 }
 
@@ -748,9 +811,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_pb3_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Scalars); i {
-			case 15:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 16:
+				return &v.sizeCache
+			case 17:
 				return &v.unknownFields
 			default:
 				return nil
@@ -758,9 +823,11 @@
 		}
 		file_pb3_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Enums); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -768,16 +835,8 @@
 		}
 		file_pb3_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Nests); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_pb3_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Nested); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -786,11 +845,25 @@
 				return nil
 			}
 		}
+		file_pb3_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Nested); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_pb3_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Oneofs); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -798,9 +871,11 @@
 		}
 		file_pb3_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Maps); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -808,9 +883,11 @@
 		}
 		file_pb3_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*JSONNames); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/cmd/generate-types/impl.go b/internal/cmd/generate-types/impl.go
index a2e2aa9..a7c4951 100644
--- a/internal/cmd/generate-types/impl.go
+++ b/internal/cmd/generate-types/impl.go
@@ -381,3 +381,107 @@
 {{end}}
 }
 `))
+
+func generateImplMessage() string {
+	return mustExecute(implMessageTemplate, []string{"messageState", "messageReflectWrapper"})
+}
+
+var implMessageTemplate = template.Must(template.New("").Parse(`
+{{range . -}}
+func (m *{{.}}) Descriptor() protoreflect.MessageDescriptor {
+	return m.mi.PBType.Descriptor()
+}
+func (m *{{.}}) New() protoreflect.Message {
+	return m.mi.PBType.New()
+}
+func (m *{{.}}) Interface() protoreflect.ProtoMessage {
+	{{if eq . "messageState" -}}
+	return m.ProtoUnwrap().(protoreflect.ProtoMessage)
+	{{- else -}}
+	if m, ok := m.ProtoUnwrap().(protoreflect.ProtoMessage); ok {
+		return m
+	}
+	return (*messageIfaceWrapper)(m)
+	{{- end -}}
+}
+func (m *{{.}}) ProtoUnwrap() interface{} {
+	return m.pointer().AsIfaceOf(m.mi.GoType.Elem())
+}
+
+func (m *{{.}}) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
+	m.mi.init()
+	for _, fi := range m.mi.fields {
+		if fi.has(m.pointer()) {
+			if !f(fi.fieldDesc, fi.get(m.pointer())) {
+				return
+			}
+		}
+	}
+	m.mi.extensionMap(m.pointer()).Range(f)
+}
+func (m *{{.}}) Has(fd protoreflect.FieldDescriptor) bool {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.has(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Has(xt)
+	}
+}
+func (m *{{.}}) Clear(fd protoreflect.FieldDescriptor) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.clear(m.pointer())
+	} else {
+		m.mi.extensionMap(m.pointer()).Clear(xt)
+	}
+}
+func (m *{{.}}) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.get(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Get(xt)
+	}
+}
+func (m *{{.}}) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.set(m.pointer(), v)
+	} else {
+		m.mi.extensionMap(m.pointer()).Set(xt, v)
+	}
+}
+func (m *{{.}}) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.mutable(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Mutable(xt)
+	}
+}
+func (m *{{.}}) NewMessage(fd protoreflect.FieldDescriptor) protoreflect.Message {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.newMessage()
+	} else {
+		return xt.New().Message()
+	}
+}
+func (m *{{.}}) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
+	m.mi.init()
+	if oi := m.mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
+		return od.Fields().ByNumber(oi.which(m.pointer()))
+	}
+	panic("invalid oneof descriptor")
+}
+func (m *{{.}}) GetUnknown() protoreflect.RawFields {
+	m.mi.init()
+	return m.mi.getUnknown(m.pointer())
+}
+func (m *{{.}}) SetUnknown(b protoreflect.RawFields) {
+	m.mi.init()
+	m.mi.setUnknown(m.pointer(), b)
+}
+
+{{end}}
+`))
diff --git a/internal/cmd/generate-types/main.go b/internal/cmd/generate-types/main.go
index 09e6a8a..6490b5c 100644
--- a/internal/cmd/generate-types/main.go
+++ b/internal/cmd/generate-types/main.go
@@ -39,6 +39,7 @@
 	chdirRoot()
 	writeSource("internal/filedesc/desc_list_gen.go", generateDescListTypes())
 	writeSource("internal/impl/codec_gen.go", generateImplCodec())
+	writeSource("internal/impl/message_reflect_gen.go", generateImplMessage())
 	writeSource("proto/decode_gen.go", generateProtoDecode())
 	writeSource("proto/encode_gen.go", generateProtoEncode())
 	writeSource("proto/size_gen.go", generateProtoSize())
diff --git a/internal/impl/message.go b/internal/impl/message.go
index fe7cd37..201e1d6 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -12,7 +12,6 @@
 	"sync"
 	"sync/atomic"
 
-	pvalue "google.golang.org/protobuf/internal/value"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	piface "google.golang.org/protobuf/runtime/protoiface"
 )
@@ -39,13 +38,7 @@
 	initMu   sync.Mutex // protects all unexported fields
 	initDone uint32
 
-	fields map[pref.FieldNumber]*fieldInfo
-	oneofs map[pref.Name]*oneofInfo
-
-	getUnknown func(pointer) pref.RawFields
-	setUnknown func(pointer, pref.RawFields)
-
-	extensionMap func(pointer) *extensionMap
+	reflectMessageInfo
 
 	// Information used by the fast-path methods.
 	methods piface.Methods
@@ -55,6 +48,17 @@
 	extensionFieldInfos   map[pref.ExtensionType]*extensionFieldInfo
 }
 
+type reflectMessageInfo struct {
+	fields map[pref.FieldNumber]*fieldInfo
+	oneofs map[pref.Name]*oneofInfo
+
+	getUnknown   func(pointer) pref.RawFields
+	setUnknown   func(pointer, pref.RawFields)
+	extensionMap func(pointer) *extensionMap
+
+	nilMessage atomicNilMessage
+}
+
 // exporter is a function that returns a reference to the ith field of v,
 // where v is a pointer to a struct. It returns nil if it does not support
 // exporting the requested field (e.g., already exported).
@@ -88,10 +92,9 @@
 	// This function is called in the hot path. Inline the sync.Once
 	// logic, since allocating a closure for Once.Do is expensive.
 	// Keep init small to ensure that it can be inlined.
-	if atomic.LoadUint32(&mi.initDone) == 1 {
-		return
+	if atomic.LoadUint32(&mi.initDone) == 0 {
+		mi.initOnce()
 	}
-	mi.initOnce()
 }
 
 func (mi *MessageInfo) initOnce() {
@@ -293,247 +296,8 @@
 	}
 }
 
-func (mi *MessageInfo) MessageOf(p interface{}) pref.Message {
-	return (*messageReflectWrapper)(mi.dataTypeOf(p))
-}
-
+// TODO: Move this to be on the reflect message instance.
 func (mi *MessageInfo) Methods() *piface.Methods {
 	mi.init()
 	return &mi.methods
 }
-
-func (mi *MessageInfo) dataTypeOf(p interface{}) *messageDataType {
-	// TODO: Remove this check? This API is primarily used by generated code,
-	// and should not violate this assumption. Leave this check in for now to
-	// provide some sanity checks during development. This can be removed if
-	// it proves to be detrimental to performance.
-	if reflect.TypeOf(p) != mi.GoType {
-		panic(fmt.Sprintf("type mismatch: got %T, want %v", p, mi.GoType))
-	}
-	return &messageDataType{pointerOfIface(p), mi}
-}
-
-// messageDataType is a tuple of a pointer to the message data and
-// a pointer to the message type.
-//
-// TODO: Unfortunately, we need to close over a pointer and MessageInfo,
-// which incurs an an allocation. This pair is similar to a Go interface,
-// which is essentially a tuple of the same thing. We can make this efficient
-// with reflect.NamedOf (see https://golang.org/issues/16522).
-//
-// With that hypothetical API, we could dynamically create a new named type
-// that has the same underlying type as MessageInfo.GoType, and
-// dynamically create methods that close over MessageInfo.
-// Since the new type would have the same underlying type, we could directly
-// convert between pointers of those types, giving us an efficient way to swap
-// out the method set.
-//
-// Barring the ability to dynamically create named types, the workaround is
-//	1. either to accept the cost of an allocation for this wrapper struct or
-//	2. generate more types and methods, at the expense of binary size increase.
-type messageDataType struct {
-	p  pointer
-	mi *MessageInfo
-}
-
-type messageReflectWrapper messageDataType
-
-func (m *messageReflectWrapper) Descriptor() pref.MessageDescriptor {
-	return m.mi.PBType.Descriptor()
-}
-func (m *messageReflectWrapper) New() pref.Message {
-	return m.mi.PBType.New()
-}
-func (m *messageReflectWrapper) Interface() pref.ProtoMessage {
-	if m, ok := m.ProtoUnwrap().(pref.ProtoMessage); ok {
-		return m
-	}
-	return (*messageIfaceWrapper)(m)
-}
-func (m *messageReflectWrapper) ProtoUnwrap() interface{} {
-	return m.p.AsIfaceOf(m.mi.GoType.Elem())
-}
-
-func (m *messageReflectWrapper) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
-	m.mi.init()
-	for _, fi := range m.mi.fields {
-		if fi.has(m.p) {
-			if !f(fi.fieldDesc, fi.get(m.p)) {
-				return
-			}
-		}
-	}
-	m.mi.extensionMap(m.p).Range(f)
-}
-func (m *messageReflectWrapper) Has(fd pref.FieldDescriptor) bool {
-	if fi, xt := m.checkField(fd); fi != nil {
-		return fi.has(m.p)
-	} else {
-		return m.mi.extensionMap(m.p).Has(xt)
-	}
-}
-func (m *messageReflectWrapper) Clear(fd pref.FieldDescriptor) {
-	if fi, xt := m.checkField(fd); fi != nil {
-		fi.clear(m.p)
-	} else {
-		m.mi.extensionMap(m.p).Clear(xt)
-	}
-}
-func (m *messageReflectWrapper) Get(fd pref.FieldDescriptor) pref.Value {
-	if fi, xt := m.checkField(fd); fi != nil {
-		return fi.get(m.p)
-	} else {
-		return m.mi.extensionMap(m.p).Get(xt)
-	}
-}
-func (m *messageReflectWrapper) Set(fd pref.FieldDescriptor, v pref.Value) {
-	if fi, xt := m.checkField(fd); fi != nil {
-		fi.set(m.p, v)
-	} else {
-		m.mi.extensionMap(m.p).Set(xt, v)
-	}
-}
-func (m *messageReflectWrapper) Mutable(fd pref.FieldDescriptor) pref.Value {
-	if fi, xt := m.checkField(fd); fi != nil {
-		return fi.mutable(m.p)
-	} else {
-		return m.mi.extensionMap(m.p).Mutable(xt)
-	}
-}
-func (m *messageReflectWrapper) NewMessage(fd pref.FieldDescriptor) pref.Message {
-	if fi, xt := m.checkField(fd); fi != nil {
-		return fi.newMessage()
-	} else {
-		return xt.New().Message()
-	}
-}
-func (m *messageReflectWrapper) WhichOneof(od pref.OneofDescriptor) pref.FieldDescriptor {
-	m.mi.init()
-	if oi := m.mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
-		return od.Fields().ByNumber(oi.which(m.p))
-	}
-	panic("invalid oneof descriptor")
-}
-func (m *messageReflectWrapper) GetUnknown() pref.RawFields {
-	m.mi.init()
-	return m.mi.getUnknown(m.p)
-}
-func (m *messageReflectWrapper) SetUnknown(b pref.RawFields) {
-	m.mi.init()
-	m.mi.setUnknown(m.p, b)
-}
-
-// checkField verifies that the provided field descriptor is valid.
-// Exactly one of the returned values is populated.
-func (m *messageReflectWrapper) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) {
-	m.mi.init()
-	if fi := m.mi.fields[fd.Number()]; fi != nil {
-		if fi.fieldDesc != fd {
-			panic("mismatching field descriptor")
-		}
-		return fi, nil
-	}
-	if fd.IsExtension() {
-		if fd.ContainingMessage().FullName() != m.mi.PBType.FullName() {
-			// TODO: Should this be exact containing message descriptor match?
-			panic("mismatching containing message")
-		}
-		if !m.mi.PBType.ExtensionRanges().Has(fd.Number()) {
-			panic("invalid extension field")
-		}
-		return nil, fd.(pref.ExtensionType)
-	}
-	panic("invalid field descriptor")
-}
-
-type extensionMap map[int32]ExtensionField
-
-func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
-	if m != nil {
-		for _, x := range *m {
-			xt := x.GetType()
-			if !f(xt, xt.ValueOf(x.GetValue())) {
-				return
-			}
-		}
-	}
-}
-func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) {
-	if m != nil {
-		_, ok = (*m)[int32(xt.Number())]
-	}
-	return ok
-}
-func (m *extensionMap) Clear(xt pref.ExtensionType) {
-	delete(*m, int32(xt.Number()))
-}
-func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value {
-	if m != nil {
-		if x, ok := (*m)[int32(xt.Number())]; ok {
-			return xt.ValueOf(x.GetValue())
-		}
-	}
-	if !isComposite(xt) {
-		return defaultValueOf(xt)
-	}
-	return frozenValueOf(xt.New())
-}
-func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) {
-	if *m == nil {
-		*m = make(map[int32]ExtensionField)
-	}
-	var x ExtensionField
-	x.SetType(xt)
-	x.SetEagerValue(xt.InterfaceOf(v))
-	(*m)[int32(xt.Number())] = x
-}
-func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value {
-	if !isComposite(xt) {
-		panic("invalid Mutable on field with non-composite type")
-	}
-	if x, ok := (*m)[int32(xt.Number())]; ok {
-		return xt.ValueOf(x.GetValue())
-	}
-	v := xt.New()
-	m.Set(xt, v)
-	return v
-}
-
-func isComposite(fd pref.FieldDescriptor) bool {
-	return fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind || fd.IsList() || fd.IsMap()
-}
-
-var _ pvalue.Unwrapper = (*messageReflectWrapper)(nil)
-
-type messageIfaceWrapper messageDataType
-
-func (m *messageIfaceWrapper) ProtoReflect() pref.Message {
-	return (*messageReflectWrapper)(m)
-}
-func (m *messageIfaceWrapper) XXX_Methods() *piface.Methods {
-	// TODO: Consider not recreating this on every call.
-	m.mi.init()
-	return &piface.Methods{
-		Flags:         piface.MethodFlagDeterministicMarshal,
-		MarshalAppend: m.marshalAppend,
-		Unmarshal:     m.unmarshal,
-		Size:          m.size,
-		IsInitialized: m.isInitialized,
-	}
-}
-func (m *messageIfaceWrapper) ProtoUnwrap() interface{} {
-	return m.p.AsIfaceOf(m.mi.GoType.Elem())
-}
-func (m *messageIfaceWrapper) marshalAppend(b []byte, _ pref.ProtoMessage, opts piface.MarshalOptions) ([]byte, error) {
-	return m.mi.marshalAppendPointer(b, m.p, newMarshalOptions(opts))
-}
-func (m *messageIfaceWrapper) unmarshal(b []byte, _ pref.ProtoMessage, opts piface.UnmarshalOptions) error {
-	_, err := m.mi.unmarshalPointer(b, m.p, 0, newUnmarshalOptions(opts))
-	return err
-}
-func (m *messageIfaceWrapper) size(msg pref.ProtoMessage) (size int) {
-	return m.mi.sizePointer(m.p, 0)
-}
-func (m *messageIfaceWrapper) isInitialized(_ pref.ProtoMessage) error {
-	return m.mi.isInitializedPointer(m.p)
-}
diff --git a/internal/impl/message_reflect.go b/internal/impl/message_reflect.go
new file mode 100644
index 0000000..a9eb7a9
--- /dev/null
+++ b/internal/impl/message_reflect.go
@@ -0,0 +1,220 @@
+// Copyright 2019 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.
+
+package impl
+
+import (
+	"fmt"
+	"reflect"
+
+	"google.golang.org/protobuf/internal/pragma"
+	pvalue "google.golang.org/protobuf/internal/value"
+	pref "google.golang.org/protobuf/reflect/protoreflect"
+	piface "google.golang.org/protobuf/runtime/protoiface"
+)
+
+// MessageState is a data structure that is nested as the first field in a
+// concrete message. It provides a way to implement the ProtoReflect method
+// in an allocation-free way without needing to have a shadow Go type generated
+// for every message type. This technique only works using unsafe.
+//
+//
+// Example generated code:
+//
+//	type M struct {
+//		state protoimpl.MessageState
+//
+//		Field1 int32
+//		Field2 string
+//		Field3 *BarMessage
+//		...
+//	}
+//
+//	func (m *M) ProtoReflect() protoreflect.Message {
+//		mi := &file_fizz_buzz_proto_msgInfos[5]
+//		if protoimpl.UnsafeEnabled && m != nil {
+//			ms := protoimpl.X.MessageStateOf(Pointer(m))
+//			if ms.LoadMessageInfo() == nil {
+//				ms.StoreMessageInfo(mi)
+//			}
+//			return ms
+//		}
+//		return mi.MessageOf(m)
+//	}
+//
+// The MessageState type holds a *MessageInfo, which must be atomically set to
+// the message info associated with a given message instance.
+// By unsafely converting a *M into a *MessageState, the MessageState object
+// has access to all the information needed to implement protobuf reflection.
+// It has access to the message info as its first field, and a pointer to the
+// MessageState is identical to a pointer to the concrete message value.
+//
+//
+// Requirements:
+//	• The type M must implement protoreflect.ProtoMessage.
+//	• The address of m must not be nil.
+//	• The address of m and the address of m.state must be equal,
+//	even though they are different Go types.
+type MessageState struct {
+	pragma.NoUnkeyedLiterals
+	pragma.DoNotCompare
+	pragma.DoNotCopy
+
+	mi *MessageInfo
+}
+
+type messageState MessageState
+
+var (
+	_ pref.Message     = (*messageState)(nil)
+	_ pvalue.Unwrapper = (*messageState)(nil)
+)
+
+// messageDataType is a tuple of a pointer to the message data and
+// a pointer to the message type. It is a generalized way of providing a
+// reflective view over a message instance. The disadvantage of this approach
+// is the need to allocate this tuple of 16B.
+type messageDataType struct {
+	p  pointer
+	mi *MessageInfo
+}
+
+type (
+	messageIfaceWrapper   messageDataType
+	messageReflectWrapper messageDataType
+)
+
+var (
+	_ pref.Message      = (*messageReflectWrapper)(nil)
+	_ pvalue.Unwrapper  = (*messageReflectWrapper)(nil)
+	_ pref.ProtoMessage = (*messageIfaceWrapper)(nil)
+	_ pvalue.Unwrapper  = (*messageIfaceWrapper)(nil)
+)
+
+// MessageOf returns a reflective view over a message. The input must be a
+// pointer to a named Go struct. If the provided type has a ProtoReflect method,
+// it must be implemented by calling this method.
+func (mi *MessageInfo) MessageOf(m interface{}) pref.Message {
+	// TODO: Switch the input to be an opaque Pointer.
+	if reflect.TypeOf(m) != mi.GoType {
+		panic(fmt.Sprintf("type mismatch: got %T, want %v", m, mi.GoType))
+	}
+	p := pointerOfIface(m)
+	if p.IsNil() {
+		return mi.nilMessage.Init(mi)
+	}
+	return &messageReflectWrapper{p, mi}
+}
+
+func (m *messageReflectWrapper) pointer() pointer { return m.p }
+
+func (m *messageIfaceWrapper) ProtoReflect() pref.Message {
+	return (*messageReflectWrapper)(m)
+}
+func (m *messageIfaceWrapper) XXX_Methods() *piface.Methods {
+	// TODO: Consider not recreating this on every call.
+	m.mi.init()
+	return &piface.Methods{
+		Flags:         piface.MethodFlagDeterministicMarshal,
+		MarshalAppend: m.marshalAppend,
+		Unmarshal:     m.unmarshal,
+		Size:          m.size,
+		IsInitialized: m.isInitialized,
+	}
+}
+func (m *messageIfaceWrapper) ProtoUnwrap() interface{} {
+	return m.p.AsIfaceOf(m.mi.GoType.Elem())
+}
+func (m *messageIfaceWrapper) marshalAppend(b []byte, _ pref.ProtoMessage, opts piface.MarshalOptions) ([]byte, error) {
+	return m.mi.marshalAppendPointer(b, m.p, newMarshalOptions(opts))
+}
+func (m *messageIfaceWrapper) unmarshal(b []byte, _ pref.ProtoMessage, opts piface.UnmarshalOptions) error {
+	_, err := m.mi.unmarshalPointer(b, m.p, 0, newUnmarshalOptions(opts))
+	return err
+}
+func (m *messageIfaceWrapper) size(msg pref.ProtoMessage) (size int) {
+	return m.mi.sizePointer(m.p, 0)
+}
+func (m *messageIfaceWrapper) isInitialized(_ pref.ProtoMessage) error {
+	return m.mi.isInitializedPointer(m.p)
+}
+
+type extensionMap map[int32]ExtensionField
+
+func (m *extensionMap) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
+	if m != nil {
+		for _, x := range *m {
+			xt := x.GetType()
+			if !f(xt, xt.ValueOf(x.GetValue())) {
+				return
+			}
+		}
+	}
+}
+func (m *extensionMap) Has(xt pref.ExtensionType) (ok bool) {
+	if m != nil {
+		_, ok = (*m)[int32(xt.Number())]
+	}
+	return ok
+}
+func (m *extensionMap) Clear(xt pref.ExtensionType) {
+	delete(*m, int32(xt.Number()))
+}
+func (m *extensionMap) Get(xt pref.ExtensionType) pref.Value {
+	if m != nil {
+		if x, ok := (*m)[int32(xt.Number())]; ok {
+			return xt.ValueOf(x.GetValue())
+		}
+	}
+	if !isComposite(xt) {
+		return defaultValueOf(xt)
+	}
+	return frozenValueOf(xt.New())
+}
+func (m *extensionMap) Set(xt pref.ExtensionType, v pref.Value) {
+	if *m == nil {
+		*m = make(map[int32]ExtensionField)
+	}
+	var x ExtensionField
+	x.SetType(xt)
+	x.SetEagerValue(xt.InterfaceOf(v))
+	(*m)[int32(xt.Number())] = x
+}
+func (m *extensionMap) Mutable(xt pref.ExtensionType) pref.Value {
+	if !isComposite(xt) {
+		panic("invalid Mutable on field with non-composite type")
+	}
+	if x, ok := (*m)[int32(xt.Number())]; ok {
+		return xt.ValueOf(x.GetValue())
+	}
+	v := xt.New()
+	m.Set(xt, v)
+	return v
+}
+
+func isComposite(fd pref.FieldDescriptor) bool {
+	return fd.Kind() == pref.MessageKind || fd.Kind() == pref.GroupKind || fd.IsList() || fd.IsMap()
+}
+
+// checkField verifies that the provided field descriptor is valid.
+// Exactly one of the returned values is populated.
+func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.ExtensionType) {
+	if fi := mi.fields[fd.Number()]; fi != nil {
+		if fi.fieldDesc != fd {
+			panic("mismatching field descriptor")
+		}
+		return fi, nil
+	}
+	if fd.IsExtension() {
+		if fd.ContainingMessage().FullName() != mi.PBType.FullName() {
+			// TODO: Should this be exact containing message descriptor match?
+			panic("mismatching containing message")
+		}
+		if !mi.PBType.ExtensionRanges().Has(fd.Number()) {
+			panic("invalid extension field")
+		}
+		return nil, fd.(pref.ExtensionType)
+	}
+	panic("invalid field descriptor")
+}
diff --git a/internal/impl/message_reflect_gen.go b/internal/impl/message_reflect_gen.go
new file mode 100644
index 0000000..41ba0b9
--- /dev/null
+++ b/internal/impl/message_reflect_gen.go
@@ -0,0 +1,190 @@
+// Copyright 2018 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 generate-types. DO NOT EDIT.
+
+package impl
+
+import (
+	"google.golang.org/protobuf/reflect/protoreflect"
+)
+
+func (m *messageState) Descriptor() protoreflect.MessageDescriptor {
+	return m.mi.PBType.Descriptor()
+}
+func (m *messageState) New() protoreflect.Message {
+	return m.mi.PBType.New()
+}
+func (m *messageState) Interface() protoreflect.ProtoMessage {
+	return m.ProtoUnwrap().(protoreflect.ProtoMessage)
+}
+func (m *messageState) ProtoUnwrap() interface{} {
+	return m.pointer().AsIfaceOf(m.mi.GoType.Elem())
+}
+
+func (m *messageState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
+	m.mi.init()
+	for _, fi := range m.mi.fields {
+		if fi.has(m.pointer()) {
+			if !f(fi.fieldDesc, fi.get(m.pointer())) {
+				return
+			}
+		}
+	}
+	m.mi.extensionMap(m.pointer()).Range(f)
+}
+func (m *messageState) Has(fd protoreflect.FieldDescriptor) bool {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.has(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Has(xt)
+	}
+}
+func (m *messageState) Clear(fd protoreflect.FieldDescriptor) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.clear(m.pointer())
+	} else {
+		m.mi.extensionMap(m.pointer()).Clear(xt)
+	}
+}
+func (m *messageState) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.get(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Get(xt)
+	}
+}
+func (m *messageState) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.set(m.pointer(), v)
+	} else {
+		m.mi.extensionMap(m.pointer()).Set(xt, v)
+	}
+}
+func (m *messageState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.mutable(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Mutable(xt)
+	}
+}
+func (m *messageState) NewMessage(fd protoreflect.FieldDescriptor) protoreflect.Message {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.newMessage()
+	} else {
+		return xt.New().Message()
+	}
+}
+func (m *messageState) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
+	m.mi.init()
+	if oi := m.mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
+		return od.Fields().ByNumber(oi.which(m.pointer()))
+	}
+	panic("invalid oneof descriptor")
+}
+func (m *messageState) GetUnknown() protoreflect.RawFields {
+	m.mi.init()
+	return m.mi.getUnknown(m.pointer())
+}
+func (m *messageState) SetUnknown(b protoreflect.RawFields) {
+	m.mi.init()
+	m.mi.setUnknown(m.pointer(), b)
+}
+
+func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor {
+	return m.mi.PBType.Descriptor()
+}
+func (m *messageReflectWrapper) New() protoreflect.Message {
+	return m.mi.PBType.New()
+}
+func (m *messageReflectWrapper) Interface() protoreflect.ProtoMessage {
+	if m, ok := m.ProtoUnwrap().(protoreflect.ProtoMessage); ok {
+		return m
+	}
+	return (*messageIfaceWrapper)(m)
+}
+func (m *messageReflectWrapper) ProtoUnwrap() interface{} {
+	return m.pointer().AsIfaceOf(m.mi.GoType.Elem())
+}
+
+func (m *messageReflectWrapper) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
+	m.mi.init()
+	for _, fi := range m.mi.fields {
+		if fi.has(m.pointer()) {
+			if !f(fi.fieldDesc, fi.get(m.pointer())) {
+				return
+			}
+		}
+	}
+	m.mi.extensionMap(m.pointer()).Range(f)
+}
+func (m *messageReflectWrapper) Has(fd protoreflect.FieldDescriptor) bool {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.has(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Has(xt)
+	}
+}
+func (m *messageReflectWrapper) Clear(fd protoreflect.FieldDescriptor) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.clear(m.pointer())
+	} else {
+		m.mi.extensionMap(m.pointer()).Clear(xt)
+	}
+}
+func (m *messageReflectWrapper) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.get(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Get(xt)
+	}
+}
+func (m *messageReflectWrapper) Set(fd protoreflect.FieldDescriptor, v protoreflect.Value) {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		fi.set(m.pointer(), v)
+	} else {
+		m.mi.extensionMap(m.pointer()).Set(xt, v)
+	}
+}
+func (m *messageReflectWrapper) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.mutable(m.pointer())
+	} else {
+		return m.mi.extensionMap(m.pointer()).Mutable(xt)
+	}
+}
+func (m *messageReflectWrapper) NewMessage(fd protoreflect.FieldDescriptor) protoreflect.Message {
+	m.mi.init()
+	if fi, xt := m.mi.checkField(fd); fi != nil {
+		return fi.newMessage()
+	} else {
+		return xt.New().Message()
+	}
+}
+func (m *messageReflectWrapper) WhichOneof(od protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
+	m.mi.init()
+	if oi := m.mi.oneofs[od.Name()]; oi != nil && oi.oneofDesc == od {
+		return od.Fields().ByNumber(oi.which(m.pointer()))
+	}
+	panic("invalid oneof descriptor")
+}
+func (m *messageReflectWrapper) GetUnknown() protoreflect.RawFields {
+	m.mi.init()
+	return m.mi.getUnknown(m.pointer())
+}
+func (m *messageReflectWrapper) SetUnknown(b protoreflect.RawFields) {
+	m.mi.init()
+	m.mi.setUnknown(m.pointer(), b)
+}
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index af7196d..f2fd290 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -8,7 +8,9 @@
 	"fmt"
 	"math"
 	"reflect"
+	"runtime"
 	"strings"
+	"sync"
 	"testing"
 
 	cmp "github.com/google/go-cmp/cmp"
@@ -23,6 +25,7 @@
 	"google.golang.org/protobuf/reflect/prototype"
 
 	proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
+	testpb "google.golang.org/protobuf/internal/testprotos/test"
 	"google.golang.org/protobuf/types/descriptorpb"
 )
 
@@ -1435,3 +1438,71 @@
 	}
 	return strings.Join(ss, ".")
 }
+
+// The MessageState implementation makes the assumption that when a
+// concrete message is unsafe casted as a *MessageState, the Go GC does
+// not reclaim the memory for the remainder of the concrete message.
+func TestUnsafeAssumptions(t *testing.T) {
+	if !pimpl.UnsafeEnabled {
+		t.Skip()
+	}
+
+	var wg sync.WaitGroup
+	for i := 0; i < 10; i++ {
+		wg.Add(1)
+		go func() {
+			var ms [10]pref.Message
+
+			// Store the message only in its reflective form.
+			// Trigger the GC after each iteration.
+			for j := 0; j < 10; j++ {
+				ms[j] = (&testpb.TestAllTypes{
+					OptionalInt32: scalar.Int32(int32(j)),
+					OptionalFloat: scalar.Float32(float32(j)),
+					RepeatedInt32: []int32{int32(j)},
+					RepeatedFloat: []float32{float32(j)},
+					DefaultInt32:  scalar.Int32(int32(j)),
+					DefaultFloat:  scalar.Float32(float32(j)),
+				}).ProtoReflect()
+				runtime.GC()
+			}
+
+			// Convert the reflective form back into a concrete form.
+			// Verify that the values written previously are still the same.
+			for j := 0; j < 10; j++ {
+				switch m := ms[j].Interface().(*testpb.TestAllTypes); {
+				case m.GetOptionalInt32() != int32(j):
+				case m.GetOptionalFloat() != float32(j):
+				case m.GetRepeatedInt32()[0] != int32(j):
+				case m.GetRepeatedFloat()[0] != float32(j):
+				case m.GetDefaultInt32() != int32(j):
+				case m.GetDefaultFloat() != float32(j):
+				default:
+					continue
+				}
+				t.Error("memory corrupted detected")
+			}
+			defer wg.Done()
+		}()
+	}
+	wg.Wait()
+}
+
+func BenchmarkName(b *testing.B) {
+	var sink pref.FullName
+	b.Run("Value", func(b *testing.B) {
+		b.ReportAllocs()
+		m := new(descriptorpb.FileDescriptorProto)
+		for i := 0; i < b.N; i++ {
+			sink = m.ProtoReflect().Descriptor().FullName()
+		}
+	})
+	b.Run("Nil", func(b *testing.B) {
+		b.ReportAllocs()
+		m := (*descriptorpb.FileDescriptorProto)(nil)
+		for i := 0; i < b.N; i++ {
+			sink = m.ProtoReflect().Descriptor().FullName()
+		}
+	})
+	runtime.KeepAlive(sink)
+}
diff --git a/internal/impl/pointer_reflect.go b/internal/impl/pointer_reflect.go
index 0a9c53e..020af8e 100644
--- a/internal/impl/pointer_reflect.go
+++ b/internal/impl/pointer_reflect.go
@@ -9,10 +9,14 @@
 import (
 	"fmt"
 	"reflect"
+	"sync"
 )
 
 const UnsafeEnabled = false
 
+// Pointer is an opaque pointer type.
+type Pointer interface{}
+
 // offset represents the offset to a struct field, accessible from a pointer.
 // The offset is the field index into a struct.
 type offset struct {
@@ -46,6 +50,11 @@
 // pointer is an abstract representation of a pointer to a struct or field.
 type pointer struct{ v reflect.Value }
 
+// pointerOf returns p as a pointer.
+func pointerOf(p Pointer) pointer {
+	return pointerOfIface(p)
+}
+
 // pointerOfValue returns v as a pointer.
 func pointerOfValue(v reflect.Value) pointer {
 	return pointer{v: v}
@@ -146,3 +155,21 @@
 func (p pointer) SetPointer(v pointer) {
 	p.v.Elem().Set(v.v)
 }
+
+func (Export) MessageStateOf(p Pointer) *messageState     { panic("not supported") }
+func (ms *messageState) pointer() pointer                 { panic("not supported") }
+func (ms *messageState) LoadMessageInfo() *MessageInfo    { panic("not supported") }
+func (ms *messageState) StoreMessageInfo(mi *MessageInfo) { panic("not supported") }
+
+type atomicNilMessage struct {
+	once sync.Once
+	m    messageReflectWrapper
+}
+
+func (m *atomicNilMessage) Init(mi *MessageInfo) *messageReflectWrapper {
+	m.once.Do(func() {
+		m.m.p = pointerOfIface(reflect.Zero(mi.GoType).Interface())
+		m.m.mi = mi
+	})
+	return &m.m
+}
diff --git a/internal/impl/pointer_unsafe.go b/internal/impl/pointer_unsafe.go
index ceca3b2..ab0d6ee 100644
--- a/internal/impl/pointer_unsafe.go
+++ b/internal/impl/pointer_unsafe.go
@@ -8,11 +8,15 @@
 
 import (
 	"reflect"
+	"sync/atomic"
 	"unsafe"
 )
 
 const UnsafeEnabled = true
 
+// Pointer is an opaque pointer type.
+type Pointer unsafe.Pointer
+
 // offset represents the offset to a struct field, accessible from a pointer.
 // The offset is the byte offset to the field from the start of the struct.
 type offset uintptr
@@ -34,6 +38,11 @@
 // pointer is a pointer to a message struct or field.
 type pointer struct{ p unsafe.Pointer }
 
+// pointerOf returns p as a pointer.
+func pointerOf(p Pointer) pointer {
+	return pointer{p: unsafe.Pointer(p)}
+}
+
 // pointerOfValue returns v as a pointer.
 func pointerOfValue(v reflect.Value) pointer {
 	return pointer{p: unsafe.Pointer(v.Pointer())}
@@ -125,3 +134,30 @@
 func (p pointer) SetPointer(v pointer) {
 	*(*unsafe.Pointer)(p.p) = (unsafe.Pointer)(v.p)
 }
+
+// Static check that MessageState does not exceed the size of a pointer.
+const _ = uint(unsafe.Sizeof(unsafe.Pointer(nil)) - unsafe.Sizeof(MessageState{}))
+
+func (Export) MessageStateOf(p Pointer) *messageState {
+	// Super-tricky - see documentation on MessageState.
+	return (*messageState)(unsafe.Pointer(p))
+}
+func (ms *messageState) pointer() pointer {
+	// Super-tricky - see documentation on MessageState.
+	return pointer{p: unsafe.Pointer(ms)}
+}
+func (ms *messageState) LoadMessageInfo() *MessageInfo {
+	return (*MessageInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&ms.mi))))
+}
+func (ms *messageState) StoreMessageInfo(mi *MessageInfo) {
+	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&ms.mi)), unsafe.Pointer(mi))
+}
+
+type atomicNilMessage struct{ m messageReflectWrapper }
+
+func (m *atomicNilMessage) Init(mi *MessageInfo) *messageReflectWrapper {
+	if (*messageReflectWrapper)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&m.m.mi)))) == nil {
+		atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&m.m.mi)), unsafe.Pointer(mi))
+	}
+	return &m.m
+}
diff --git a/internal/testprotos/benchmarks/benchmarks.pb.go b/internal/testprotos/benchmarks/benchmarks.pb.go
index 2545f7d..5479355 100644
--- a/internal/testprotos/benchmarks/benchmarks.pb.go
+++ b/internal/testprotos/benchmarks/benchmarks.pb.go
@@ -18,6 +18,7 @@
 )
 
 type BenchmarkDataset struct {
+	state protoimpl.MessageState
 	// Name of the benchmark dataset.  This should be unique across all datasets.
 	// Should only contain word characters: [a-zA-Z0-9_]
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
@@ -58,10 +59,18 @@
 func (*BenchmarkDataset) ProtoMessage() {}
 
 func (x *BenchmarkDataset) ProtoReflect() protoreflect.Message {
-	return file_benchmarks_proto_msgTypes[0].MessageOf(x)
+	mi := &file_benchmarks_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *BenchmarkDataset) XXX_Methods() *protoiface.Methods {
+func (x *BenchmarkDataset) XXX_Methods() *protoiface.Methods {
 	return file_benchmarks_proto_msgTypes[0].Methods()
 }
 
@@ -143,9 +152,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_benchmarks_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BenchmarkDataset); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.go b/internal/testprotos/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.go
index ff3c7da..3ec1ece 100644
--- a/internal/testprotos/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message1/proto2/benchmark_message1_proto2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type GoogleMessage1 struct {
+	state         protoimpl.MessageState
 	Field1        *string                   `protobuf:"bytes,1,req,name=field1" json:"field1,omitempty"`
 	Field9        *string                   `protobuf:"bytes,9,opt,name=field9" json:"field9,omitempty"`
 	Field18       *string                   `protobuf:"bytes,18,opt,name=field18" json:"field18,omitempty"`
@@ -74,10 +75,18 @@
 func (*GoogleMessage1) ProtoMessage() {}
 
 func (x *GoogleMessage1) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage1) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage1) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[0].Methods()
 }
 
@@ -399,6 +408,7 @@
 }
 
 type GoogleMessage1SubMessage struct {
+	state         protoimpl.MessageState
 	Field1        *int32  `protobuf:"varint,1,opt,name=field1,def=0" json:"field1,omitempty"`
 	Field2        *int32  `protobuf:"varint,2,opt,name=field2,def=0" json:"field2,omitempty"`
 	Field3        *int32  `protobuf:"varint,3,opt,name=field3,def=0" json:"field3,omitempty"`
@@ -434,10 +444,18 @@
 func (*GoogleMessage1SubMessage) ProtoMessage() {}
 
 func (x *GoogleMessage1SubMessage) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage1SubMessage) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage1SubMessage) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[1].Methods()
 }
 
@@ -766,9 +784,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage1); i {
-			case 41:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 42:
+				return &v.sizeCache
+			case 43:
 				return &v.unknownFields
 			default:
 				return nil
@@ -776,9 +796,11 @@
 		}
 		file_datasets_google_message1_proto2_benchmark_message1_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage1SubMessage); i {
-			case 20:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 21:
+				return &v.sizeCache
+			case 22:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.go b/internal/testprotos/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.go
index 8103da7..2ed4a83 100644
--- a/internal/testprotos/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message1/proto3/benchmark_message1_proto3.pb.go
@@ -18,6 +18,7 @@
 )
 
 type GoogleMessage1 struct {
+	state         protoimpl.MessageState
 	Field1        string                    `protobuf:"bytes,1,opt,name=field1,proto3" json:"field1,omitempty"`
 	Field9        string                    `protobuf:"bytes,9,opt,name=field9,proto3" json:"field9,omitempty"`
 	Field18       string                    `protobuf:"bytes,18,opt,name=field18,proto3" json:"field18,omitempty"`
@@ -74,10 +75,18 @@
 func (*GoogleMessage1) ProtoMessage() {}
 
 func (x *GoogleMessage1) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage1) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage1) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[0].Methods()
 }
 
@@ -374,6 +383,7 @@
 }
 
 type GoogleMessage1SubMessage struct {
+	state         protoimpl.MessageState
 	Field1        int32  `protobuf:"varint,1,opt,name=field1,proto3" json:"field1,omitempty"`
 	Field2        int32  `protobuf:"varint,2,opt,name=field2,proto3" json:"field2,omitempty"`
 	Field3        int32  `protobuf:"varint,3,opt,name=field3,proto3" json:"field3,omitempty"`
@@ -409,10 +419,18 @@
 func (*GoogleMessage1SubMessage) ProtoMessage() {}
 
 func (x *GoogleMessage1SubMessage) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage1SubMessage) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage1SubMessage) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[1].Methods()
 }
 
@@ -721,9 +739,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage1); i {
-			case 41:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 42:
+				return &v.sizeCache
+			case 43:
 				return &v.unknownFields
 			default:
 				return nil
@@ -731,9 +751,11 @@
 		}
 		file_datasets_google_message1_proto3_benchmark_message1_proto3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage1SubMessage); i {
-			case 20:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 21:
+				return &v.sizeCache
+			case 22:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message2/benchmark_message2.pb.go b/internal/testprotos/benchmarks/datasets/google_message2/benchmark_message2.pb.go
index dd875d6..5b048f1 100644
--- a/internal/testprotos/benchmarks/datasets/google_message2/benchmark_message2.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message2/benchmark_message2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type GoogleMessage2 struct {
+	state         protoimpl.MessageState
 	Field1        *string                  `protobuf:"bytes,1,opt,name=field1" json:"field1,omitempty"`
 	Field3        *int64                   `protobuf:"varint,3,opt,name=field3" json:"field3,omitempty"`
 	Field4        *int64                   `protobuf:"varint,4,opt,name=field4" json:"field4,omitempty"`
@@ -63,10 +64,18 @@
 func (*GoogleMessage2) ProtoMessage() {}
 
 func (x *GoogleMessage2) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message2_benchmark_message2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage2) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage2) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[0].Methods()
 }
 
@@ -302,6 +311,7 @@
 }
 
 type GoogleMessage2GroupedMessage struct {
+	state         protoimpl.MessageState
 	Field1        *float32 `protobuf:"fixed32,1,opt,name=field1" json:"field1,omitempty"`
 	Field2        *float32 `protobuf:"fixed32,2,opt,name=field2" json:"field2,omitempty"`
 	Field3        *float32 `protobuf:"fixed32,3,opt,name=field3,def=0" json:"field3,omitempty"`
@@ -328,10 +338,18 @@
 func (*GoogleMessage2GroupedMessage) ProtoMessage() {}
 
 func (x *GoogleMessage2GroupedMessage) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message2_benchmark_message2_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage2GroupedMessage) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage2GroupedMessage) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[1].Methods()
 }
 
@@ -422,6 +440,7 @@
 }
 
 type GoogleMessage2_Group1 struct {
+	state         protoimpl.MessageState
 	Field11       *float32                      `protobuf:"fixed32,11,req,name=field11" json:"field11,omitempty"`
 	Field26       *float32                      `protobuf:"fixed32,26,opt,name=field26" json:"field26,omitempty"`
 	Field12       *string                       `protobuf:"bytes,12,opt,name=field12" json:"field12,omitempty"`
@@ -453,10 +472,18 @@
 func (*GoogleMessage2_Group1) ProtoMessage() {}
 
 func (x *GoogleMessage2_Group1) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message2_benchmark_message2_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage2_Group1) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage2_Group1) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message2_benchmark_message2_proto_msgTypes[2].Methods()
 }
 
@@ -741,9 +768,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message2_benchmark_message2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage2); i {
-			case 30:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 31:
+				return &v.sizeCache
+			case 32:
 				return &v.unknownFields
 			default:
 				return nil
@@ -751,9 +780,11 @@
 		}
 		file_datasets_google_message2_benchmark_message2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage2GroupedMessage); i {
-			case 11:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 12:
+				return &v.sizeCache
+			case 13:
 				return &v.unknownFields
 			default:
 				return nil
@@ -761,9 +792,11 @@
 		}
 		file_datasets_google_message2_benchmark_message2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage2_Group1); i {
-			case 16:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 17:
+				return &v.sizeCache
+			case 18:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3.pb.go
index 39433b3..0ea2e92 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3.pb.go
@@ -18,6 +18,7 @@
 )
 
 type GoogleMessage3 struct {
+	state         protoimpl.MessageState
 	Field37519    *Message37487       `protobuf:"bytes,2,opt,name=field37519" json:"field37519,omitempty"`
 	Field37520    *Message36876       `protobuf:"bytes,3,opt,name=field37520" json:"field37520,omitempty"`
 	Field37521    *Message13062       `protobuf:"bytes,4,opt,name=field37521" json:"field37521,omitempty"`
@@ -48,10 +49,18 @@
 func (*GoogleMessage3) ProtoMessage() {}
 
 func (x *GoogleMessage3) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage3) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage3) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[0].Methods()
 }
 
@@ -166,6 +175,7 @@
 }
 
 type Message1327 struct {
+	state         protoimpl.MessageState
 	Field1369     []*UnusedEmptyMessage `protobuf:"bytes,1,rep,name=field1369" json:"field1369,omitempty"`
 	Field1370     []*Message1328        `protobuf:"bytes,3,rep,name=field1370" json:"field1370,omitempty"`
 	Field1371     []*UnusedEmptyMessage `protobuf:"bytes,5,rep,name=field1371" json:"field1371,omitempty"`
@@ -185,10 +195,18 @@
 func (*Message1327) ProtoMessage() {}
 
 func (x *Message1327) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1327) XXX_Methods() *protoiface.Methods {
+func (x *Message1327) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[1].Methods()
 }
 
@@ -226,6 +244,7 @@
 }
 
 type Message3672 struct {
+	state         protoimpl.MessageState
 	Field3727     *Enum3476                  `protobuf:"varint,1,opt,name=field3727,enum=benchmarks.google_message3.Enum3476" json:"field3727,omitempty"`
 	Field3728     *int32                     `protobuf:"varint,11,opt,name=field3728" json:"field3728,omitempty"`
 	Field3729     *int32                     `protobuf:"varint,2,opt,name=field3729" json:"field3729,omitempty"`
@@ -251,10 +270,18 @@
 func (*Message3672) ProtoMessage() {}
 
 func (x *Message3672) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3672) XXX_Methods() *protoiface.Methods {
+func (x *Message3672) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[2].Methods()
 }
 
@@ -334,6 +361,7 @@
 }
 
 type Message3804 struct {
+	state         protoimpl.MessageState
 	Field3818     *int64     `protobuf:"varint,1,req,name=field3818" json:"field3818,omitempty"`
 	Field3819     *bool      `protobuf:"varint,2,req,name=field3819" json:"field3819,omitempty"`
 	Field3820     []Enum3805 `protobuf:"varint,4,rep,name=field3820,enum=benchmarks.google_message3.Enum3805" json:"field3820,omitempty"`
@@ -356,10 +384,18 @@
 func (*Message3804) ProtoMessage() {}
 
 func (x *Message3804) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3804) XXX_Methods() *protoiface.Methods {
+func (x *Message3804) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[3].Methods()
 }
 
@@ -418,6 +454,7 @@
 }
 
 type Message6849 struct {
+	state         protoimpl.MessageState
 	Field6910     []*Message6850 `protobuf:"bytes,1,rep,name=field6910" json:"field6910,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -434,10 +471,18 @@
 func (*Message6849) ProtoMessage() {}
 
 func (x *Message6849) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6849) XXX_Methods() *protoiface.Methods {
+func (x *Message6849) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[4].Methods()
 }
 
@@ -454,6 +499,7 @@
 }
 
 type Message6866 struct {
+	state         protoimpl.MessageState
 	Field6973     []*Message6863 `protobuf:"bytes,1,rep,name=field6973" json:"field6973,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -470,10 +516,18 @@
 func (*Message6866) ProtoMessage() {}
 
 func (x *Message6866) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6866) XXX_Methods() *protoiface.Methods {
+func (x *Message6866) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[5].Methods()
 }
 
@@ -490,6 +544,7 @@
 }
 
 type Message6870 struct {
+	state         protoimpl.MessageState
 	Field6991     []*Message6871 `protobuf:"bytes,1,rep,name=field6991" json:"field6991,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -506,10 +561,18 @@
 func (*Message6870) ProtoMessage() {}
 
 func (x *Message6870) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6870) XXX_Methods() *protoiface.Methods {
+func (x *Message6870) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[6].Methods()
 }
 
@@ -526,6 +589,7 @@
 }
 
 type Message7651 struct {
+	state         protoimpl.MessageState
 	Field7685     *string               `protobuf:"bytes,1,opt,name=field7685" json:"field7685,omitempty"`
 	Field7686     *int64                `protobuf:"varint,2,opt,name=field7686" json:"field7686,omitempty"`
 	Field7687     *int64                `protobuf:"varint,3,opt,name=field7687" json:"field7687,omitempty"`
@@ -586,10 +650,18 @@
 func (*Message7651) ProtoMessage() {}
 
 func (x *Message7651) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7651) XXX_Methods() *protoiface.Methods {
+func (x *Message7651) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[7].Methods()
 }
 
@@ -914,6 +986,7 @@
 }
 
 type Message7864 struct {
+	state         protoimpl.MessageState
 	Field7866     *string               `protobuf:"bytes,1,opt,name=field7866" json:"field7866,omitempty"`
 	Field7867     *string               `protobuf:"bytes,2,opt,name=field7867" json:"field7867,omitempty"`
 	Field7868     []*Message7865        `protobuf:"bytes,5,rep,name=field7868" json:"field7868,omitempty"`
@@ -935,10 +1008,18 @@
 func (*Message7864) ProtoMessage() {}
 
 func (x *Message7864) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7864) XXX_Methods() *protoiface.Methods {
+func (x *Message7864) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[8].Methods()
 }
 
@@ -990,6 +1071,7 @@
 }
 
 type Message7929 struct {
+	state         protoimpl.MessageState
 	Field7942     *int64                `protobuf:"varint,1,opt,name=field7942" json:"field7942,omitempty"`
 	Field7943     *int64                `protobuf:"varint,4,opt,name=field7943" json:"field7943,omitempty"`
 	Field7944     *int64                `protobuf:"varint,5,opt,name=field7944" json:"field7944,omitempty"`
@@ -1025,10 +1107,18 @@
 func (*Message7929) ProtoMessage() {}
 
 func (x *Message7929) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7929) XXX_Methods() *protoiface.Methods {
+func (x *Message7929) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[9].Methods()
 }
 
@@ -1178,6 +1268,7 @@
 }
 
 type Message8508 struct {
+	state         protoimpl.MessageState
 	Field8517     []*Message8511        `protobuf:"bytes,8,rep,name=field8517" json:"field8517,omitempty"`
 	Field8518     []*Message8512        `protobuf:"bytes,9,rep,name=field8518" json:"field8518,omitempty"`
 	Field8519     []*Message8513        `protobuf:"bytes,11,rep,name=field8519" json:"field8519,omitempty"`
@@ -1210,10 +1301,18 @@
 func (*Message8508) ProtoMessage() {}
 
 func (x *Message8508) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8508) XXX_Methods() *protoiface.Methods {
+func (x *Message8508) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[10].Methods()
 }
 
@@ -1342,6 +1441,7 @@
 }
 
 type Message9122 struct {
+	state         protoimpl.MessageState
 	Field9132     *float32 `protobuf:"fixed32,1,opt,name=field9132" json:"field9132,omitempty"`
 	Field9133     *float32 `protobuf:"fixed32,2,opt,name=field9133" json:"field9133,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1359,10 +1459,18 @@
 func (*Message9122) ProtoMessage() {}
 
 func (x *Message9122) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9122) XXX_Methods() *protoiface.Methods {
+func (x *Message9122) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[11].Methods()
 }
 
@@ -1386,6 +1494,7 @@
 }
 
 type Message10177 struct {
+	state         protoimpl.MessageState
 	Field10270    []*Message10155 `protobuf:"bytes,1,rep,name=field10270" json:"field10270,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1402,10 +1511,18 @@
 func (*Message10177) ProtoMessage() {}
 
 func (x *Message10177) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10177) XXX_Methods() *protoiface.Methods {
+func (x *Message10177) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[12].Methods()
 }
 
@@ -1422,6 +1539,7 @@
 }
 
 type Message10278 struct {
+	state         protoimpl.MessageState
 	Field10286    []int32 `protobuf:"varint,1,rep,packed,name=field10286" json:"field10286,omitempty"`
 	Field10287    []int32 `protobuf:"varint,2,rep,packed,name=field10287" json:"field10287,omitempty"`
 	Field10288    *int32  `protobuf:"varint,3,opt,name=field10288" json:"field10288,omitempty"`
@@ -1440,10 +1558,18 @@
 func (*Message10278) ProtoMessage() {}
 
 func (x *Message10278) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10278) XXX_Methods() *protoiface.Methods {
+func (x *Message10278) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[13].Methods()
 }
 
@@ -1474,6 +1600,7 @@
 }
 
 type Message10323 struct {
+	state         protoimpl.MessageState
 	Field10360    []*Message10320 `protobuf:"bytes,1,rep,name=field10360" json:"field10360,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1490,10 +1617,18 @@
 func (*Message10323) ProtoMessage() {}
 
 func (x *Message10323) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10323) XXX_Methods() *protoiface.Methods {
+func (x *Message10323) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[14].Methods()
 }
 
@@ -1510,6 +1645,7 @@
 }
 
 type Message10324 struct {
+	state         protoimpl.MessageState
 	Field10362    []*Message10322 `protobuf:"bytes,1,rep,name=field10362" json:"field10362,omitempty"`
 	Field10363    *Message10321   `protobuf:"bytes,2,opt,name=field10363" json:"field10363,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1527,10 +1663,18 @@
 func (*Message10324) ProtoMessage() {}
 
 func (x *Message10324) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10324) XXX_Methods() *protoiface.Methods {
+func (x *Message10324) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[15].Methods()
 }
 
@@ -1554,6 +1698,7 @@
 }
 
 type Message11990 struct {
+	state         protoimpl.MessageState
 	Field12030    []*Message11988 `protobuf:"bytes,1,rep,name=field12030" json:"field12030,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1570,10 +1715,18 @@
 func (*Message11990) ProtoMessage() {}
 
 func (x *Message11990) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11990) XXX_Methods() *protoiface.Methods {
+func (x *Message11990) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[16].Methods()
 }
 
@@ -1590,6 +1743,7 @@
 }
 
 type Message12691 struct {
+	state         protoimpl.MessageState
 	Field12713    *string       `protobuf:"bytes,1,opt,name=field12713" json:"field12713,omitempty"`
 	Field12714    *int32        `protobuf:"varint,2,opt,name=field12714" json:"field12714,omitempty"`
 	Field12715    *Message12668 `protobuf:"bytes,3,opt,name=field12715" json:"field12715,omitempty"`
@@ -1608,10 +1762,18 @@
 func (*Message12691) ProtoMessage() {}
 
 func (x *Message12691) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12691) XXX_Methods() *protoiface.Methods {
+func (x *Message12691) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[17].Methods()
 }
 
@@ -1642,6 +1804,7 @@
 }
 
 type Message12870 struct {
+	state         protoimpl.MessageState
 	Field12879    *int32          `protobuf:"varint,1,req,name=field12879" json:"field12879,omitempty"`
 	Field12880    *int32          `protobuf:"varint,7,opt,name=field12880" json:"field12880,omitempty"`
 	Field12881    *int32          `protobuf:"varint,2,req,name=field12881" json:"field12881,omitempty"`
@@ -1677,10 +1840,18 @@
 func (*Message12870) ProtoMessage() {}
 
 func (x *Message12870) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12870) XXX_Methods() *protoiface.Methods {
+func (x *Message12870) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[18].Methods()
 }
 
@@ -1830,6 +2001,7 @@
 }
 
 type Message13154 struct {
+	state         protoimpl.MessageState
 	Field13164    *float32 `protobuf:"fixed32,1,req,name=field13164" json:"field13164,omitempty"`
 	Field13165    *float32 `protobuf:"fixed32,2,req,name=field13165" json:"field13165,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1847,10 +2019,18 @@
 func (*Message13154) ProtoMessage() {}
 
 func (x *Message13154) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13154) XXX_Methods() *protoiface.Methods {
+func (x *Message13154) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[19].Methods()
 }
 
@@ -1874,6 +2054,7 @@
 }
 
 type Message16507 struct {
+	state           protoimpl.MessageState
 	Field16510      *bool                 `protobuf:"varint,3,opt,name=field16510" json:"field16510,omitempty"`
 	Field16511      *bool                 `protobuf:"varint,4,opt,name=field16511" json:"field16511,omitempty"`
 	Field16512      *bool                 `protobuf:"varint,14,opt,name=field16512" json:"field16512,omitempty"`
@@ -1922,10 +2103,18 @@
 func (*Message16507) ProtoMessage() {}
 
 func (x *Message16507) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16507) XXX_Methods() *protoiface.Methods {
+func (x *Message16507) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[20].Methods()
 }
 
@@ -2168,6 +2357,7 @@
 }
 
 type Message16564 struct {
+	state         protoimpl.MessageState
 	Field16568    []*Message16552 `protobuf:"bytes,1,rep,name=field16568" json:"field16568,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2184,10 +2374,18 @@
 func (*Message16564) ProtoMessage() {}
 
 func (x *Message16564) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16564) XXX_Methods() *protoiface.Methods {
+func (x *Message16564) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[21].Methods()
 }
 
@@ -2204,6 +2402,7 @@
 }
 
 type Message16661 struct {
+	state         protoimpl.MessageState
 	Field16671    []*Message16660 `protobuf:"bytes,1,rep,name=field16671" json:"field16671,omitempty"`
 	Field16672    []uint64        `protobuf:"varint,2,rep,name=field16672" json:"field16672,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2221,10 +2420,18 @@
 func (*Message16661) ProtoMessage() {}
 
 func (x *Message16661) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16661) XXX_Methods() *protoiface.Methods {
+func (x *Message16661) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[22].Methods()
 }
 
@@ -2248,6 +2455,7 @@
 }
 
 type Message16746 struct {
+	state         protoimpl.MessageState
 	Field16806    []*Message16727 `protobuf:"bytes,1,rep,name=field16806" json:"field16806,omitempty"`
 	Field16807    *bool           `protobuf:"varint,2,opt,name=field16807" json:"field16807,omitempty"`
 	Field16808    *bool           `protobuf:"varint,3,opt,name=field16808" json:"field16808,omitempty"`
@@ -2267,10 +2475,18 @@
 func (*Message16746) ProtoMessage() {}
 
 func (x *Message16746) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16746) XXX_Methods() *protoiface.Methods {
+func (x *Message16746) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[23].Methods()
 }
 
@@ -2308,6 +2524,7 @@
 }
 
 type Message17786 struct {
+	state         protoimpl.MessageState
 	Message17787  []*Message17786_Message17787 `protobuf:"group,1,rep,name=Message17787,json=message17787" json:"message17787,omitempty"`
 	Field18175    []*Message17782              `protobuf:"bytes,20,rep,name=field18175" json:"field18175,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2325,10 +2542,18 @@
 func (*Message17786) ProtoMessage() {}
 
 func (x *Message17786) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17786) XXX_Methods() *protoiface.Methods {
+func (x *Message17786) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[24].Methods()
 }
 
@@ -2352,6 +2577,7 @@
 }
 
 type Message22857 struct {
+	state         protoimpl.MessageState
 	Field22874    []*Message22853 `protobuf:"bytes,1,rep,name=field22874" json:"field22874,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2368,10 +2594,18 @@
 func (*Message22857) ProtoMessage() {}
 
 func (x *Message22857) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message22857) XXX_Methods() *protoiface.Methods {
+func (x *Message22857) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[25].Methods()
 }
 
@@ -2388,6 +2622,7 @@
 }
 
 type Message24404 struct {
+	state         protoimpl.MessageState
 	Message24405  []*Message24404_Message24405 `protobuf:"group,1,rep,name=Message24405,json=message24405" json:"message24405,omitempty"`
 	Field24684    *Message24403                `protobuf:"bytes,30,opt,name=field24684" json:"field24684,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2405,10 +2640,18 @@
 func (*Message24404) ProtoMessage() {}
 
 func (x *Message24404) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24404) XXX_Methods() *protoiface.Methods {
+func (x *Message24404) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[26].Methods()
 }
 
@@ -2432,6 +2675,7 @@
 }
 
 type Message27300 struct {
+	state         protoimpl.MessageState
 	Field27302    []*UnusedEmptyMessage `protobuf:"bytes,1,rep,name=field27302" json:"field27302,omitempty"`
 	Field27303    *string               `protobuf:"bytes,2,opt,name=field27303" json:"field27303,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2449,10 +2693,18 @@
 func (*Message27300) ProtoMessage() {}
 
 func (x *Message27300) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27300) XXX_Methods() *protoiface.Methods {
+func (x *Message27300) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[27].Methods()
 }
 
@@ -2476,6 +2728,7 @@
 }
 
 type Message27453 struct {
+	state         protoimpl.MessageState
 	Field27459    *string             `protobuf:"bytes,15,opt,name=field27459" json:"field27459,omitempty"`
 	Field27460    []string            `protobuf:"bytes,1,rep,name=field27460" json:"field27460,omitempty"`
 	Field27461    []float32           `protobuf:"fixed32,6,rep,name=field27461" json:"field27461,omitempty"`
@@ -2514,10 +2767,18 @@
 func (*Message27453) ProtoMessage() {}
 
 func (x *Message27453) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27453) XXX_Methods() *protoiface.Methods {
+func (x *Message27453) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[28].Methods()
 }
 
@@ -2688,6 +2949,7 @@
 }
 
 type Message3672_Message3673 struct {
+	state         protoimpl.MessageState
 	Field3738     *Enum3476 `protobuf:"varint,4,req,name=field3738,enum=benchmarks.google_message3.Enum3476" json:"field3738,omitempty"`
 	Field3739     *int32    `protobuf:"varint,5,req,name=field3739" json:"field3739,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2705,10 +2967,18 @@
 func (*Message3672_Message3673) ProtoMessage() {}
 
 func (x *Message3672_Message3673) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3672_Message3673) XXX_Methods() *protoiface.Methods {
+func (x *Message3672_Message3673) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[29].Methods()
 }
 
@@ -2732,6 +3002,7 @@
 }
 
 type Message3672_Message3674 struct {
+	state         protoimpl.MessageState
 	Field3740     *Enum3476 `protobuf:"varint,7,req,name=field3740,enum=benchmarks.google_message3.Enum3476" json:"field3740,omitempty"`
 	Field3741     *int32    `protobuf:"varint,8,req,name=field3741" json:"field3741,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2749,10 +3020,18 @@
 func (*Message3672_Message3674) ProtoMessage() {}
 
 func (x *Message3672_Message3674) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3672_Message3674) XXX_Methods() *protoiface.Methods {
+func (x *Message3672_Message3674) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[30].Methods()
 }
 
@@ -2776,6 +3055,7 @@
 }
 
 type Message17786_Message17787 struct {
+	state         protoimpl.MessageState
 	Field18177    *int32                `protobuf:"varint,2,req,name=field18177" json:"field18177,omitempty"`
 	Field18178    *int32                `protobuf:"varint,3,req,name=field18178" json:"field18178,omitempty"`
 	Field18179    *Message17783         `protobuf:"bytes,4,opt,name=field18179" json:"field18179,omitempty"`
@@ -2817,10 +3097,18 @@
 func (*Message17786_Message17787) ProtoMessage() {}
 
 func (x *Message17786_Message17787) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17786_Message17787) XXX_Methods() *protoiface.Methods {
+func (x *Message17786_Message17787) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[31].Methods()
 }
 
@@ -3012,6 +3300,7 @@
 }
 
 type Message24404_Message24405 struct {
+	state         protoimpl.MessageState
 	Field24686    *int32              `protobuf:"varint,2,req,name=field24686" json:"field24686,omitempty"`
 	Field24687    *int32              `protobuf:"varint,3,req,name=field24687" json:"field24687,omitempty"`
 	Field24688    *Message24317       `protobuf:"bytes,4,opt,name=field24688" json:"field24688,omitempty"`
@@ -3058,10 +3347,18 @@
 func (*Message24404_Message24405) ProtoMessage() {}
 
 func (x *Message24404_Message24405) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24404_Message24405) XXX_Methods() *protoiface.Methods {
+func (x *Message24404_Message24405) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_proto_msgTypes[32].Methods()
 }
 
@@ -6007,9 +6304,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage3); i {
-			case 15:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 16:
+				return &v.sizeCache
+			case 17:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6017,9 +6316,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1327); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6027,9 +6328,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3672); i {
-			case 10:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 11:
+				return &v.sizeCache
+			case 12:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6037,6 +6340,68 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3804); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6849); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6866); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6870); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7651); i {
+			case 0:
+				return &v.state
+			case 46:
+				return &v.sizeCache
+			case 47:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7864); i {
+			case 0:
+				return &v.state
 			case 7:
 				return &v.sizeCache
 			case 8:
@@ -6045,61 +6410,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6849); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6866); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6870); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7651); i {
-			case 45:
-				return &v.sizeCache
-			case 46:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7864); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7929); i {
-			case 20:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 21:
+				return &v.sizeCache
+			case 22:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6107,9 +6424,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8508); i {
-			case 17:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 18:
+				return &v.sizeCache
+			case 19:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6117,9 +6436,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9122); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6127,9 +6448,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10177); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6137,108 +6460,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10278); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10323); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10324); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11990); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12691); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12870); i {
-			case 20:
-				return &v.sizeCache
-			case 21:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13154); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16507); i {
-			case 32:
-				return &v.sizeCache
-			case 33:
-				return &v.unknownFields
-			case 34:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16564); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16661); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16746); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -6247,8 +6470,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message17786); i {
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10323); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -6257,11 +6482,135 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10324); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11990); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12691); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12870); i {
+			case 0:
+				return &v.state
+			case 21:
+				return &v.sizeCache
+			case 22:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13154); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16507); i {
+			case 0:
+				return &v.state
+			case 33:
+				return &v.sizeCache
+			case 34:
+				return &v.unknownFields
+			case 35:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16564); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16661); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16746); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message17786); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message22857); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6269,9 +6618,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24404); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6279,9 +6630,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message27300); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6289,9 +6642,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message27453); i {
-			case 23:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 24:
+				return &v.sizeCache
+			case 25:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6299,9 +6654,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3672_Message3673); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6309,9 +6666,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3672_Message3674); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6319,9 +6678,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message17786_Message17787); i {
-			case 26:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 27:
+				return &v.sizeCache
+			case 28:
 				return &v.unknownFields
 			default:
 				return nil
@@ -6329,9 +6690,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24404_Message24405); i {
-			case 31:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 32:
+				return &v.sizeCache
+			case 33:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_1.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_1.pb.go
index b233fad..4446b50 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_1.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_1.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message34390 struct {
+	state         protoimpl.MessageState
 	Field34452    []*Message34387 `protobuf:"bytes,1,rep,name=field34452" json:"field34452,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -34,10 +35,18 @@
 func (*Message34390) ProtoMessage() {}
 
 func (x *Message34390) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34390) XXX_Methods() *protoiface.Methods {
+func (x *Message34390) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[0].Methods()
 }
 
@@ -54,6 +63,7 @@
 }
 
 type Message34624 struct {
+	state         protoimpl.MessageState
 	Field34683    *Message34621 `protobuf:"bytes,1,opt,name=field34683" json:"field34683,omitempty"`
 	Field34684    *Message34621 `protobuf:"bytes,2,opt,name=field34684" json:"field34684,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -71,10 +81,18 @@
 func (*Message34624) ProtoMessage() {}
 
 func (x *Message34624) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34624) XXX_Methods() *protoiface.Methods {
+func (x *Message34624) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[1].Methods()
 }
 
@@ -98,6 +116,7 @@
 }
 
 type Message34791 struct {
+	state         protoimpl.MessageState
 	Field34793    *uint64                      `protobuf:"fixed64,1,opt,name=field34793" json:"field34793,omitempty"`
 	Message34792  []*Message34791_Message34792 `protobuf:"group,2,rep,name=Message34792,json=message34792" json:"message34792,omitempty"`
 	Field34795    *int32                       `protobuf:"varint,5,opt,name=field34795" json:"field34795,omitempty"`
@@ -127,10 +146,18 @@
 func (*Message34791) ProtoMessage() {}
 
 func (x *Message34791) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34791) XXX_Methods() *protoiface.Methods {
+func (x *Message34791) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[2].Methods()
 }
 
@@ -238,6 +265,7 @@
 }
 
 type Message35483 struct {
+	state         protoimpl.MessageState
 	Field35499    *int32              `protobuf:"varint,1,opt,name=field35499" json:"field35499,omitempty"`
 	Field35500    *string             `protobuf:"bytes,2,opt,name=field35500" json:"field35500,omitempty"`
 	Field35501    *string             `protobuf:"bytes,3,opt,name=field35501" json:"field35501,omitempty"`
@@ -259,10 +287,18 @@
 func (*Message35483) ProtoMessage() {}
 
 func (x *Message35483) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35483) XXX_Methods() *protoiface.Methods {
+func (x *Message35483) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[3].Methods()
 }
 
@@ -314,6 +350,7 @@
 }
 
 type Message35807 struct {
+	state         protoimpl.MessageState
 	Field35810    *int32 `protobuf:"varint,1,opt,name=field35810" json:"field35810,omitempty"`
 	Field35811    *int32 `protobuf:"varint,2,opt,name=field35811" json:"field35811,omitempty"`
 	Field35812    *int32 `protobuf:"varint,3,opt,name=field35812" json:"field35812,omitempty"`
@@ -337,10 +374,18 @@
 func (*Message35807) ProtoMessage() {}
 
 func (x *Message35807) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35807) XXX_Methods() *protoiface.Methods {
+func (x *Message35807) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[4].Methods()
 }
 
@@ -406,6 +451,7 @@
 }
 
 type Message37487 struct {
+	state         protoimpl.MessageState
 	Field37501    []byte `protobuf:"bytes,2,opt,name=field37501" json:"field37501,omitempty"`
 	Field37502    *bool  `protobuf:"varint,3,opt,name=field37502" json:"field37502,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -423,10 +469,18 @@
 func (*Message37487) ProtoMessage() {}
 
 func (x *Message37487) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37487) XXX_Methods() *protoiface.Methods {
+func (x *Message37487) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[5].Methods()
 }
 
@@ -450,6 +504,7 @@
 }
 
 type Message13062 struct {
+	state         protoimpl.MessageState
 	Field13075    *int64  `protobuf:"varint,1,opt,name=field13075" json:"field13075,omitempty"`
 	Field13076    *string `protobuf:"bytes,2,opt,name=field13076" json:"field13076,omitempty"`
 	Field13077    *int32  `protobuf:"varint,3,opt,name=field13077" json:"field13077,omitempty"`
@@ -470,10 +525,18 @@
 func (*Message13062) ProtoMessage() {}
 
 func (x *Message13062) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13062) XXX_Methods() *protoiface.Methods {
+func (x *Message13062) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[6].Methods()
 }
 
@@ -518,6 +581,7 @@
 }
 
 type Message952 struct {
+	state         protoimpl.MessageState
 	Field963      []*Message949 `protobuf:"bytes,1,rep,name=field963" json:"field963,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -534,10 +598,18 @@
 func (*Message952) ProtoMessage() {}
 
 func (x *Message952) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message952) XXX_Methods() *protoiface.Methods {
+func (x *Message952) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[7].Methods()
 }
 
@@ -554,6 +626,7 @@
 }
 
 type Message36876 struct {
+	state         protoimpl.MessageState
 	Field36980    *Message2356                 `protobuf:"bytes,1,opt,name=field36980" json:"field36980,omitempty"`
 	Message36877  []*Message36876_Message36877 `protobuf:"group,111,rep,name=Message36877,json=message36877" json:"message36877,omitempty"`
 	Message36878  []*Message36876_Message36878 `protobuf:"group,168,rep,name=Message36878,json=message36878" json:"message36878,omitempty"`
@@ -632,10 +705,18 @@
 func (*Message36876) ProtoMessage() {}
 
 func (x *Message36876) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876) XXX_Methods() *protoiface.Methods {
+func (x *Message36876) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[8].Methods()
 }
 
@@ -1086,6 +1167,7 @@
 }
 
 type Message1328 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1101,10 +1183,18 @@
 func (*Message1328) ProtoMessage() {}
 
 func (x *Message1328) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1328) XXX_Methods() *protoiface.Methods {
+func (x *Message1328) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[9].Methods()
 }
 
@@ -1114,6 +1204,7 @@
 }
 
 type Message6850 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1129,10 +1220,18 @@
 func (*Message6850) ProtoMessage() {}
 
 func (x *Message6850) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6850) XXX_Methods() *protoiface.Methods {
+func (x *Message6850) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[10].Methods()
 }
 
@@ -1142,6 +1241,7 @@
 }
 
 type Message6863 struct {
+	state         protoimpl.MessageState
 	Field6931     *Enum6858           `protobuf:"varint,1,opt,name=field6931,enum=benchmarks.google_message3.Enum6858" json:"field6931,omitempty"`
 	Field6932     *Enum6858           `protobuf:"varint,2,opt,name=field6932,enum=benchmarks.google_message3.Enum6858" json:"field6932,omitempty"`
 	Field6933     *UnusedEnum         `protobuf:"varint,36,opt,name=field6933,enum=benchmarks.google_message3.UnusedEnum" json:"field6933,omitempty"`
@@ -1190,10 +1290,18 @@
 func (*Message6863) ProtoMessage() {}
 
 func (x *Message6863) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6863) XXX_Methods() *protoiface.Methods {
+func (x *Message6863) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[11].Methods()
 }
 
@@ -1434,6 +1542,7 @@
 }
 
 type Message6871 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1449,10 +1558,18 @@
 func (*Message6871) ProtoMessage() {}
 
 func (x *Message6871) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6871) XXX_Methods() *protoiface.Methods {
+func (x *Message6871) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[12].Methods()
 }
 
@@ -1462,6 +1579,7 @@
 }
 
 type Message7547 struct {
+	state         protoimpl.MessageState
 	Field7549     []byte `protobuf:"bytes,1,req,name=field7549" json:"field7549,omitempty"`
 	Field7550     *int32 `protobuf:"varint,2,req,name=field7550" json:"field7550,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1479,10 +1597,18 @@
 func (*Message7547) ProtoMessage() {}
 
 func (x *Message7547) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7547) XXX_Methods() *protoiface.Methods {
+func (x *Message7547) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[13].Methods()
 }
 
@@ -1506,6 +1632,7 @@
 }
 
 type Message7648 struct {
+	state         protoimpl.MessageState
 	Field7669     *string  `protobuf:"bytes,1,opt,name=field7669" json:"field7669,omitempty"`
 	Field7670     *int32   `protobuf:"varint,2,opt,name=field7670" json:"field7670,omitempty"`
 	Field7671     *int32   `protobuf:"varint,3,opt,name=field7671" json:"field7671,omitempty"`
@@ -1533,10 +1660,18 @@
 func (*Message7648) ProtoMessage() {}
 
 func (x *Message7648) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7648) XXX_Methods() *protoiface.Methods {
+func (x *Message7648) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[14].Methods()
 }
 
@@ -1630,6 +1765,7 @@
 }
 
 type Message7865 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1645,10 +1781,18 @@
 func (*Message7865) ProtoMessage() {}
 
 func (x *Message7865) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7865) XXX_Methods() *protoiface.Methods {
+func (x *Message7865) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[15].Methods()
 }
 
@@ -1658,6 +1802,7 @@
 }
 
 type Message7928 struct {
+	state         protoimpl.MessageState
 	Field7940     *string `protobuf:"bytes,1,opt,name=field7940" json:"field7940,omitempty"`
 	Field7941     *int64  `protobuf:"varint,2,opt,name=field7941" json:"field7941,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1675,10 +1820,18 @@
 func (*Message7928) ProtoMessage() {}
 
 func (x *Message7928) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7928) XXX_Methods() *protoiface.Methods {
+func (x *Message7928) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[16].Methods()
 }
 
@@ -1702,6 +1855,7 @@
 }
 
 type Message7919 struct {
+	state         protoimpl.MessageState
 	Field7931     *uint64 `protobuf:"fixed64,1,opt,name=field7931" json:"field7931,omitempty"`
 	Field7932     *int64  `protobuf:"varint,2,opt,name=field7932" json:"field7932,omitempty"`
 	Field7933     []byte  `protobuf:"bytes,3,opt,name=field7933" json:"field7933,omitempty"`
@@ -1720,10 +1874,18 @@
 func (*Message7919) ProtoMessage() {}
 
 func (x *Message7919) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7919) XXX_Methods() *protoiface.Methods {
+func (x *Message7919) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[17].Methods()
 }
 
@@ -1754,6 +1916,7 @@
 }
 
 type Message7920 struct {
+	state         protoimpl.MessageState
 	Field7934     *int64 `protobuf:"varint,1,opt,name=field7934" json:"field7934,omitempty"`
 	Field7935     *int64 `protobuf:"varint,2,opt,name=field7935" json:"field7935,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1771,10 +1934,18 @@
 func (*Message7920) ProtoMessage() {}
 
 func (x *Message7920) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7920) XXX_Methods() *protoiface.Methods {
+func (x *Message7920) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[18].Methods()
 }
 
@@ -1798,6 +1969,7 @@
 }
 
 type Message7921 struct {
+	state         protoimpl.MessageState
 	Field7936     *int32      `protobuf:"varint,1,opt,name=field7936" json:"field7936,omitempty"`
 	Field7937     *int64      `protobuf:"varint,2,opt,name=field7937" json:"field7937,omitempty"`
 	Field7938     *float32    `protobuf:"fixed32,3,opt,name=field7938" json:"field7938,omitempty"`
@@ -1817,10 +1989,18 @@
 func (*Message7921) ProtoMessage() {}
 
 func (x *Message7921) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7921) XXX_Methods() *protoiface.Methods {
+func (x *Message7921) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[19].Methods()
 }
 
@@ -1858,6 +2038,7 @@
 }
 
 type Message8511 struct {
+	state         protoimpl.MessageState
 	Field8539     *Message8224 `protobuf:"bytes,1,opt,name=field8539" json:"field8539,omitempty"`
 	Field8540     *string      `protobuf:"bytes,2,opt,name=field8540" json:"field8540,omitempty"`
 	Field8541     *bool        `protobuf:"varint,3,opt,name=field8541" json:"field8541,omitempty"`
@@ -1878,10 +2059,18 @@
 func (*Message8511) ProtoMessage() {}
 
 func (x *Message8511) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8511) XXX_Methods() *protoiface.Methods {
+func (x *Message8511) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[20].Methods()
 }
 
@@ -1926,6 +2115,7 @@
 }
 
 type Message8512 struct {
+	state         protoimpl.MessageState
 	Field8544     *Message8301 `protobuf:"bytes,1,opt,name=field8544" json:"field8544,omitempty"`
 	Field8545     *Message8302 `protobuf:"bytes,2,opt,name=field8545" json:"field8545,omitempty"`
 	Field8546     *string      `protobuf:"bytes,3,opt,name=field8546" json:"field8546,omitempty"`
@@ -1947,10 +2137,18 @@
 func (*Message8512) ProtoMessage() {}
 
 func (x *Message8512) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8512) XXX_Methods() *protoiface.Methods {
+func (x *Message8512) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[21].Methods()
 }
 
@@ -2002,6 +2200,7 @@
 }
 
 type Message8513 struct {
+	state         protoimpl.MessageState
 	Field8550     []*Message8392 `protobuf:"bytes,1,rep,name=field8550" json:"field8550,omitempty"`
 	Field8551     *string        `protobuf:"bytes,2,opt,name=field8551" json:"field8551,omitempty"`
 	Field8552     *bool          `protobuf:"varint,3,opt,name=field8552" json:"field8552,omitempty"`
@@ -2021,10 +2220,18 @@
 func (*Message8513) ProtoMessage() {}
 
 func (x *Message8513) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8513) XXX_Methods() *protoiface.Methods {
+func (x *Message8513) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[22].Methods()
 }
 
@@ -2062,6 +2269,7 @@
 }
 
 type Message8514 struct {
+	state         protoimpl.MessageState
 	Field8554     *string        `protobuf:"bytes,1,opt,name=field8554" json:"field8554,omitempty"`
 	Field8555     *int64         `protobuf:"varint,2,opt,name=field8555" json:"field8555,omitempty"`
 	Field8556     *bool          `protobuf:"varint,3,opt,name=field8556" json:"field8556,omitempty"`
@@ -2082,10 +2290,18 @@
 func (*Message8514) ProtoMessage() {}
 
 func (x *Message8514) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8514) XXX_Methods() *protoiface.Methods {
+func (x *Message8514) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[23].Methods()
 }
 
@@ -2130,6 +2346,7 @@
 }
 
 type Message8515 struct {
+	state         protoimpl.MessageState
 	Field8559     *Message8479 `protobuf:"bytes,1,opt,name=field8559" json:"field8559,omitempty"`
 	Field8560     *Message8478 `protobuf:"bytes,2,opt,name=field8560" json:"field8560,omitempty"`
 	Field8561     *string      `protobuf:"bytes,3,opt,name=field8561" json:"field8561,omitempty"`
@@ -2148,10 +2365,18 @@
 func (*Message8515) ProtoMessage() {}
 
 func (x *Message8515) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8515) XXX_Methods() *protoiface.Methods {
+func (x *Message8515) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[24].Methods()
 }
 
@@ -2182,6 +2407,7 @@
 }
 
 type Message10320 struct {
+	state         protoimpl.MessageState
 	Field10347    *Enum10335      `protobuf:"varint,1,opt,name=field10347,enum=benchmarks.google_message3.Enum10335" json:"field10347,omitempty"`
 	Field10348    []*Message10319 `protobuf:"bytes,2,rep,name=field10348" json:"field10348,omitempty"`
 	Field10349    *int32          `protobuf:"varint,3,opt,name=field10349" json:"field10349,omitempty"`
@@ -2204,10 +2430,18 @@
 func (*Message10320) ProtoMessage() {}
 
 func (x *Message10320) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10320) XXX_Methods() *protoiface.Methods {
+func (x *Message10320) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[25].Methods()
 }
 
@@ -2266,6 +2500,7 @@
 }
 
 type Message10321 struct {
+	state         protoimpl.MessageState
 	Field10354    *int32  `protobuf:"varint,1,opt,name=field10354" json:"field10354,omitempty"`
 	Field10355    *int32  `protobuf:"varint,2,opt,name=field10355" json:"field10355,omitempty"`
 	Field10356    *uint64 `protobuf:"varint,3,opt,name=field10356" json:"field10356,omitempty"`
@@ -2284,10 +2519,18 @@
 func (*Message10321) ProtoMessage() {}
 
 func (x *Message10321) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10321) XXX_Methods() *protoiface.Methods {
+func (x *Message10321) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[26].Methods()
 }
 
@@ -2318,6 +2561,7 @@
 }
 
 type Message10322 struct {
+	state         protoimpl.MessageState
 	Field10357    *Message4016 `protobuf:"bytes,1,opt,name=field10357" json:"field10357,omitempty"`
 	Field10358    *bool        `protobuf:"varint,2,opt,name=field10358" json:"field10358,omitempty"`
 	Field10359    *bool        `protobuf:"varint,3,opt,name=field10359" json:"field10359,omitempty"`
@@ -2336,10 +2580,18 @@
 func (*Message10322) ProtoMessage() {}
 
 func (x *Message10322) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10322) XXX_Methods() *protoiface.Methods {
+func (x *Message10322) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[27].Methods()
 }
 
@@ -2370,6 +2622,7 @@
 }
 
 type Message11988 struct {
+	state         protoimpl.MessageState
 	Field12021    *string             `protobuf:"bytes,1,opt,name=field12021" json:"field12021,omitempty"`
 	Field12022    *string             `protobuf:"bytes,2,opt,name=field12022" json:"field12022,omitempty"`
 	Field12023    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field12023" json:"field12023,omitempty"`
@@ -2389,10 +2642,18 @@
 func (*Message11988) ProtoMessage() {}
 
 func (x *Message11988) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11988) XXX_Methods() *protoiface.Methods {
+func (x *Message11988) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[28].Methods()
 }
 
@@ -2430,6 +2691,7 @@
 }
 
 type Message12668 struct {
+	state         protoimpl.MessageState
 	Field12677    []*Message12669 `protobuf:"bytes,1,rep,name=field12677" json:"field12677,omitempty"`
 	Field12678    *int32          `protobuf:"varint,2,opt,name=field12678" json:"field12678,omitempty"`
 	Field12679    *int32          `protobuf:"varint,3,opt,name=field12679" json:"field12679,omitempty"`
@@ -2449,10 +2711,18 @@
 func (*Message12668) ProtoMessage() {}
 
 func (x *Message12668) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12668) XXX_Methods() *protoiface.Methods {
+func (x *Message12668) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[29].Methods()
 }
 
@@ -2490,6 +2760,7 @@
 }
 
 type Message12825 struct {
+	state         protoimpl.MessageState
 	Field12862    []*Message12818       `protobuf:"bytes,1,rep,name=field12862" json:"field12862,omitempty"`
 	Field12863    *int32                `protobuf:"varint,2,opt,name=field12863" json:"field12863,omitempty"`
 	Field12864    *Message12819         `protobuf:"bytes,3,opt,name=field12864" json:"field12864,omitempty"`
@@ -2512,10 +2783,18 @@
 func (*Message12825) ProtoMessage() {}
 
 func (x *Message12825) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12825) XXX_Methods() *protoiface.Methods {
+func (x *Message12825) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[30].Methods()
 }
 
@@ -2574,6 +2853,7 @@
 }
 
 type Message16478 struct {
+	state         protoimpl.MessageState
 	Field16481    []*Message16479 `protobuf:"bytes,1,rep,name=field16481" json:"field16481,omitempty"`
 	Field16482    *bool           `protobuf:"varint,3,opt,name=field16482" json:"field16482,omitempty"`
 	Field16483    *int32          `protobuf:"varint,2,opt,name=field16483" json:"field16483,omitempty"`
@@ -2592,10 +2872,18 @@
 func (*Message16478) ProtoMessage() {}
 
 func (x *Message16478) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16478) XXX_Methods() *protoiface.Methods {
+func (x *Message16478) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[31].Methods()
 }
 
@@ -2626,6 +2914,7 @@
 }
 
 type Message16552 struct {
+	state         protoimpl.MessageState
 	Field16565    *uint64    `protobuf:"fixed64,1,opt,name=field16565" json:"field16565,omitempty"`
 	Field16566    *int32     `protobuf:"varint,2,opt,name=field16566" json:"field16566,omitempty"`
 	Field16567    *Enum16553 `protobuf:"varint,3,opt,name=field16567,enum=benchmarks.google_message3.Enum16553" json:"field16567,omitempty"`
@@ -2644,10 +2933,18 @@
 func (*Message16552) ProtoMessage() {}
 
 func (x *Message16552) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16552) XXX_Methods() *protoiface.Methods {
+func (x *Message16552) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[32].Methods()
 }
 
@@ -2678,6 +2975,7 @@
 }
 
 type Message16660 struct {
+	state         protoimpl.MessageState
 	Field16668    *string `protobuf:"bytes,1,opt,name=field16668" json:"field16668,omitempty"`
 	Field16669    *string `protobuf:"bytes,2,opt,name=field16669" json:"field16669,omitempty"`
 	Field16670    *int32  `protobuf:"varint,3,opt,name=field16670" json:"field16670,omitempty"`
@@ -2696,10 +2994,18 @@
 func (*Message16660) ProtoMessage() {}
 
 func (x *Message16660) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16660) XXX_Methods() *protoiface.Methods {
+func (x *Message16660) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[33].Methods()
 }
 
@@ -2730,6 +3036,7 @@
 }
 
 type Message16727 struct {
+	state           protoimpl.MessageState
 	Field16782      *Enum16728          `protobuf:"varint,1,req,name=field16782,enum=benchmarks.google_message3.Enum16728" json:"field16782,omitempty"`
 	Field16783      *string             `protobuf:"bytes,2,req,name=field16783" json:"field16783,omitempty"`
 	Field16784      *string             `protobuf:"bytes,3,opt,name=field16784" json:"field16784,omitempty"`
@@ -2770,10 +3077,18 @@
 func (*Message16727) ProtoMessage() {}
 
 func (x *Message16727) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16727) XXX_Methods() *protoiface.Methods {
+func (x *Message16727) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[34].Methods()
 }
 
@@ -2960,6 +3275,7 @@
 }
 
 type Message16725 struct {
+	state         protoimpl.MessageState
 	Field16774    *Enum16728 `protobuf:"varint,1,opt,name=field16774,enum=benchmarks.google_message3.Enum16728" json:"field16774,omitempty"`
 	Field16775    []string   `protobuf:"bytes,2,rep,name=field16775" json:"field16775,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2977,10 +3293,18 @@
 func (*Message16725) ProtoMessage() {}
 
 func (x *Message16725) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16725) XXX_Methods() *protoiface.Methods {
+func (x *Message16725) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[35].Methods()
 }
 
@@ -3004,6 +3328,7 @@
 }
 
 type Message17726 struct {
+	state         protoimpl.MessageState
 	Field17801    *string               `protobuf:"bytes,1,opt,name=field17801" json:"field17801,omitempty"`
 	Field17802    []string              `protobuf:"bytes,2,rep,name=field17802" json:"field17802,omitempty"`
 	Field17803    *string               `protobuf:"bytes,3,opt,name=field17803" json:"field17803,omitempty"`
@@ -3041,10 +3366,18 @@
 func (*Message17726) ProtoMessage() {}
 
 func (x *Message17726) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17726) XXX_Methods() *protoiface.Methods {
+func (x *Message17726) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[36].Methods()
 }
 
@@ -3208,6 +3541,7 @@
 }
 
 type Message17782 struct {
+	state         protoimpl.MessageState
 	Field18153    *string `protobuf:"bytes,1,opt,name=field18153" json:"field18153,omitempty"`
 	Field18154    *string `protobuf:"bytes,2,opt,name=field18154" json:"field18154,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3225,10 +3559,18 @@
 func (*Message17782) ProtoMessage() {}
 
 func (x *Message17782) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17782) XXX_Methods() *protoiface.Methods {
+func (x *Message17782) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[37].Methods()
 }
 
@@ -3252,6 +3594,7 @@
 }
 
 type Message17783 struct {
+	state         protoimpl.MessageState
 	Field18155    *string                      `protobuf:"bytes,1,opt,name=field18155" json:"field18155,omitempty"`
 	Field18156    *string                      `protobuf:"bytes,2,opt,name=field18156" json:"field18156,omitempty"`
 	Field18157    *string                      `protobuf:"bytes,3,opt,name=field18157" json:"field18157,omitempty"`
@@ -3273,10 +3616,18 @@
 func (*Message17783) ProtoMessage() {}
 
 func (x *Message17783) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17783) XXX_Methods() *protoiface.Methods {
+func (x *Message17783) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[38].Methods()
 }
 
@@ -3328,6 +3679,7 @@
 }
 
 type Message16945 struct {
+	state           protoimpl.MessageState
 	Field16946      *string               `protobuf:"bytes,1,opt,name=field16946" json:"field16946,omitempty"`
 	Field16947      *string               `protobuf:"bytes,2,opt,name=field16947" json:"field16947,omitempty"`
 	Field16948      *string               `protobuf:"bytes,3,opt,name=field16948" json:"field16948,omitempty"`
@@ -3423,10 +3775,18 @@
 func (*Message16945) ProtoMessage() {}
 
 func (x *Message16945) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16945) XXX_Methods() *protoiface.Methods {
+func (x *Message16945) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[39].Methods()
 }
 
@@ -4694,6 +5054,7 @@
 }
 
 type Message34791_Message34792 struct {
+	state         protoimpl.MessageState
 	Field34808    *string `protobuf:"bytes,3,req,name=field34808" json:"field34808,omitempty"`
 	Field34809    *string `protobuf:"bytes,4,opt,name=field34809" json:"field34809,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -4711,10 +5072,18 @@
 func (*Message34791_Message34792) ProtoMessage() {}
 
 func (x *Message34791_Message34792) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34791_Message34792) XXX_Methods() *protoiface.Methods {
+func (x *Message34791_Message34792) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[40].Methods()
 }
 
@@ -4738,6 +5107,7 @@
 }
 
 type Message36876_Message36877 struct {
+	state         protoimpl.MessageState
 	Field37044    *string `protobuf:"bytes,112,req,name=field37044" json:"field37044,omitempty"`
 	Field37045    *int32  `protobuf:"varint,113,opt,name=field37045" json:"field37045,omitempty"`
 	Field37046    []byte  `protobuf:"bytes,114,opt,name=field37046" json:"field37046,omitempty"`
@@ -4758,10 +5128,18 @@
 func (*Message36876_Message36877) ProtoMessage() {}
 
 func (x *Message36876_Message36877) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36877) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36877) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[41].Methods()
 }
 
@@ -4806,6 +5184,7 @@
 }
 
 type Message36876_Message36878 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4821,10 +5200,18 @@
 func (*Message36876_Message36878) ProtoMessage() {}
 
 func (x *Message36876_Message36878) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[42].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36878) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36878) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[42].Methods()
 }
 
@@ -4834,6 +5221,7 @@
 }
 
 type Message36876_Message36879 struct {
+	state         protoimpl.MessageState
 	Field37050    *string `protobuf:"bytes,56,req,name=field37050" json:"field37050,omitempty"`
 	Field37051    *int32  `protobuf:"varint,69,opt,name=field37051" json:"field37051,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -4851,10 +5239,18 @@
 func (*Message36876_Message36879) ProtoMessage() {}
 
 func (x *Message36876_Message36879) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[43].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36879) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36879) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[43].Methods()
 }
 
@@ -4878,6 +5274,7 @@
 }
 
 type Message36876_Message36880 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4893,10 +5290,18 @@
 func (*Message36876_Message36880) ProtoMessage() {}
 
 func (x *Message36876_Message36880) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[44].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36880) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36880) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[44].Methods()
 }
 
@@ -4906,6 +5311,7 @@
 }
 
 type Message36876_Message36881 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4921,10 +5327,18 @@
 func (*Message36876_Message36881) ProtoMessage() {}
 
 func (x *Message36876_Message36881) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[45].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36881) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36881) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[45].Methods()
 }
 
@@ -4934,6 +5348,7 @@
 }
 
 type Message36876_Message36882 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4949,10 +5364,18 @@
 func (*Message36876_Message36882) ProtoMessage() {}
 
 func (x *Message36876_Message36882) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[46].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36882) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36882) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[46].Methods()
 }
 
@@ -4962,6 +5385,7 @@
 }
 
 type Message36876_Message36883 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4977,10 +5401,18 @@
 func (*Message36876_Message36883) ProtoMessage() {}
 
 func (x *Message36876_Message36883) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[47].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[47]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36883) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36883) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[47].Methods()
 }
 
@@ -4990,6 +5422,7 @@
 }
 
 type Message36876_Message36884 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -5005,10 +5438,18 @@
 func (*Message36876_Message36884) ProtoMessage() {}
 
 func (x *Message36876_Message36884) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[48].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[48]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36884) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36884) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[48].Methods()
 }
 
@@ -5018,6 +5459,7 @@
 }
 
 type Message36876_Message36885 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -5033,10 +5475,18 @@
 func (*Message36876_Message36885) ProtoMessage() {}
 
 func (x *Message36876_Message36885) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[49].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[49]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36885) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36885) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[49].Methods()
 }
 
@@ -5046,6 +5496,7 @@
 }
 
 type Message36876_Message36886 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -5061,10 +5512,18 @@
 func (*Message36876_Message36886) ProtoMessage() {}
 
 func (x *Message36876_Message36886) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[50].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[50]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36886) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36886) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[50].Methods()
 }
 
@@ -5074,6 +5533,7 @@
 }
 
 type Message36876_Message36887 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -5089,10 +5549,18 @@
 func (*Message36876_Message36887) ProtoMessage() {}
 
 func (x *Message36876_Message36887) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[51].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[51]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36887) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36887) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[51].Methods()
 }
 
@@ -5102,6 +5570,7 @@
 }
 
 type Message36876_Message36888 struct {
+	state         protoimpl.MessageState
 	Field37089    *uint64  `protobuf:"varint,75,opt,name=field37089" json:"field37089,omitempty"`
 	Field37090    *bool    `protobuf:"varint,76,opt,name=field37090" json:"field37090,omitempty"`
 	Field37091    *uint64  `protobuf:"varint,165,opt,name=field37091" json:"field37091,omitempty"`
@@ -5123,10 +5592,18 @@
 func (*Message36876_Message36888) ProtoMessage() {}
 
 func (x *Message36876_Message36888) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[52].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[52]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36888) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36888) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[52].Methods()
 }
 
@@ -5178,6 +5655,7 @@
 }
 
 type Message36876_Message36889 struct {
+	state         protoimpl.MessageState
 	Field37095    *int64              `protobuf:"varint,117,opt,name=field37095" json:"field37095,omitempty"`
 	Field37096    *string             `protobuf:"bytes,145,opt,name=field37096" json:"field37096,omitempty"`
 	Field37097    *int32              `protobuf:"varint,123,opt,name=field37097" json:"field37097,omitempty"`
@@ -5218,10 +5696,18 @@
 func (*Message36876_Message36889) ProtoMessage() {}
 
 func (x *Message36876_Message36889) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[53].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[53]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36889) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36889) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[53].Methods()
 }
 
@@ -5406,6 +5892,7 @@
 }
 
 type Message36876_Message36910 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -5421,10 +5908,18 @@
 func (*Message36876_Message36910) ProtoMessage() {}
 
 func (x *Message36876_Message36910) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[54].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[54]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36910) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36910) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[54].Methods()
 }
 
@@ -5434,6 +5929,7 @@
 }
 
 type Message36876_Message36911 struct {
+	state         protoimpl.MessageState
 	Field37121    *UnusedEmptyMessage `protobuf:"bytes,127,opt,name=field37121" json:"field37121,omitempty"`
 	Field37122    *Message35538       `protobuf:"bytes,130,opt,name=field37122" json:"field37122,omitempty"`
 	Field37123    *Message35540       `protobuf:"bytes,144,opt,name=field37123" json:"field37123,omitempty"`
@@ -5453,10 +5949,18 @@
 func (*Message36876_Message36911) ProtoMessage() {}
 
 func (x *Message36876_Message36911) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[55].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[55]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36911) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36911) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[55].Methods()
 }
 
@@ -5494,6 +5998,7 @@
 }
 
 type Message36876_Message36912 struct {
+	state         protoimpl.MessageState
 	Field37125    *Message3901 `protobuf:"bytes,153,opt,name=field37125" json:"field37125,omitempty"`
 	Field37126    *Message3901 `protobuf:"bytes,162,opt,name=field37126" json:"field37126,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -5511,10 +6016,18 @@
 func (*Message36876_Message36912) ProtoMessage() {}
 
 func (x *Message36876_Message36912) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[56].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[56]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36876_Message36912) XXX_Methods() *protoiface.Methods {
+func (x *Message36876_Message36912) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[56].Methods()
 }
 
@@ -5538,6 +6051,7 @@
 }
 
 type Message17783_Message17784 struct {
+	state         protoimpl.MessageState
 	Field18162    *string  `protobuf:"bytes,5,opt,name=field18162" json:"field18162,omitempty"`
 	Field18163    *string  `protobuf:"bytes,6,opt,name=field18163" json:"field18163,omitempty"`
 	Field18164    *string  `protobuf:"bytes,7,opt,name=field18164" json:"field18164,omitempty"`
@@ -5559,10 +6073,18 @@
 func (*Message17783_Message17784) ProtoMessage() {}
 
 func (x *Message17783_Message17784) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[57].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[57]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17783_Message17784) XXX_Methods() *protoiface.Methods {
+func (x *Message17783_Message17784) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[57].Methods()
 }
 
@@ -5614,6 +6136,7 @@
 }
 
 type Message17783_Message17785 struct {
+	state         protoimpl.MessageState
 	Field18168    *string       `protobuf:"bytes,10,opt,name=field18168" json:"field18168,omitempty"`
 	Field18169    *string       `protobuf:"bytes,11,opt,name=field18169" json:"field18169,omitempty"`
 	Field18170    *Message17783 `protobuf:"bytes,12,opt,name=field18170" json:"field18170,omitempty"`
@@ -5635,10 +6158,18 @@
 func (*Message17783_Message17785) ProtoMessage() {}
 
 func (x *Message17783_Message17785) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[58].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[58]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17783_Message17785) XXX_Methods() *protoiface.Methods {
+func (x *Message17783_Message17785) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[58].Methods()
 }
 
@@ -7816,16 +8347,8 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message34390); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message34624); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -7834,11 +8357,25 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message34624); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message34791); i {
-			case 14:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 15:
+				return &v.sizeCache
+			case 16:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7846,6 +8383,44 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35483); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message35807); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message37487); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13062); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -7854,18 +8429,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message35807); i {
-			case 8:
-				return &v.sizeCache
-			case 9:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message37487); i {
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message952); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -7874,31 +8441,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13062); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message952); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876); i {
-			case 63:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 64:
+				return &v.sizeCache
+			case 65:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7907,8 +8456,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1328); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7917,8 +8468,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6850); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7926,9 +8479,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6863); i {
-			case 33:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 34:
+				return &v.sizeCache
+			case 35:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7937,8 +8492,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6871); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7946,9 +8503,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7547); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7956,9 +8515,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7648); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7967,8 +8528,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7865); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7976,9 +8539,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7928); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7986,9 +8551,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7919); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -7996,9 +8563,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7920); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8006,9 +8575,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7921); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8016,9 +8587,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8511); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8026,9 +8599,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8512); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8036,9 +8611,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8513); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8046,9 +8623,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8514); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8056,9 +8635,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8515); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8066,9 +8647,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10320); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8076,9 +8659,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10321); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8086,6 +8671,106 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10322); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11988); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12668); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12825); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16478); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16552); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16660); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16727); i {
+			case 0:
+				return &v.state
+			case 25:
+				return &v.sizeCache
+			case 26:
+				return &v.unknownFields
+			case 27:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16725); i {
+			case 0:
+				return &v.state
 			case 3:
 				return &v.sizeCache
 			case 4:
@@ -8094,28 +8779,34 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11988); i {
-			case 4:
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message17726); i {
+			case 0:
+				return &v.state
+			case 23:
 				return &v.sizeCache
-			case 5:
+			case 24:
 				return &v.unknownFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12668); i {
-			case 4:
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message17782); i {
+			case 0:
+				return &v.state
+			case 3:
 				return &v.sizeCache
-			case 5:
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12825); i {
+		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message17783); i {
+			case 0:
+				return &v.state
 			case 7:
 				return &v.sizeCache
 			case 8:
@@ -8124,95 +8815,15 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16478); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16552); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16660); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16727); i {
-			case 24:
-				return &v.sizeCache
-			case 25:
-				return &v.unknownFields
-			case 26:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16725); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message17726); i {
-			case 22:
-				return &v.sizeCache
-			case 23:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message17782); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message17783); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16945); i {
-			case 79:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 80:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 81:
+				return &v.unknownFields
+			case 82:
 				return &v.extensionFields
 			default:
 				return nil
@@ -8220,9 +8831,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message34791_Message34792); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8230,9 +8843,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36877); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8241,8 +8856,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36878); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8250,9 +8867,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36879); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8261,8 +8880,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36880); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8271,8 +8892,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36881); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8281,8 +8904,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36882); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8291,8 +8916,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36883); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8301,8 +8928,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36884); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8311,8 +8940,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36885); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8321,8 +8952,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36886); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8331,8 +8964,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36887); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8340,9 +8975,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36888); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8350,9 +8987,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36889); i {
-			case 25:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 26:
+				return &v.sizeCache
+			case 27:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8361,8 +9000,10 @@
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36910); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8370,9 +9011,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36911); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8380,9 +9023,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36876_Message36912); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8390,9 +9035,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message17783_Message17784); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -8400,9 +9047,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_1_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message17783_Message17785); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_2.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_2.pb.go
index bafecc7..4fcda87 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_2.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message22853 struct {
+	state         protoimpl.MessageState
 	Field22869    *Enum22854          `protobuf:"varint,1,opt,name=field22869,enum=benchmarks.google_message3.Enum22854" json:"field22869,omitempty"`
 	Field22870    []uint32            `protobuf:"varint,2,rep,packed,name=field22870" json:"field22870,omitempty"`
 	Field22871    []float32           `protobuf:"fixed32,3,rep,packed,name=field22871" json:"field22871,omitempty"`
@@ -38,10 +39,18 @@
 func (*Message22853) ProtoMessage() {}
 
 func (x *Message22853) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message22853) XXX_Methods() *protoiface.Methods {
+func (x *Message22853) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[0].Methods()
 }
 
@@ -86,6 +95,7 @@
 }
 
 type Message24345 struct {
+	state         protoimpl.MessageState
 	Field24533    *string             `protobuf:"bytes,1,opt,name=field24533" json:"field24533,omitempty"`
 	Field24534    *UnusedEnum         `protobuf:"varint,22,opt,name=field24534,enum=benchmarks.google_message3.UnusedEnum" json:"field24534,omitempty"`
 	Field24535    *Message24346       `protobuf:"bytes,2,opt,name=field24535" json:"field24535,omitempty"`
@@ -126,10 +136,18 @@
 func (*Message24345) ProtoMessage() {}
 
 func (x *Message24345) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24345) XXX_Methods() *protoiface.Methods {
+func (x *Message24345) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[1].Methods()
 }
 
@@ -314,6 +332,7 @@
 }
 
 type Message24403 struct {
+	state         protoimpl.MessageState
 	Field24681    *Message24401 `protobuf:"bytes,1,opt,name=field24681" json:"field24681,omitempty"`
 	Field24682    *Message24402 `protobuf:"bytes,2,opt,name=field24682" json:"field24682,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -331,10 +350,18 @@
 func (*Message24403) ProtoMessage() {}
 
 func (x *Message24403) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24403) XXX_Methods() *protoiface.Methods {
+func (x *Message24403) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[2].Methods()
 }
 
@@ -358,6 +385,7 @@
 }
 
 type Message24391 struct {
+	state         protoimpl.MessageState
 	Field24631    *string               `protobuf:"bytes,1,opt,name=field24631" json:"field24631,omitempty"`
 	Field24632    *string               `protobuf:"bytes,2,opt,name=field24632" json:"field24632,omitempty"`
 	Field24633    []string              `protobuf:"bytes,3,rep,name=field24633" json:"field24633,omitempty"`
@@ -398,10 +426,18 @@
 func (*Message24391) ProtoMessage() {}
 
 func (x *Message24391) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24391) XXX_Methods() *protoiface.Methods {
+func (x *Message24391) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[3].Methods()
 }
 
@@ -586,6 +622,7 @@
 }
 
 type Message27454 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -601,10 +638,18 @@
 func (*Message27454) ProtoMessage() {}
 
 func (x *Message27454) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27454) XXX_Methods() *protoiface.Methods {
+func (x *Message27454) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[4].Methods()
 }
 
@@ -614,6 +659,7 @@
 }
 
 type Message27357 struct {
+	state         protoimpl.MessageState
 	Field27410    *string  `protobuf:"bytes,1,opt,name=field27410" json:"field27410,omitempty"`
 	Field27411    *float32 `protobuf:"fixed32,2,opt,name=field27411" json:"field27411,omitempty"`
 	Field27412    *string  `protobuf:"bytes,3,opt,name=field27412" json:"field27412,omitempty"`
@@ -634,10 +680,18 @@
 func (*Message27357) ProtoMessage() {}
 
 func (x *Message27357) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27357) XXX_Methods() *protoiface.Methods {
+func (x *Message27357) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[5].Methods()
 }
 
@@ -682,6 +736,7 @@
 }
 
 type Message27360 struct {
+	state         protoimpl.MessageState
 	Field27426    *Message27358         `protobuf:"bytes,1,opt,name=field27426" json:"field27426,omitempty"`
 	Field27427    *Enum27361            `protobuf:"varint,2,opt,name=field27427,enum=benchmarks.google_message3.Enum27361" json:"field27427,omitempty"`
 	Field27428    *Message27358         `protobuf:"bytes,3,opt,name=field27428" json:"field27428,omitempty"`
@@ -701,10 +756,18 @@
 func (*Message27360) ProtoMessage() {}
 
 func (x *Message27360) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27360) XXX_Methods() *protoiface.Methods {
+func (x *Message27360) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[6].Methods()
 }
 
@@ -742,6 +805,7 @@
 }
 
 type Message34387 struct {
+	state         protoimpl.MessageState
 	Field34446    *string         `protobuf:"bytes,1,opt,name=field34446" json:"field34446,omitempty"`
 	Field34447    []*Message34381 `protobuf:"bytes,2,rep,name=field34447" json:"field34447,omitempty"`
 	Field34448    *UnusedEnum     `protobuf:"varint,3,opt,name=field34448,enum=benchmarks.google_message3.UnusedEnum" json:"field34448,omitempty"`
@@ -762,10 +826,18 @@
 func (*Message34387) ProtoMessage() {}
 
 func (x *Message34387) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34387) XXX_Methods() *protoiface.Methods {
+func (x *Message34387) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[7].Methods()
 }
 
@@ -810,6 +882,7 @@
 }
 
 type Message34621 struct {
+	state         protoimpl.MessageState
 	Field34651    *float64              `protobuf:"fixed64,1,opt,name=field34651" json:"field34651,omitempty"`
 	Field34652    *float64              `protobuf:"fixed64,2,opt,name=field34652" json:"field34652,omitempty"`
 	Field34653    *float64              `protobuf:"fixed64,3,opt,name=field34653" json:"field34653,omitempty"`
@@ -843,10 +916,18 @@
 func (*Message34621) ProtoMessage() {}
 
 func (x *Message34621) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34621) XXX_Methods() *protoiface.Methods {
+func (x *Message34621) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[8].Methods()
 }
 
@@ -982,6 +1063,7 @@
 }
 
 type Message35476 struct {
+	state         protoimpl.MessageState
 	Field35484    *string             `protobuf:"bytes,1,opt,name=field35484" json:"field35484,omitempty"`
 	Field35485    *string             `protobuf:"bytes,2,opt,name=field35485" json:"field35485,omitempty"`
 	Field35486    *string             `protobuf:"bytes,3,opt,name=field35486" json:"field35486,omitempty"`
@@ -1011,10 +1093,18 @@
 func (*Message35476) ProtoMessage() {}
 
 func (x *Message35476) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35476) XXX_Methods() *protoiface.Methods {
+func (x *Message35476) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[9].Methods()
 }
 
@@ -1122,6 +1212,7 @@
 }
 
 type Message949 struct {
+	state         protoimpl.MessageState
 	Field955      *string     `protobuf:"bytes,1,opt,name=field955" json:"field955,omitempty"`
 	Field956      *int64      `protobuf:"varint,2,opt,name=field956" json:"field956,omitempty"`
 	Field957      *int64      `protobuf:"varint,3,opt,name=field957" json:"field957,omitempty"`
@@ -1144,10 +1235,18 @@
 func (*Message949) ProtoMessage() {}
 
 func (x *Message949) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message949) XXX_Methods() *protoiface.Methods {
+func (x *Message949) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[10].Methods()
 }
 
@@ -1206,6 +1305,7 @@
 }
 
 type Message36869 struct {
+	state         protoimpl.MessageState
 	Field36970    *int32 `protobuf:"varint,1,opt,name=field36970" json:"field36970,omitempty"`
 	Field36971    *int32 `protobuf:"varint,2,opt,name=field36971" json:"field36971,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1223,10 +1323,18 @@
 func (*Message36869) ProtoMessage() {}
 
 func (x *Message36869) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36869) XXX_Methods() *protoiface.Methods {
+func (x *Message36869) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[11].Methods()
 }
 
@@ -1250,6 +1358,7 @@
 }
 
 type Message33968 struct {
+	state         protoimpl.MessageState
 	Message33969  []*Message33968_Message33969 `protobuf:"group,1,rep,name=Message33969,json=message33969" json:"message33969,omitempty"`
 	Field33989    []*Message33958              `protobuf:"bytes,3,rep,name=field33989" json:"field33989,omitempty"`
 	Field33990    *UnusedEmptyMessage          `protobuf:"bytes,106,opt,name=field33990" json:"field33990,omitempty"`
@@ -1270,10 +1379,18 @@
 func (*Message33968) ProtoMessage() {}
 
 func (x *Message33968) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message33968) XXX_Methods() *protoiface.Methods {
+func (x *Message33968) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[12].Methods()
 }
 
@@ -1318,6 +1435,7 @@
 }
 
 type Message6644 struct {
+	state         protoimpl.MessageState
 	Field6701     *UnusedEmptyMessage `protobuf:"bytes,8,opt,name=field6701" json:"field6701,omitempty"`
 	Field6702     *string             `protobuf:"bytes,1,opt,name=field6702" json:"field6702,omitempty"`
 	Field6703     *float64            `protobuf:"fixed64,2,opt,name=field6703" json:"field6703,omitempty"`
@@ -1349,10 +1467,18 @@
 func (*Message6644) ProtoMessage() {}
 
 func (x *Message6644) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6644) XXX_Methods() *protoiface.Methods {
+func (x *Message6644) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[13].Methods()
 }
 
@@ -1474,6 +1600,7 @@
 }
 
 type Message18831 struct {
+	state         protoimpl.MessageState
 	Message18832  []*Message18831_Message18832 `protobuf:"group,1,rep,name=Message18832,json=message18832" json:"message18832,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1490,10 +1617,18 @@
 func (*Message18831) ProtoMessage() {}
 
 func (x *Message18831) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18831) XXX_Methods() *protoiface.Methods {
+func (x *Message18831) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[14].Methods()
 }
 
@@ -1510,6 +1645,7 @@
 }
 
 type Message13090 struct {
+	state         protoimpl.MessageState
 	Field13141    *Message13083 `protobuf:"bytes,1,opt,name=field13141" json:"field13141,omitempty"`
 	Field13142    *Message13088 `protobuf:"bytes,2,opt,name=field13142" json:"field13142,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1527,10 +1663,18 @@
 func (*Message13090) ProtoMessage() {}
 
 func (x *Message13090) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13090) XXX_Methods() *protoiface.Methods {
+func (x *Message13090) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[15].Methods()
 }
 
@@ -1554,6 +1698,7 @@
 }
 
 type Message11874 struct {
+	state           protoimpl.MessageState
 	Field11888      *Message10391 `protobuf:"bytes,3,opt,name=field11888" json:"field11888,omitempty"`
 	Field11889      *string       `protobuf:"bytes,4,opt,name=field11889" json:"field11889,omitempty"`
 	Field11890      *Message11873 `protobuf:"bytes,6,opt,name=field11890" json:"field11890,omitempty"`
@@ -1574,10 +1719,18 @@
 func (*Message11874) ProtoMessage() {}
 
 func (x *Message11874) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11874) XXX_Methods() *protoiface.Methods {
+func (x *Message11874) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[16].Methods()
 }
 
@@ -1626,6 +1779,7 @@
 }
 
 type Message4144 struct {
+	state         protoimpl.MessageState
 	Message4145   []*Message4144_Message4145 `protobuf:"group,1,rep,name=Message4145,json=message4145" json:"message4145,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1642,10 +1796,18 @@
 func (*Message4144) ProtoMessage() {}
 
 func (x *Message4144) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message4144) XXX_Methods() *protoiface.Methods {
+func (x *Message4144) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[17].Methods()
 }
 
@@ -1662,6 +1824,7 @@
 }
 
 type Message35573 struct {
+	state         protoimpl.MessageState
 	Field35695    *uint64                      `protobuf:"fixed64,16,opt,name=field35695" json:"field35695,omitempty"`
 	Field35696    *string                      `protobuf:"bytes,1000,opt,name=field35696" json:"field35696,omitempty"`
 	Field35697    *string                      `protobuf:"bytes,1004,opt,name=field35697" json:"field35697,omitempty"`
@@ -1688,10 +1851,18 @@
 func (*Message35573) ProtoMessage() {}
 
 func (x *Message35573) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35573) XXX_Methods() *protoiface.Methods {
+func (x *Message35573) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[18].Methods()
 }
 
@@ -1778,6 +1949,7 @@
 }
 
 type Message36858 struct {
+	state         protoimpl.MessageState
 	Field36956    []int32                      `protobuf:"varint,1,rep,name=field36956" json:"field36956,omitempty"`
 	Field36957    []string                     `protobuf:"bytes,2,rep,name=field36957" json:"field36957,omitempty"`
 	Field36958    []string                     `protobuf:"bytes,12,rep,name=field36958" json:"field36958,omitempty"`
@@ -1805,10 +1977,18 @@
 func (*Message36858) ProtoMessage() {}
 
 func (x *Message36858) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36858) XXX_Methods() *protoiface.Methods {
+func (x *Message36858) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[19].Methods()
 }
 
@@ -1902,6 +2082,7 @@
 }
 
 type Message13174 struct {
+	state         protoimpl.MessageState
 	Field13237    *int32        `protobuf:"varint,6,req,name=field13237" json:"field13237,omitempty"`
 	Field13238    *int32        `protobuf:"varint,3,opt,name=field13238" json:"field13238,omitempty"`
 	Field13239    *int32        `protobuf:"varint,4,req,name=field13239" json:"field13239,omitempty"`
@@ -1938,10 +2119,18 @@
 func (*Message13174) ProtoMessage() {}
 
 func (x *Message13174) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13174) XXX_Methods() *protoiface.Methods {
+func (x *Message13174) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[20].Methods()
 }
 
@@ -2098,6 +2287,7 @@
 }
 
 type Message18283 struct {
+	state           protoimpl.MessageState
 	Field18478      *UnusedEmptyMessage   `protobuf:"bytes,1,opt,name=field18478" json:"field18478,omitempty"`
 	Field18479      *int32                `protobuf:"varint,4,opt,name=field18479" json:"field18479,omitempty"`
 	Field18480      *int32                `protobuf:"varint,106,opt,name=field18480" json:"field18480,omitempty"`
@@ -2218,10 +2408,18 @@
 func (*Message18283) ProtoMessage() {}
 
 func (x *Message18283) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18283) XXX_Methods() *protoiface.Methods {
+func (x *Message18283) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[21].Methods()
 }
 
@@ -2971,6 +3169,7 @@
 }
 
 type Message13169 struct {
+	state         protoimpl.MessageState
 	Field13223    []*Message13168 `protobuf:"bytes,1,rep,name=field13223" json:"field13223,omitempty"`
 	Field13224    *Message13167   `protobuf:"bytes,2,req,name=field13224" json:"field13224,omitempty"`
 	Field13225    *string         `protobuf:"bytes,3,opt,name=field13225" json:"field13225,omitempty"`
@@ -2989,10 +3188,18 @@
 func (*Message13169) ProtoMessage() {}
 
 func (x *Message13169) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13169) XXX_Methods() *protoiface.Methods {
+func (x *Message13169) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[22].Methods()
 }
 
@@ -3023,6 +3230,7 @@
 }
 
 type Message19255 struct {
+	state         protoimpl.MessageState
 	Field19257    *string `protobuf:"bytes,1,opt,name=field19257" json:"field19257,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -3039,10 +3247,18 @@
 func (*Message19255) ProtoMessage() {}
 
 func (x *Message19255) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message19255) XXX_Methods() *protoiface.Methods {
+func (x *Message19255) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[23].Methods()
 }
 
@@ -3059,6 +3275,7 @@
 }
 
 type Message35542 struct {
+	state         protoimpl.MessageState
 	Field35543    *bool `protobuf:"varint,1,opt,name=field35543" json:"field35543,omitempty"`
 	Field35544    *bool `protobuf:"varint,2,opt,name=field35544" json:"field35544,omitempty"`
 	Field35545    *bool `protobuf:"varint,3,opt,name=field35545" json:"field35545,omitempty"`
@@ -3077,10 +3294,18 @@
 func (*Message35542) ProtoMessage() {}
 
 func (x *Message35542) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35542) XXX_Methods() *protoiface.Methods {
+func (x *Message35542) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[24].Methods()
 }
 
@@ -3111,6 +3336,7 @@
 }
 
 type Message3901 struct {
+	state         protoimpl.MessageState
 	Field3990     *int32      `protobuf:"varint,1,opt,name=field3990" json:"field3990,omitempty"`
 	Field3991     *int32      `protobuf:"varint,2,opt,name=field3991" json:"field3991,omitempty"`
 	Field3992     *int32      `protobuf:"varint,3,opt,name=field3992" json:"field3992,omitempty"`
@@ -3138,10 +3364,18 @@
 func (*Message3901) ProtoMessage() {}
 
 func (x *Message3901) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3901) XXX_Methods() *protoiface.Methods {
+func (x *Message3901) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[25].Methods()
 }
 
@@ -3235,6 +3469,7 @@
 }
 
 type Message33968_Message33969 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3250,10 +3485,18 @@
 func (*Message33968_Message33969) ProtoMessage() {}
 
 func (x *Message33968_Message33969) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message33968_Message33969) XXX_Methods() *protoiface.Methods {
+func (x *Message33968_Message33969) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[26].Methods()
 }
 
@@ -3263,6 +3506,7 @@
 }
 
 type Message18831_Message18832 struct {
+	state         protoimpl.MessageState
 	Field18836    *int32                                    `protobuf:"varint,2,opt,name=field18836" json:"field18836,omitempty"`
 	Field18837    *string                                   `protobuf:"bytes,5,opt,name=field18837" json:"field18837,omitempty"`
 	Field18838    *float32                                  `protobuf:"fixed32,3,opt,name=field18838" json:"field18838,omitempty"`
@@ -3285,10 +3529,18 @@
 func (*Message18831_Message18832) ProtoMessage() {}
 
 func (x *Message18831_Message18832) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18831_Message18832) XXX_Methods() *protoiface.Methods {
+func (x *Message18831_Message18832) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[27].Methods()
 }
 
@@ -3347,6 +3599,7 @@
 }
 
 type Message18831_Message18832_Message18833 struct {
+	state         protoimpl.MessageState
 	Field18843    *uint64  `protobuf:"varint,7,req,name=field18843" json:"field18843,omitempty"`
 	Field18844    *string  `protobuf:"bytes,8,opt,name=field18844" json:"field18844,omitempty"`
 	Field18845    *float32 `protobuf:"fixed32,10,opt,name=field18845" json:"field18845,omitempty"`
@@ -3367,10 +3620,18 @@
 func (*Message18831_Message18832_Message18833) ProtoMessage() {}
 
 func (x *Message18831_Message18832_Message18833) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18831_Message18832_Message18833) XXX_Methods() *protoiface.Methods {
+func (x *Message18831_Message18832_Message18833) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[28].Methods()
 }
 
@@ -3415,6 +3676,7 @@
 }
 
 type Message4144_Message4145 struct {
+	state         protoimpl.MessageState
 	Field4165     *Enum4146 `protobuf:"varint,2,req,name=field4165,enum=benchmarks.google_message3.Enum4146" json:"field4165,omitempty"`
 	Field4166     *int32    `protobuf:"varint,3,req,name=field4166" json:"field4166,omitempty"`
 	Field4167     *Enum4160 `protobuf:"varint,9,opt,name=field4167,enum=benchmarks.google_message3.Enum4160" json:"field4167,omitempty"`
@@ -3436,10 +3698,18 @@
 func (*Message4144_Message4145) ProtoMessage() {}
 
 func (x *Message4144_Message4145) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message4144_Message4145) XXX_Methods() *protoiface.Methods {
+func (x *Message4144_Message4145) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[29].Methods()
 }
 
@@ -3491,6 +3761,7 @@
 }
 
 type Message35573_Message35574 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3506,10 +3777,18 @@
 func (*Message35573_Message35574) ProtoMessage() {}
 
 func (x *Message35573_Message35574) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35573_Message35574) XXX_Methods() *protoiface.Methods {
+func (x *Message35573_Message35574) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[30].Methods()
 }
 
@@ -3519,6 +3798,7 @@
 }
 
 type Message35573_Message35575 struct {
+	state         protoimpl.MessageState
 	Field35709    *int64                                  `protobuf:"varint,2,opt,name=field35709" json:"field35709,omitempty"`
 	Field35710    *string                                 `protobuf:"bytes,3,opt,name=field35710" json:"field35710,omitempty"`
 	Field35711    *string                                 `protobuf:"bytes,19,opt,name=field35711" json:"field35711,omitempty"`
@@ -3572,10 +3852,18 @@
 func (*Message35573_Message35575) ProtoMessage() {}
 
 func (x *Message35573_Message35575) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35573_Message35575) XXX_Methods() *protoiface.Methods {
+func (x *Message35573_Message35575) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[31].Methods()
 }
 
@@ -3851,6 +4139,7 @@
 }
 
 type Message35573_Message35575_Message35576 struct {
+	state         protoimpl.MessageState
 	Field35747    *uint64   `protobuf:"fixed64,5,opt,name=field35747" json:"field35747,omitempty"`
 	Field35748    *int32    `protobuf:"varint,6,opt,name=field35748" json:"field35748,omitempty"`
 	Field35749    *int32    `protobuf:"varint,49,opt,name=field35749" json:"field35749,omitempty"`
@@ -3891,10 +4180,18 @@
 func (*Message35573_Message35575_Message35576) ProtoMessage() {}
 
 func (x *Message35573_Message35575_Message35576) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35573_Message35575_Message35576) XXX_Methods() *protoiface.Methods {
+func (x *Message35573_Message35575_Message35576) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[32].Methods()
 }
 
@@ -4079,6 +4376,7 @@
 }
 
 type Message36858_Message36859 struct {
+	state         protoimpl.MessageState
 	Field36968    *Enum36860 `protobuf:"varint,9,req,name=field36968,enum=benchmarks.google_message3.Enum36860" json:"field36968,omitempty"`
 	Field36969    *float32   `protobuf:"fixed32,10,opt,name=field36969" json:"field36969,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -4096,10 +4394,18 @@
 func (*Message36858_Message36859) ProtoMessage() {}
 
 func (x *Message36858_Message36859) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message36858_Message36859) XXX_Methods() *protoiface.Methods {
+func (x *Message36858_Message36859) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[33].Methods()
 }
 
@@ -5526,9 +5832,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message22853); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5536,9 +5844,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24345); i {
-			case 25:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 26:
+				return &v.sizeCache
+			case 27:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5546,9 +5856,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24403); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5556,9 +5868,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24391); i {
-			case 25:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 26:
+				return &v.sizeCache
+			case 27:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5567,8 +5881,10 @@
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message27454); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5576,9 +5892,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message27357); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5586,9 +5904,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message27360); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5596,9 +5916,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message34387); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5606,9 +5928,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message34621); i {
-			case 18:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 19:
+				return &v.sizeCache
+			case 20:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5616,9 +5940,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35476); i {
-			case 14:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 15:
+				return &v.sizeCache
+			case 16:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5626,9 +5952,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message949); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5636,9 +5964,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36869); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5646,9 +5976,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message33968); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5656,9 +5988,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6644); i {
-			case 16:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 17:
+				return &v.sizeCache
+			case 18:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5666,9 +6000,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18831); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5676,9 +6012,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13090); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5686,11 +6024,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11874); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 6:
+				return &v.unknownFields
+			case 7:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5698,9 +6038,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message4144); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5708,9 +6050,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35573); i {
-			case 11:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 12:
+				return &v.sizeCache
+			case 13:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5718,9 +6062,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36858); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5728,9 +6074,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13174); i {
-			case 21:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 22:
+				return &v.sizeCache
+			case 23:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5738,11 +6086,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18283); i {
-			case 104:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 105:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 106:
+				return &v.unknownFields
+			case 107:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5750,9 +6100,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13169); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5760,9 +6112,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message19255); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5770,9 +6124,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35542); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5780,9 +6136,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3901); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5791,8 +6149,10 @@
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message33968_Message33969); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5800,6 +6160,32 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18831_Message18832); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message18831_Message18832_Message18833); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message4144_Message4145); i {
+			case 0:
+				return &v.state
 			case 7:
 				return &v.sizeCache
 			case 8:
@@ -5808,31 +6194,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message18831_Message18832_Message18833); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message4144_Message4145); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35573_Message35574); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5840,9 +6208,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35573_Message35575); i {
-			case 38:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 39:
+				return &v.sizeCache
+			case 40:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5850,9 +6220,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35573_Message35575_Message35576); i {
-			case 25:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 26:
+				return &v.sizeCache
+			case 27:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5860,9 +6232,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_2_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message36858_Message36859); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_3.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_3.pb.go
index 11cf114..8c0f847 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_3.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_3.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message35546 struct {
+	state         protoimpl.MessageState
 	Field35556    *int64                     `protobuf:"varint,1,opt,name=field35556" json:"field35556,omitempty"`
 	Field35557    *int32                     `protobuf:"varint,2,opt,name=field35557" json:"field35557,omitempty"`
 	Field35558    *bool                      `protobuf:"varint,3,opt,name=field35558" json:"field35558,omitempty"`
@@ -45,10 +46,18 @@
 func (*Message35546) ProtoMessage() {}
 
 func (x *Message35546) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35546) XXX_Methods() *protoiface.Methods {
+func (x *Message35546) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[0].Methods()
 }
 
@@ -142,6 +151,7 @@
 }
 
 type Message2356 struct {
+	state         protoimpl.MessageState
 	Field2368     *Message1374               `protobuf:"bytes,121,opt,name=field2368" json:"field2368,omitempty"`
 	Field2369     *uint64                    `protobuf:"varint,1,opt,name=field2369" json:"field2369,omitempty"`
 	Field2370     *int32                     `protobuf:"varint,2,opt,name=field2370" json:"field2370,omitempty"`
@@ -188,10 +198,18 @@
 func (*Message2356) ProtoMessage() {}
 
 func (x *Message2356) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356) XXX_Methods() *protoiface.Methods {
+func (x *Message2356) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[1].Methods()
 }
 
@@ -418,6 +436,7 @@
 }
 
 type Message7029 struct {
+	state         protoimpl.MessageState
 	Field7183     *int32                     `protobuf:"varint,1,req,name=field7183" json:"field7183,omitempty"`
 	Field7184     *int32                     `protobuf:"varint,2,opt,name=field7184" json:"field7184,omitempty"`
 	Field7185     *int32                     `protobuf:"varint,3,opt,name=field7185" json:"field7185,omitempty"`
@@ -475,10 +494,18 @@
 func (*Message7029) ProtoMessage() {}
 
 func (x *Message7029) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7029) XXX_Methods() *protoiface.Methods {
+func (x *Message7029) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[2].Methods()
 }
 
@@ -782,6 +809,7 @@
 }
 
 type Message35538 struct {
+	state         protoimpl.MessageState
 	Field35539    *int64 `protobuf:"varint,1,req,name=field35539" json:"field35539,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -798,10 +826,18 @@
 func (*Message35538) ProtoMessage() {}
 
 func (x *Message35538) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35538) XXX_Methods() *protoiface.Methods {
+func (x *Message35538) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[3].Methods()
 }
 
@@ -818,6 +854,7 @@
 }
 
 type Message18921 struct {
+	state         protoimpl.MessageState
 	Field18946    *string                      `protobuf:"bytes,1,opt,name=field18946" json:"field18946,omitempty"`
 	Field18947    *uint64                      `protobuf:"fixed64,2,opt,name=field18947" json:"field18947,omitempty"`
 	Field18948    *int32                       `protobuf:"varint,3,opt,name=field18948" json:"field18948,omitempty"`
@@ -845,10 +882,18 @@
 func (*Message18921) ProtoMessage() {}
 
 func (x *Message18921) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18921) XXX_Methods() *protoiface.Methods {
+func (x *Message18921) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[4].Methods()
 }
 
@@ -942,6 +987,7 @@
 }
 
 type Message35540 struct {
+	state         protoimpl.MessageState
 	Field35541    *bool `protobuf:"varint,1,opt,name=field35541" json:"field35541,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -958,10 +1004,18 @@
 func (*Message35540) ProtoMessage() {}
 
 func (x *Message35540) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35540) XXX_Methods() *protoiface.Methods {
+func (x *Message35540) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[5].Methods()
 }
 
@@ -978,6 +1032,7 @@
 }
 
 type Message3886 struct {
+	state         protoimpl.MessageState
 	Message3887   []*Message3886_Message3887 `protobuf:"group,1,rep,name=Message3887,json=message3887" json:"message3887,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -994,10 +1049,18 @@
 func (*Message3886) ProtoMessage() {}
 
 func (x *Message3886) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3886) XXX_Methods() *protoiface.Methods {
+func (x *Message3886) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[6].Methods()
 }
 
@@ -1014,6 +1077,7 @@
 }
 
 type Message6743 struct {
+	state         protoimpl.MessageState
 	Field6759     *Message6721 `protobuf:"bytes,1,opt,name=field6759" json:"field6759,omitempty"`
 	Field6760     *Message6723 `protobuf:"bytes,2,opt,name=field6760" json:"field6760,omitempty"`
 	Field6761     *Message6723 `protobuf:"bytes,8,opt,name=field6761" json:"field6761,omitempty"`
@@ -1037,10 +1101,18 @@
 func (*Message6743) ProtoMessage() {}
 
 func (x *Message6743) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6743) XXX_Methods() *protoiface.Methods {
+func (x *Message6743) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[7].Methods()
 }
 
@@ -1106,6 +1178,7 @@
 }
 
 type Message6773 struct {
+	state         protoimpl.MessageState
 	Field6794     *Enum6769   `protobuf:"varint,1,opt,name=field6794,enum=benchmarks.google_message3.Enum6769" json:"field6794,omitempty"`
 	Field6795     *int32      `protobuf:"varint,9,opt,name=field6795" json:"field6795,omitempty"`
 	Field6796     *UnusedEnum `protobuf:"varint,10,opt,name=field6796,enum=benchmarks.google_message3.UnusedEnum" json:"field6796,omitempty"`
@@ -1131,10 +1204,18 @@
 func (*Message6773) ProtoMessage() {}
 
 func (x *Message6773) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6773) XXX_Methods() *protoiface.Methods {
+func (x *Message6773) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[8].Methods()
 }
 
@@ -1214,6 +1295,7 @@
 }
 
 type Message8224 struct {
+	state         protoimpl.MessageState
 	Field8255     *UnusedEmptyMessage   `protobuf:"bytes,1,opt,name=field8255" json:"field8255,omitempty"`
 	Field8256     *Message8184          `protobuf:"bytes,2,opt,name=field8256" json:"field8256,omitempty"`
 	Field8257     *Message7966          `protobuf:"bytes,3,opt,name=field8257" json:"field8257,omitempty"`
@@ -1256,10 +1338,18 @@
 func (*Message8224) ProtoMessage() {}
 
 func (x *Message8224) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8224) XXX_Methods() *protoiface.Methods {
+func (x *Message8224) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[9].Methods()
 }
 
@@ -1458,6 +1548,7 @@
 }
 
 type Message8392 struct {
+	state         protoimpl.MessageState
 	Field8395     *string      `protobuf:"bytes,1,opt,name=field8395" json:"field8395,omitempty"`
 	Field8396     *string      `protobuf:"bytes,2,opt,name=field8396" json:"field8396,omitempty"`
 	Field8397     *Message7966 `protobuf:"bytes,3,opt,name=field8397" json:"field8397,omitempty"`
@@ -1482,10 +1573,18 @@
 func (*Message8392) ProtoMessage() {}
 
 func (x *Message8392) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8392) XXX_Methods() *protoiface.Methods {
+func (x *Message8392) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[10].Methods()
 }
 
@@ -1558,6 +1657,7 @@
 }
 
 type Message8130 struct {
+	state         protoimpl.MessageState
 	Field8156     *string               `protobuf:"bytes,1,opt,name=field8156" json:"field8156,omitempty"`
 	Field8157     *string               `protobuf:"bytes,2,opt,name=field8157" json:"field8157,omitempty"`
 	Field8158     *string               `protobuf:"bytes,4,opt,name=field8158" json:"field8158,omitempty"`
@@ -1597,10 +1697,18 @@
 func (*Message8130) ProtoMessage() {}
 
 func (x *Message8130) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8130) XXX_Methods() *protoiface.Methods {
+func (x *Message8130) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[11].Methods()
 }
 
@@ -1778,6 +1886,7 @@
 }
 
 type Message8478 struct {
+	state         protoimpl.MessageState
 	Field8489     *string             `protobuf:"bytes,7,opt,name=field8489" json:"field8489,omitempty"`
 	Field8490     *Message7966        `protobuf:"bytes,1,opt,name=field8490" json:"field8490,omitempty"`
 	Field8491     *Message8476        `protobuf:"bytes,2,opt,name=field8491" json:"field8491,omitempty"`
@@ -1801,10 +1910,18 @@
 func (*Message8478) ProtoMessage() {}
 
 func (x *Message8478) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8478) XXX_Methods() *protoiface.Methods {
+func (x *Message8478) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[12].Methods()
 }
 
@@ -1870,6 +1987,7 @@
 }
 
 type Message8479 struct {
+	state         protoimpl.MessageState
 	Field8497     *Message8475        `protobuf:"bytes,1,opt,name=field8497" json:"field8497,omitempty"`
 	Field8498     *Message7966        `protobuf:"bytes,2,opt,name=field8498" json:"field8498,omitempty"`
 	Field8499     *Message8476        `protobuf:"bytes,3,opt,name=field8499" json:"field8499,omitempty"`
@@ -1894,10 +2012,18 @@
 func (*Message8479) ProtoMessage() {}
 
 func (x *Message8479) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8479) XXX_Methods() *protoiface.Methods {
+func (x *Message8479) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[13].Methods()
 }
 
@@ -1970,6 +2096,7 @@
 }
 
 type Message10319 struct {
+	state         protoimpl.MessageState
 	Field10340    *Enum10325 `protobuf:"varint,1,opt,name=field10340,enum=benchmarks.google_message3.Enum10325" json:"field10340,omitempty"`
 	Field10341    *int32     `protobuf:"varint,4,opt,name=field10341" json:"field10341,omitempty"`
 	Field10342    *int32     `protobuf:"varint,5,opt,name=field10342" json:"field10342,omitempty"`
@@ -1992,10 +2119,18 @@
 func (*Message10319) ProtoMessage() {}
 
 func (x *Message10319) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10319) XXX_Methods() *protoiface.Methods {
+func (x *Message10319) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[14].Methods()
 }
 
@@ -2054,6 +2189,7 @@
 }
 
 type Message4016 struct {
+	state         protoimpl.MessageState
 	Field4017     *int32 `protobuf:"varint,1,req,name=field4017" json:"field4017,omitempty"`
 	Field4018     *int32 `protobuf:"varint,2,req,name=field4018" json:"field4018,omitempty"`
 	Field4019     *int32 `protobuf:"varint,3,req,name=field4019" json:"field4019,omitempty"`
@@ -2073,10 +2209,18 @@
 func (*Message4016) ProtoMessage() {}
 
 func (x *Message4016) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message4016) XXX_Methods() *protoiface.Methods {
+func (x *Message4016) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[15].Methods()
 }
 
@@ -2114,6 +2258,7 @@
 }
 
 type Message12669 struct {
+	state         protoimpl.MessageState
 	Field12681    *Message12559 `protobuf:"bytes,1,opt,name=field12681" json:"field12681,omitempty"`
 	Field12682    *float32      `protobuf:"fixed32,2,opt,name=field12682" json:"field12682,omitempty"`
 	Field12683    *bool         `protobuf:"varint,3,opt,name=field12683" json:"field12683,omitempty"`
@@ -2133,10 +2278,18 @@
 func (*Message12669) ProtoMessage() {}
 
 func (x *Message12669) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12669) XXX_Methods() *protoiface.Methods {
+func (x *Message12669) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[16].Methods()
 }
 
@@ -2174,6 +2327,7 @@
 }
 
 type Message12819 struct {
+	state         protoimpl.MessageState
 	Field12834    *float64 `protobuf:"fixed64,1,opt,name=field12834" json:"field12834,omitempty"`
 	Field12835    *float64 `protobuf:"fixed64,2,opt,name=field12835" json:"field12835,omitempty"`
 	Field12836    *float64 `protobuf:"fixed64,3,opt,name=field12836" json:"field12836,omitempty"`
@@ -2195,10 +2349,18 @@
 func (*Message12819) ProtoMessage() {}
 
 func (x *Message12819) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12819) XXX_Methods() *protoiface.Methods {
+func (x *Message12819) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[17].Methods()
 }
 
@@ -2250,6 +2412,7 @@
 }
 
 type Message12820 struct {
+	state         protoimpl.MessageState
 	Field12840    *int32 `protobuf:"varint,1,opt,name=field12840" json:"field12840,omitempty"`
 	Field12841    *int32 `protobuf:"varint,2,opt,name=field12841" json:"field12841,omitempty"`
 	Field12842    *int32 `protobuf:"varint,3,opt,name=field12842" json:"field12842,omitempty"`
@@ -2273,10 +2436,18 @@
 func (*Message12820) ProtoMessage() {}
 
 func (x *Message12820) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12820) XXX_Methods() *protoiface.Methods {
+func (x *Message12820) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[18].Methods()
 }
 
@@ -2342,6 +2513,7 @@
 }
 
 type Message12821 struct {
+	state         protoimpl.MessageState
 	Field12848    *int32 `protobuf:"varint,1,opt,name=field12848" json:"field12848,omitempty"`
 	Field12849    *int32 `protobuf:"varint,2,opt,name=field12849" json:"field12849,omitempty"`
 	Field12850    *int32 `protobuf:"varint,3,opt,name=field12850" json:"field12850,omitempty"`
@@ -2362,10 +2534,18 @@
 func (*Message12821) ProtoMessage() {}
 
 func (x *Message12821) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12821) XXX_Methods() *protoiface.Methods {
+func (x *Message12821) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[19].Methods()
 }
 
@@ -2410,6 +2590,7 @@
 }
 
 type Message12818 struct {
+	state         protoimpl.MessageState
 	Field12829    *uint64         `protobuf:"varint,1,opt,name=field12829" json:"field12829,omitempty"`
 	Field12830    *int32          `protobuf:"varint,2,opt,name=field12830" json:"field12830,omitempty"`
 	Field12831    *int32          `protobuf:"varint,3,opt,name=field12831" json:"field12831,omitempty"`
@@ -2430,10 +2611,18 @@
 func (*Message12818) ProtoMessage() {}
 
 func (x *Message12818) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12818) XXX_Methods() *protoiface.Methods {
+func (x *Message12818) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[20].Methods()
 }
 
@@ -2478,6 +2667,7 @@
 }
 
 type Message16479 struct {
+	state         protoimpl.MessageState
 	Field16484    *Message16480 `protobuf:"bytes,1,opt,name=field16484" json:"field16484,omitempty"`
 	Field16485    *int32        `protobuf:"varint,5,opt,name=field16485" json:"field16485,omitempty"`
 	Field16486    *float32      `protobuf:"fixed32,2,opt,name=field16486" json:"field16486,omitempty"`
@@ -2499,10 +2689,18 @@
 func (*Message16479) ProtoMessage() {}
 
 func (x *Message16479) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16479) XXX_Methods() *protoiface.Methods {
+func (x *Message16479) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[21].Methods()
 }
 
@@ -2554,6 +2752,7 @@
 }
 
 type Message16722 struct {
+	state         protoimpl.MessageState
 	Field16752    *string `protobuf:"bytes,1,opt,name=field16752" json:"field16752,omitempty"`
 	Field16753    *string `protobuf:"bytes,2,opt,name=field16753" json:"field16753,omitempty"`
 	Field16754    *string `protobuf:"bytes,3,opt,name=field16754" json:"field16754,omitempty"`
@@ -2574,10 +2773,18 @@
 func (*Message16722) ProtoMessage() {}
 
 func (x *Message16722) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16722) XXX_Methods() *protoiface.Methods {
+func (x *Message16722) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[22].Methods()
 }
 
@@ -2622,6 +2829,7 @@
 }
 
 type Message16724 struct {
+	state         protoimpl.MessageState
 	Field16761    *int64              `protobuf:"varint,1,opt,name=field16761" json:"field16761,omitempty"`
 	Field16762    *float32            `protobuf:"fixed32,2,opt,name=field16762" json:"field16762,omitempty"`
 	Field16763    *int64              `protobuf:"varint,3,opt,name=field16763" json:"field16763,omitempty"`
@@ -2650,10 +2858,18 @@
 func (*Message16724) ProtoMessage() {}
 
 func (x *Message16724) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16724) XXX_Methods() *protoiface.Methods {
+func (x *Message16724) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[23].Methods()
 }
 
@@ -2754,6 +2970,7 @@
 }
 
 type Message17728 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2769,10 +2986,18 @@
 func (*Message17728) ProtoMessage() {}
 
 func (x *Message17728) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message17728) XXX_Methods() *protoiface.Methods {
+func (x *Message17728) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[24].Methods()
 }
 
@@ -2782,6 +3007,7 @@
 }
 
 type Message24356 struct {
+	state         protoimpl.MessageState
 	Field24559    *string               `protobuf:"bytes,1,opt,name=field24559" json:"field24559,omitempty"`
 	Field24560    *string               `protobuf:"bytes,2,opt,name=field24560" json:"field24560,omitempty"`
 	Field24561    *int32                `protobuf:"varint,14,opt,name=field24561" json:"field24561,omitempty"`
@@ -2812,10 +3038,18 @@
 func (*Message24356) ProtoMessage() {}
 
 func (x *Message24356) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24356) XXX_Methods() *protoiface.Methods {
+func (x *Message24356) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[25].Methods()
 }
 
@@ -2930,6 +3164,7 @@
 }
 
 type Message24376 struct {
+	state         protoimpl.MessageState
 	Field24589    *string               `protobuf:"bytes,1,opt,name=field24589" json:"field24589,omitempty"`
 	Field24590    *string               `protobuf:"bytes,2,opt,name=field24590" json:"field24590,omitempty"`
 	Field24591    *string               `protobuf:"bytes,3,opt,name=field24591" json:"field24591,omitempty"`
@@ -2959,10 +3194,18 @@
 func (*Message24376) ProtoMessage() {}
 
 func (x *Message24376) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24376) XXX_Methods() *protoiface.Methods {
+func (x *Message24376) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[26].Methods()
 }
 
@@ -3070,6 +3313,7 @@
 }
 
 type Message24366 struct {
+	state         protoimpl.MessageState
 	Field24574    *string               `protobuf:"bytes,1,opt,name=field24574" json:"field24574,omitempty"`
 	Field24575    *string               `protobuf:"bytes,2,opt,name=field24575" json:"field24575,omitempty"`
 	Field24576    *string               `protobuf:"bytes,3,opt,name=field24576" json:"field24576,omitempty"`
@@ -3100,10 +3344,18 @@
 func (*Message24366) ProtoMessage() {}
 
 func (x *Message24366) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24366) XXX_Methods() *protoiface.Methods {
+func (x *Message24366) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[27].Methods()
 }
 
@@ -3218,6 +3470,7 @@
 }
 
 type Message35546_Message35547 struct {
+	state         protoimpl.MessageState
 	Field35569    *int32 `protobuf:"varint,5,req,name=field35569" json:"field35569,omitempty"`
 	Field35570    *int32 `protobuf:"varint,6,req,name=field35570" json:"field35570,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3235,10 +3488,18 @@
 func (*Message35546_Message35547) ProtoMessage() {}
 
 func (x *Message35546_Message35547) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35546_Message35547) XXX_Methods() *protoiface.Methods {
+func (x *Message35546_Message35547) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[28].Methods()
 }
 
@@ -3262,6 +3523,7 @@
 }
 
 type Message35546_Message35548 struct {
+	state         protoimpl.MessageState
 	Field35571    *int64 `protobuf:"varint,11,req,name=field35571" json:"field35571,omitempty"`
 	Field35572    *int64 `protobuf:"varint,12,req,name=field35572" json:"field35572,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3279,10 +3541,18 @@
 func (*Message35546_Message35548) ProtoMessage() {}
 
 func (x *Message35546_Message35548) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35546_Message35548) XXX_Methods() *protoiface.Methods {
+func (x *Message35546_Message35548) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[29].Methods()
 }
 
@@ -3306,6 +3576,7 @@
 }
 
 type Message2356_Message2357 struct {
+	state         protoimpl.MessageState
 	Field2399     *int64 `protobuf:"varint,9,opt,name=field2399" json:"field2399,omitempty"`
 	Field2400     *int32 `protobuf:"varint,10,opt,name=field2400" json:"field2400,omitempty"`
 	Field2401     *int32 `protobuf:"varint,11,opt,name=field2401" json:"field2401,omitempty"`
@@ -3333,10 +3604,18 @@
 func (*Message2356_Message2357) ProtoMessage() {}
 
 func (x *Message2356_Message2357) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2357) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2357) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[30].Methods()
 }
 
@@ -3430,6 +3709,7 @@
 }
 
 type Message2356_Message2358 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3445,10 +3725,18 @@
 func (*Message2356_Message2358) ProtoMessage() {}
 
 func (x *Message2356_Message2358) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2358) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2358) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[31].Methods()
 }
 
@@ -3458,6 +3746,7 @@
 }
 
 type Message2356_Message2359 struct {
+	state         protoimpl.MessageState
 	Field2413     *string  `protobuf:"bytes,41,opt,name=field2413" json:"field2413,omitempty"`
 	Field2414     *string  `protobuf:"bytes,42,opt,name=field2414" json:"field2414,omitempty"`
 	Field2415     *string  `protobuf:"bytes,43,opt,name=field2415" json:"field2415,omitempty"`
@@ -3481,10 +3770,18 @@
 func (*Message2356_Message2359) ProtoMessage() {}
 
 func (x *Message2356_Message2359) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2359) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2359) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[32].Methods()
 }
 
@@ -3550,6 +3847,7 @@
 }
 
 type Message7029_Message7030 struct {
+	state         protoimpl.MessageState
 	Field7226     *string `protobuf:"bytes,14,opt,name=field7226" json:"field7226,omitempty"`
 	Field7227     *string `protobuf:"bytes,15,opt,name=field7227" json:"field7227,omitempty"`
 	Field7228     *int64  `protobuf:"varint,16,opt,name=field7228" json:"field7228,omitempty"`
@@ -3568,10 +3866,18 @@
 func (*Message7029_Message7030) ProtoMessage() {}
 
 func (x *Message7029_Message7030) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7029_Message7030) XXX_Methods() *protoiface.Methods {
+func (x *Message7029_Message7030) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[33].Methods()
 }
 
@@ -3602,6 +3908,7 @@
 }
 
 type Message7029_Message7031 struct {
+	state         protoimpl.MessageState
 	Field7229     *string `protobuf:"bytes,22,opt,name=field7229" json:"field7229,omitempty"`
 	Field7230     *int32  `protobuf:"varint,23,opt,name=field7230" json:"field7230,omitempty"`
 	Field7231     *int32  `protobuf:"varint,24,opt,name=field7231" json:"field7231,omitempty"`
@@ -3623,10 +3930,18 @@
 func (*Message7029_Message7031) ProtoMessage() {}
 
 func (x *Message7029_Message7031) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7029_Message7031) XXX_Methods() *protoiface.Methods {
+func (x *Message7029_Message7031) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[34].Methods()
 }
 
@@ -3678,6 +3993,7 @@
 }
 
 type Message18921_Message18922 struct {
+	state         protoimpl.MessageState
 	Field18959    *uint64             `protobuf:"varint,6,opt,name=field18959" json:"field18959,omitempty"`
 	Field18960    *string             `protobuf:"bytes,13,opt,name=field18960" json:"field18960,omitempty"`
 	Field18961    *bool               `protobuf:"varint,21,opt,name=field18961" json:"field18961,omitempty"`
@@ -3716,10 +4032,18 @@
 func (*Message18921_Message18922) ProtoMessage() {}
 
 func (x *Message18921_Message18922) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18921_Message18922) XXX_Methods() *protoiface.Methods {
+func (x *Message18921_Message18922) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[35].Methods()
 }
 
@@ -3890,6 +4214,7 @@
 }
 
 type Message3886_Message3887 struct {
+	state         protoimpl.MessageState
 	Field3932     *string      `protobuf:"bytes,2,req,name=field3932" json:"field3932,omitempty"`
 	Field3933     *string      `protobuf:"bytes,9,opt,name=field3933" json:"field3933,omitempty"`
 	Field3934     *Message3850 `protobuf:"bytes,3,opt,name=field3934" json:"field3934,omitempty"`
@@ -3909,10 +4234,18 @@
 func (*Message3886_Message3887) ProtoMessage() {}
 
 func (x *Message3886_Message3887) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3886_Message3887) XXX_Methods() *protoiface.Methods {
+func (x *Message3886_Message3887) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[36].Methods()
 }
 
@@ -5162,9 +5495,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35546); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5172,9 +5507,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356); i {
-			case 31:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 32:
+				return &v.sizeCache
+			case 33:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5182,9 +5519,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7029); i {
-			case 42:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 43:
+				return &v.sizeCache
+			case 44:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5192,9 +5531,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35538); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5202,9 +5543,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18921); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5212,9 +5555,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35540); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5222,9 +5567,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3886); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5232,9 +5579,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6743); i {
-			case 8:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 9:
+				return &v.sizeCache
+			case 10:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5242,6 +5591,32 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6773); i {
+			case 0:
+				return &v.state
+			case 11:
+				return &v.sizeCache
+			case 12:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8224); i {
+			case 0:
+				return &v.state
+			case 28:
+				return &v.sizeCache
+			case 29:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8392); i {
+			case 0:
+				return &v.state
 			case 10:
 				return &v.sizeCache
 			case 11:
@@ -5250,31 +5625,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8224); i {
-			case 27:
-				return &v.sizeCache
-			case 28:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8392); i {
-			case 9:
-				return &v.sizeCache
-			case 10:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8130); i {
-			case 24:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 25:
+				return &v.sizeCache
+			case 26:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5282,16 +5639,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8478); i {
-			case 8:
-				return &v.sizeCache
-			case 9:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8479); i {
+			case 0:
+				return &v.state
 			case 9:
 				return &v.sizeCache
 			case 10:
@@ -5300,48 +5649,22 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8479); i {
+			case 0:
+				return &v.state
+			case 10:
+				return &v.sizeCache
+			case 11:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10319); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message4016); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12669); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12819); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12820); i {
+			case 0:
+				return &v.state
 			case 8:
 				return &v.sizeCache
 			case 9:
@@ -5350,28 +5673,58 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message4016); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12669); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12819); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12820); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12821); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12818); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16479); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -5380,11 +5733,37 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12818); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16479); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16722); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5392,9 +5771,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16724); i {
-			case 13:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 14:
+				return &v.sizeCache
+			case 15:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5403,8 +5784,10 @@
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message17728); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5412,9 +5795,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24356); i {
-			case 15:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 16:
+				return &v.sizeCache
+			case 17:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5422,16 +5807,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24376); i {
-			case 14:
-				return &v.sizeCache
-			case 15:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24366); i {
+			case 0:
+				return &v.state
 			case 15:
 				return &v.sizeCache
 			case 16:
@@ -5440,11 +5817,25 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24366); i {
+			case 0:
+				return &v.state
+			case 16:
+				return &v.sizeCache
+			case 17:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35546_Message35547); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5452,9 +5843,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message35546_Message35548); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5462,9 +5855,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356_Message2357); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5473,8 +5868,10 @@
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356_Message2358); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5482,9 +5879,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356_Message2359); i {
-			case 8:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 9:
+				return &v.sizeCache
+			case 10:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5492,9 +5891,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7029_Message7030); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5502,9 +5903,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7029_Message7031); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5512,9 +5915,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18921_Message18922); i {
-			case 23:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 24:
+				return &v.sizeCache
+			case 25:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5522,9 +5927,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_3_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3886_Message3887); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_4.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_4.pb.go
index 6a38e88..52cbdfa 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_4.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_4.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message24346 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Message24346) ProtoMessage() {}
 
 func (x *Message24346) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24346) XXX_Methods() *protoiface.Methods {
+func (x *Message24346) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[0].Methods()
 }
 
@@ -46,6 +55,7 @@
 }
 
 type Message24401 struct {
+	state         protoimpl.MessageState
 	Field24679    *Message24400 `protobuf:"bytes,1,opt,name=field24679" json:"field24679,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -62,10 +72,18 @@
 func (*Message24401) ProtoMessage() {}
 
 func (x *Message24401) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24401) XXX_Methods() *protoiface.Methods {
+func (x *Message24401) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[1].Methods()
 }
 
@@ -82,6 +100,7 @@
 }
 
 type Message24402 struct {
+	state         protoimpl.MessageState
 	Field24680    *Message24400 `protobuf:"bytes,1,opt,name=field24680" json:"field24680,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -98,10 +117,18 @@
 func (*Message24402) ProtoMessage() {}
 
 func (x *Message24402) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24402) XXX_Methods() *protoiface.Methods {
+func (x *Message24402) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[2].Methods()
 }
 
@@ -118,6 +145,7 @@
 }
 
 type Message24379 struct {
+	state         protoimpl.MessageState
 	Field24603    *string               `protobuf:"bytes,1,opt,name=field24603" json:"field24603,omitempty"`
 	Field24604    *string               `protobuf:"bytes,2,opt,name=field24604" json:"field24604,omitempty"`
 	Field24605    *string               `protobuf:"bytes,3,opt,name=field24605" json:"field24605,omitempty"`
@@ -151,10 +179,18 @@
 func (*Message24379) ProtoMessage() {}
 
 func (x *Message24379) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24379) XXX_Methods() *protoiface.Methods {
+func (x *Message24379) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[3].Methods()
 }
 
@@ -290,6 +326,7 @@
 }
 
 type Message27358 struct {
+	state         protoimpl.MessageState
 	Field27415    *int32 `protobuf:"varint,1,opt,name=field27415" json:"field27415,omitempty"`
 	Field27416    *int32 `protobuf:"varint,2,opt,name=field27416" json:"field27416,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -307,10 +344,18 @@
 func (*Message27358) ProtoMessage() {}
 
 func (x *Message27358) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message27358) XXX_Methods() *protoiface.Methods {
+func (x *Message27358) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[4].Methods()
 }
 
@@ -334,6 +379,7 @@
 }
 
 type Message34381 struct {
+	state         protoimpl.MessageState
 	Field34398    *string             `protobuf:"bytes,1,opt,name=field34398" json:"field34398,omitempty"`
 	Field34399    *UnusedEmptyMessage `protobuf:"bytes,2,opt,name=field34399" json:"field34399,omitempty"`
 	Field34400    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field34400" json:"field34400,omitempty"`
@@ -359,10 +405,18 @@
 func (*Message34381) ProtoMessage() {}
 
 func (x *Message34381) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34381) XXX_Methods() *protoiface.Methods {
+func (x *Message34381) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[5].Methods()
 }
 
@@ -442,6 +496,7 @@
 }
 
 type Message34619 struct {
+	state         protoimpl.MessageState
 	Field34641    *float64            `protobuf:"fixed64,1,opt,name=field34641" json:"field34641,omitempty"`
 	Field34642    *float64            `protobuf:"fixed64,2,opt,name=field34642" json:"field34642,omitempty"`
 	Field34643    *float64            `protobuf:"fixed64,3,opt,name=field34643" json:"field34643,omitempty"`
@@ -464,10 +519,18 @@
 func (*Message34619) ProtoMessage() {}
 
 func (x *Message34619) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message34619) XXX_Methods() *protoiface.Methods {
+func (x *Message34619) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[6].Methods()
 }
 
@@ -526,6 +589,7 @@
 }
 
 type Message730 struct {
+	state           protoimpl.MessageState
 	Field897        *string               `protobuf:"bytes,19,opt,name=field897" json:"field897,omitempty"`
 	Field898        []string              `protobuf:"bytes,27,rep,name=field898" json:"field898,omitempty"`
 	Field899        []string              `protobuf:"bytes,28,rep,name=field899" json:"field899,omitempty"`
@@ -575,10 +639,18 @@
 func (*Message730) ProtoMessage() {}
 
 func (x *Message730) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message730) XXX_Methods() *protoiface.Methods {
+func (x *Message730) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[7].Methods()
 }
 
@@ -831,6 +903,7 @@
 }
 
 type Message33958 struct {
+	state         protoimpl.MessageState
 	Field33977    *string                      `protobuf:"bytes,1,opt,name=field33977" json:"field33977,omitempty"`
 	Field33978    *string                      `protobuf:"bytes,9,opt,name=field33978" json:"field33978,omitempty"`
 	Message33959  []*Message33958_Message33959 `protobuf:"group,2,rep,name=Message33959,json=message33959" json:"message33959,omitempty"`
@@ -850,10 +923,18 @@
 func (*Message33958) ProtoMessage() {}
 
 func (x *Message33958) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message33958) XXX_Methods() *protoiface.Methods {
+func (x *Message33958) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[8].Methods()
 }
 
@@ -891,6 +972,7 @@
 }
 
 type Message6637 struct {
+	state         protoimpl.MessageState
 	Field6670     *UnusedEmptyMessage   `protobuf:"bytes,2,opt,name=field6670" json:"field6670,omitempty"`
 	Field6671     []*UnusedEmptyMessage `protobuf:"bytes,1,rep,name=field6671" json:"field6671,omitempty"`
 	Field6672     *int32                `protobuf:"varint,3,opt,name=field6672" json:"field6672,omitempty"`
@@ -911,10 +993,18 @@
 func (*Message6637) ProtoMessage() {}
 
 func (x *Message6637) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6637) XXX_Methods() *protoiface.Methods {
+func (x *Message6637) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[9].Methods()
 }
 
@@ -959,6 +1049,7 @@
 }
 
 type Message6643 struct {
+	state         protoimpl.MessageState
 	Field6683     *UnusedEmptyMessage   `protobuf:"bytes,3,opt,name=field6683" json:"field6683,omitempty"`
 	Field6684     *UnusedEmptyMessage   `protobuf:"bytes,4,opt,name=field6684" json:"field6684,omitempty"`
 	Field6685     *float64              `protobuf:"fixed64,5,opt,name=field6685" json:"field6685,omitempty"`
@@ -992,10 +1083,18 @@
 func (*Message6643) ProtoMessage() {}
 
 func (x *Message6643) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6643) XXX_Methods() *protoiface.Methods {
+func (x *Message6643) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[10].Methods()
 }
 
@@ -1131,6 +1230,7 @@
 }
 
 type Message6126 struct {
+	state         protoimpl.MessageState
 	Field6152     *string               `protobuf:"bytes,1,req,name=field6152" json:"field6152,omitempty"`
 	Field6153     []*UnusedEmptyMessage `protobuf:"bytes,9,rep,name=field6153" json:"field6153,omitempty"`
 	Field6154     *int32                `protobuf:"varint,14,opt,name=field6154" json:"field6154,omitempty"`
@@ -1165,10 +1265,18 @@
 func (*Message6126) ProtoMessage() {}
 
 func (x *Message6126) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6126) XXX_Methods() *protoiface.Methods {
+func (x *Message6126) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[11].Methods()
 }
 
@@ -1311,6 +1419,7 @@
 }
 
 type Message13083 struct {
+	state         protoimpl.MessageState
 	Field13096    *float32                     `protobuf:"fixed32,1,opt,name=field13096" json:"field13096,omitempty"`
 	Message13084  []*Message13083_Message13084 `protobuf:"group,2,rep,name=Message13084,json=message13084" json:"message13084,omitempty"`
 	Field13098    *float32                     `protobuf:"fixed32,44,opt,name=field13098" json:"field13098,omitempty"`
@@ -1336,10 +1445,18 @@
 func (*Message13083) ProtoMessage() {}
 
 func (x *Message13083) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13083) XXX_Methods() *protoiface.Methods {
+func (x *Message13083) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[12].Methods()
 }
 
@@ -1419,6 +1536,7 @@
 }
 
 type Message13088 struct {
+	state         protoimpl.MessageState
 	Message13089  []*Message13088_Message13089 `protobuf:"group,1,rep,name=Message13089,json=message13089" json:"message13089,omitempty"`
 	Field13136    *int64                       `protobuf:"varint,4,opt,name=field13136" json:"field13136,omitempty"`
 	Field13137    *bool                        `protobuf:"varint,5,opt,name=field13137" json:"field13137,omitempty"`
@@ -1437,10 +1555,18 @@
 func (*Message13088) ProtoMessage() {}
 
 func (x *Message13088) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13088) XXX_Methods() *protoiface.Methods {
+func (x *Message13088) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[13].Methods()
 }
 
@@ -1471,6 +1597,7 @@
 }
 
 type Message10391 struct {
+	state         protoimpl.MessageState
 	Field10411    *Enum10392          `protobuf:"varint,1,opt,name=field10411,enum=benchmarks.google_message3.Enum10392" json:"field10411,omitempty"`
 	Field10412    *UnusedEnum         `protobuf:"varint,2,opt,name=field10412,enum=benchmarks.google_message3.UnusedEnum" json:"field10412,omitempty"`
 	Field10413    *int64              `protobuf:"varint,3,opt,name=field10413" json:"field10413,omitempty"`
@@ -1495,10 +1622,18 @@
 func (*Message10391) ProtoMessage() {}
 
 func (x *Message10391) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10391) XXX_Methods() *protoiface.Methods {
+func (x *Message10391) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[14].Methods()
 }
 
@@ -1571,6 +1706,7 @@
 }
 
 type Message11873 struct {
+	state           protoimpl.MessageState
 	Field11876      *string             `protobuf:"bytes,1,opt,name=field11876" json:"field11876,omitempty"`
 	Field11877      *string             `protobuf:"bytes,4,opt,name=field11877" json:"field11877,omitempty"`
 	Field11878      *Message10573       `protobuf:"bytes,5,opt,name=field11878" json:"field11878,omitempty"`
@@ -1599,10 +1735,18 @@
 func (*Message11873) ProtoMessage() {}
 
 func (x *Message11873) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11873) XXX_Methods() *protoiface.Methods {
+func (x *Message11873) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[15].Methods()
 }
 
@@ -1706,6 +1850,7 @@
 }
 
 type Message35506 struct {
+	state         protoimpl.MessageState
 	Field35524    *int32                `protobuf:"varint,1,opt,name=field35524" json:"field35524,omitempty"`
 	Field35525    *string               `protobuf:"bytes,2,opt,name=field35525" json:"field35525,omitempty"`
 	Field35526    *Enum35507            `protobuf:"varint,3,opt,name=field35526,enum=benchmarks.google_message3.Enum35507" json:"field35526,omitempty"`
@@ -1725,10 +1870,18 @@
 func (*Message35506) ProtoMessage() {}
 
 func (x *Message35506) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message35506) XXX_Methods() *protoiface.Methods {
+func (x *Message35506) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[16].Methods()
 }
 
@@ -1766,6 +1919,7 @@
 }
 
 type Message13151 struct {
+	state         protoimpl.MessageState
 	Field13158    []*Message13145 `protobuf:"bytes,1,rep,name=field13158" json:"field13158,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1782,10 +1936,18 @@
 func (*Message13151) ProtoMessage() {}
 
 func (x *Message13151) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13151) XXX_Methods() *protoiface.Methods {
+func (x *Message13151) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[17].Methods()
 }
 
@@ -1802,6 +1964,7 @@
 }
 
 type Message18253 struct {
+	state         protoimpl.MessageState
 	Message18254  []*Message18253_Message18254 `protobuf:"group,1,rep,name=Message18254,json=message18254" json:"message18254,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1818,10 +1981,18 @@
 func (*Message18253) ProtoMessage() {}
 
 func (x *Message18253) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18253) XXX_Methods() *protoiface.Methods {
+func (x *Message18253) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[18].Methods()
 }
 
@@ -1838,6 +2009,7 @@
 }
 
 type Message16685 struct {
+	state         protoimpl.MessageState
 	Field16694    []*Message16686 `protobuf:"bytes,2,rep,name=field16694" json:"field16694,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1854,10 +2026,18 @@
 func (*Message16685) ProtoMessage() {}
 
 func (x *Message16685) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16685) XXX_Methods() *protoiface.Methods {
+func (x *Message16685) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[19].Methods()
 }
 
@@ -1874,6 +2054,7 @@
 }
 
 type Message16816 struct {
+	state         protoimpl.MessageState
 	Field16826    *float32                     `protobuf:"fixed32,1,opt,name=field16826" json:"field16826,omitempty"`
 	Field16827    *Enum16819                   `protobuf:"varint,2,opt,name=field16827,enum=benchmarks.google_message3.Enum16819" json:"field16827,omitempty"`
 	Field16828    *float32                     `protobuf:"fixed32,3,opt,name=field16828" json:"field16828,omitempty"`
@@ -1899,10 +2080,18 @@
 func (*Message16816) ProtoMessage() {}
 
 func (x *Message16816) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16816) XXX_Methods() *protoiface.Methods {
+func (x *Message16816) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[20].Methods()
 }
 
@@ -1982,6 +2171,7 @@
 }
 
 type Message13168 struct {
+	state         protoimpl.MessageState
 	Field13212    *int32        `protobuf:"varint,1,req,name=field13212" json:"field13212,omitempty"`
 	Field13213    *uint64       `protobuf:"fixed64,7,opt,name=field13213" json:"field13213,omitempty"`
 	Field13214    *bool         `protobuf:"varint,8,opt,name=field13214" json:"field13214,omitempty"`
@@ -2008,10 +2198,18 @@
 func (*Message13168) ProtoMessage() {}
 
 func (x *Message13168) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13168) XXX_Methods() *protoiface.Methods {
+func (x *Message13168) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[21].Methods()
 }
 
@@ -2098,6 +2296,7 @@
 }
 
 type Message13167 struct {
+	state         protoimpl.MessageState
 	Field13199    *int32        `protobuf:"varint,1,req,name=field13199" json:"field13199,omitempty"`
 	Field13200    *int32        `protobuf:"varint,2,opt,name=field13200" json:"field13200,omitempty"`
 	Field13201    *int32        `protobuf:"varint,3,opt,name=field13201" json:"field13201,omitempty"`
@@ -2126,10 +2325,18 @@
 func (*Message13167) ProtoMessage() {}
 
 func (x *Message13167) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13167) XXX_Methods() *protoiface.Methods {
+func (x *Message13167) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[22].Methods()
 }
 
@@ -2230,6 +2437,7 @@
 }
 
 type Message1374 struct {
+	state         protoimpl.MessageState
 	Field1375     *string `protobuf:"bytes,1,req,name=field1375" json:"field1375,omitempty"`
 	Field1376     *string `protobuf:"bytes,2,opt,name=field1376" json:"field1376,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2247,10 +2455,18 @@
 func (*Message1374) ProtoMessage() {}
 
 func (x *Message1374) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1374) XXX_Methods() *protoiface.Methods {
+func (x *Message1374) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[23].Methods()
 }
 
@@ -2274,6 +2490,7 @@
 }
 
 type Message18943 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2289,10 +2506,18 @@
 func (*Message18943) ProtoMessage() {}
 
 func (x *Message18943) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18943) XXX_Methods() *protoiface.Methods {
+func (x *Message18943) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[24].Methods()
 }
 
@@ -2302,6 +2527,7 @@
 }
 
 type Message18944 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2317,10 +2543,18 @@
 func (*Message18944) ProtoMessage() {}
 
 func (x *Message18944) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18944) XXX_Methods() *protoiface.Methods {
+func (x *Message18944) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[25].Methods()
 }
 
@@ -2330,6 +2564,7 @@
 }
 
 type Message18856 struct {
+	state         protoimpl.MessageState
 	Field18857    *string  `protobuf:"bytes,1,opt,name=field18857" json:"field18857,omitempty"`
 	Field18858    *string  `protobuf:"bytes,2,opt,name=field18858" json:"field18858,omitempty"`
 	Field18859    *bool    `protobuf:"varint,31,opt,name=field18859" json:"field18859,omitempty"`
@@ -2376,10 +2611,18 @@
 func (*Message18856) ProtoMessage() {}
 
 func (x *Message18856) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18856) XXX_Methods() *protoiface.Methods {
+func (x *Message18856) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[26].Methods()
 }
 
@@ -2606,6 +2849,7 @@
 }
 
 type Message3850 struct {
+	state         protoimpl.MessageState
 	Field3924     *Enum3851 `protobuf:"varint,2,opt,name=field3924,enum=benchmarks.google_message3.Enum3851" json:"field3924,omitempty"`
 	Field3925     *bool     `protobuf:"varint,12,opt,name=field3925" json:"field3925,omitempty"`
 	Field3926     *int32    `protobuf:"varint,4,opt,name=field3926" json:"field3926,omitempty"`
@@ -2627,10 +2871,18 @@
 func (*Message3850) ProtoMessage() {}
 
 func (x *Message3850) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3850) XXX_Methods() *protoiface.Methods {
+func (x *Message3850) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[27].Methods()
 }
 
@@ -2682,6 +2934,7 @@
 }
 
 type Message6721 struct {
+	state         protoimpl.MessageState
 	Field6744     *Message6722 `protobuf:"bytes,1,opt,name=field6744" json:"field6744,omitempty"`
 	Field6745     *bool        `protobuf:"varint,2,opt,name=field6745" json:"field6745,omitempty"`
 	Field6746     *bool        `protobuf:"varint,3,opt,name=field6746" json:"field6746,omitempty"`
@@ -2701,10 +2954,18 @@
 func (*Message6721) ProtoMessage() {}
 
 func (x *Message6721) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6721) XXX_Methods() *protoiface.Methods {
+func (x *Message6721) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[28].Methods()
 }
 
@@ -2742,6 +3003,7 @@
 }
 
 type Message6742 struct {
+	state         protoimpl.MessageState
 	Field6758     *bool `protobuf:"varint,1,opt,name=field6758" json:"field6758,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2758,10 +3020,18 @@
 func (*Message6742) ProtoMessage() {}
 
 func (x *Message6742) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6742) XXX_Methods() *protoiface.Methods {
+func (x *Message6742) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[29].Methods()
 }
 
@@ -2778,6 +3048,7 @@
 }
 
 type Message6726 struct {
+	state         protoimpl.MessageState
 	Field6752     *int64         `protobuf:"varint,1,opt,name=field6752" json:"field6752,omitempty"`
 	Field6753     []*Message6727 `protobuf:"bytes,2,rep,name=field6753" json:"field6753,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2795,10 +3066,18 @@
 func (*Message6726) ProtoMessage() {}
 
 func (x *Message6726) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6726) XXX_Methods() *protoiface.Methods {
+func (x *Message6726) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[30].Methods()
 }
 
@@ -2822,6 +3101,7 @@
 }
 
 type Message6733 struct {
+	state         protoimpl.MessageState
 	Field6754     *int64 `protobuf:"varint,1,opt,name=field6754" json:"field6754,omitempty"`
 	Field6755     *int64 `protobuf:"varint,2,opt,name=field6755" json:"field6755,omitempty"`
 	Field6756     *bool  `protobuf:"varint,3,opt,name=field6756" json:"field6756,omitempty"`
@@ -2840,10 +3120,18 @@
 func (*Message6733) ProtoMessage() {}
 
 func (x *Message6733) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6733) XXX_Methods() *protoiface.Methods {
+func (x *Message6733) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[31].Methods()
 }
 
@@ -2874,6 +3162,7 @@
 }
 
 type Message6723 struct {
+	state         protoimpl.MessageState
 	Field6748     *int64         `protobuf:"varint,1,opt,name=field6748" json:"field6748,omitempty"`
 	Field6749     []*Message6724 `protobuf:"bytes,2,rep,name=field6749" json:"field6749,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2891,10 +3180,18 @@
 func (*Message6723) ProtoMessage() {}
 
 func (x *Message6723) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6723) XXX_Methods() *protoiface.Methods {
+func (x *Message6723) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[32].Methods()
 }
 
@@ -2918,6 +3215,7 @@
 }
 
 type Message6725 struct {
+	state         protoimpl.MessageState
 	Field6750     *int32 `protobuf:"varint,1,opt,name=field6750" json:"field6750,omitempty"`
 	Field6751     *int32 `protobuf:"varint,2,opt,name=field6751" json:"field6751,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2935,10 +3233,18 @@
 func (*Message6725) ProtoMessage() {}
 
 func (x *Message6725) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6725) XXX_Methods() *protoiface.Methods {
+func (x *Message6725) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[33].Methods()
 }
 
@@ -2962,6 +3268,7 @@
 }
 
 type Message6734 struct {
+	state         protoimpl.MessageState
 	Field6757     []*Message6735 `protobuf:"bytes,1,rep,name=field6757" json:"field6757,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2978,10 +3285,18 @@
 func (*Message6734) ProtoMessage() {}
 
 func (x *Message6734) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6734) XXX_Methods() *protoiface.Methods {
+func (x *Message6734) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[34].Methods()
 }
 
@@ -2998,6 +3313,7 @@
 }
 
 type Message8184 struct {
+	state         protoimpl.MessageState
 	Field8228     *Message7966   `protobuf:"bytes,1,opt,name=field8228" json:"field8228,omitempty"`
 	Field8229     *bool          `protobuf:"varint,2,opt,name=field8229" json:"field8229,omitempty"`
 	Field8230     []*Message8183 `protobuf:"bytes,3,rep,name=field8230" json:"field8230,omitempty"`
@@ -3016,10 +3332,18 @@
 func (*Message8184) ProtoMessage() {}
 
 func (x *Message8184) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8184) XXX_Methods() *protoiface.Methods {
+func (x *Message8184) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[35].Methods()
 }
 
@@ -3050,6 +3374,7 @@
 }
 
 type Message8477 struct {
+	state         protoimpl.MessageState
 	Field8486     *Message7966 `protobuf:"bytes,1,opt,name=field8486" json:"field8486,omitempty"`
 	Field8487     *int64       `protobuf:"varint,2,opt,name=field8487" json:"field8487,omitempty"`
 	Field8488     *string      `protobuf:"bytes,3,opt,name=field8488" json:"field8488,omitempty"`
@@ -3068,10 +3393,18 @@
 func (*Message8477) ProtoMessage() {}
 
 func (x *Message8477) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8477) XXX_Methods() *protoiface.Methods {
+func (x *Message8477) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[36].Methods()
 }
 
@@ -3102,6 +3435,7 @@
 }
 
 type Message8454 struct {
+	state         protoimpl.MessageState
 	Field8465     *Message8449 `protobuf:"bytes,1,opt,name=field8465" json:"field8465,omitempty"`
 	Field8466     *int64       `protobuf:"varint,3,opt,name=field8466" json:"field8466,omitempty"`
 	Field8467     *int32       `protobuf:"varint,4,opt,name=field8467" json:"field8467,omitempty"`
@@ -3121,10 +3455,18 @@
 func (*Message8454) ProtoMessage() {}
 
 func (x *Message8454) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8454) XXX_Methods() *protoiface.Methods {
+func (x *Message8454) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[37].Methods()
 }
 
@@ -3162,6 +3504,7 @@
 }
 
 type Message8476 struct {
+	state         protoimpl.MessageState
 	Field8483     *string `protobuf:"bytes,1,opt,name=field8483" json:"field8483,omitempty"`
 	Field8484     *string `protobuf:"bytes,2,opt,name=field8484" json:"field8484,omitempty"`
 	Field8485     *string `protobuf:"bytes,3,opt,name=field8485" json:"field8485,omitempty"`
@@ -3180,10 +3523,18 @@
 func (*Message8476) ProtoMessage() {}
 
 func (x *Message8476) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8476) XXX_Methods() *protoiface.Methods {
+func (x *Message8476) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[38].Methods()
 }
 
@@ -3214,6 +3565,7 @@
 }
 
 type Message8455 struct {
+	state         protoimpl.MessageState
 	Field8470     *Message8449        `protobuf:"bytes,1,opt,name=field8470" json:"field8470,omitempty"`
 	Field8471     []*Message8456      `protobuf:"bytes,2,rep,name=field8471" json:"field8471,omitempty"`
 	Field8472     *Message8457        `protobuf:"bytes,5,opt,name=field8472" json:"field8472,omitempty"`
@@ -3233,10 +3585,18 @@
 func (*Message8455) ProtoMessage() {}
 
 func (x *Message8455) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8455) XXX_Methods() *protoiface.Methods {
+func (x *Message8455) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[39].Methods()
 }
 
@@ -3274,6 +3634,7 @@
 }
 
 type Message8475 struct {
+	state         protoimpl.MessageState
 	Field8481     *string `protobuf:"bytes,1,opt,name=field8481" json:"field8481,omitempty"`
 	Field8482     *int64  `protobuf:"varint,2,opt,name=field8482" json:"field8482,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3291,10 +3652,18 @@
 func (*Message8475) ProtoMessage() {}
 
 func (x *Message8475) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8475) XXX_Methods() *protoiface.Methods {
+func (x *Message8475) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[40].Methods()
 }
 
@@ -3318,6 +3687,7 @@
 }
 
 type Message12559 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3333,10 +3703,18 @@
 func (*Message12559) ProtoMessage() {}
 
 func (x *Message12559) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12559) XXX_Methods() *protoiface.Methods {
+func (x *Message12559) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[41].Methods()
 }
 
@@ -3346,6 +3724,7 @@
 }
 
 type Message12817 struct {
+	state         protoimpl.MessageState
 	Field12826    *int32 `protobuf:"varint,1,opt,name=field12826" json:"field12826,omitempty"`
 	Field12827    *int32 `protobuf:"varint,2,opt,name=field12827" json:"field12827,omitempty"`
 	Field12828    *int32 `protobuf:"varint,3,opt,name=field12828" json:"field12828,omitempty"`
@@ -3364,10 +3743,18 @@
 func (*Message12817) ProtoMessage() {}
 
 func (x *Message12817) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[42].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12817) XXX_Methods() *protoiface.Methods {
+func (x *Message12817) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[42].Methods()
 }
 
@@ -3398,6 +3785,7 @@
 }
 
 type Message16480 struct {
+	state         protoimpl.MessageState
 	Field16490    *Message13358 `protobuf:"bytes,1,opt,name=field16490" json:"field16490,omitempty"`
 	Field16491    *Enum16042    `protobuf:"varint,2,opt,name=field16491,enum=benchmarks.google_message3.Enum16042" json:"field16491,omitempty"`
 	Field16492    *Message13912 `protobuf:"bytes,3,opt,name=field16492" json:"field16492,omitempty"`
@@ -3422,10 +3810,18 @@
 func (*Message16480) ProtoMessage() {}
 
 func (x *Message16480) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[43].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16480) XXX_Methods() *protoiface.Methods {
+func (x *Message16480) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[43].Methods()
 }
 
@@ -3498,6 +3894,7 @@
 }
 
 type Message24317 struct {
+	state         protoimpl.MessageState
 	Field24446    *string               `protobuf:"bytes,1,opt,name=field24446" json:"field24446,omitempty"`
 	Field24447    *Message24312         `protobuf:"bytes,2,opt,name=field24447" json:"field24447,omitempty"`
 	Field24448    []*Message24315       `protobuf:"bytes,3,rep,name=field24448" json:"field24448,omitempty"`
@@ -3542,10 +3939,18 @@
 func (*Message24317) ProtoMessage() {}
 
 func (x *Message24317) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[44].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24317) XXX_Methods() *protoiface.Methods {
+func (x *Message24317) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[44].Methods()
 }
 
@@ -3758,6 +4163,7 @@
 }
 
 type Message33958_Message33959 struct {
+	state         protoimpl.MessageState
 	Field33982    *string   `protobuf:"bytes,3,req,name=field33982" json:"field33982,omitempty"`
 	Field33983    *string   `protobuf:"bytes,4,opt,name=field33983" json:"field33983,omitempty"`
 	Field33984    *string   `protobuf:"bytes,5,opt,name=field33984" json:"field33984,omitempty"`
@@ -3779,10 +4185,18 @@
 func (*Message33958_Message33959) ProtoMessage() {}
 
 func (x *Message33958_Message33959) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[45].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message33958_Message33959) XXX_Methods() *protoiface.Methods {
+func (x *Message33958_Message33959) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[45].Methods()
 }
 
@@ -3834,6 +4248,7 @@
 }
 
 type Message13083_Message13084 struct {
+	state         protoimpl.MessageState
 	Field13107    *float32    `protobuf:"fixed32,3,req,name=field13107" json:"field13107,omitempty"`
 	Field13108    *int32      `protobuf:"varint,4,req,name=field13108" json:"field13108,omitempty"`
 	Field13109    *float32    `protobuf:"fixed32,5,opt,name=field13109" json:"field13109,omitempty"`
@@ -3853,10 +4268,18 @@
 func (*Message13083_Message13084) ProtoMessage() {}
 
 func (x *Message13083_Message13084) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[46].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13083_Message13084) XXX_Methods() *protoiface.Methods {
+func (x *Message13083_Message13084) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[46].Methods()
 }
 
@@ -3894,6 +4317,7 @@
 }
 
 type Message13083_Message13085 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3909,10 +4333,18 @@
 func (*Message13083_Message13085) ProtoMessage() {}
 
 func (x *Message13083_Message13085) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[47].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[47]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13083_Message13085) XXX_Methods() *protoiface.Methods {
+func (x *Message13083_Message13085) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[47].Methods()
 }
 
@@ -3922,6 +4354,7 @@
 }
 
 type Message13083_Message13086 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3937,10 +4370,18 @@
 func (*Message13083_Message13086) ProtoMessage() {}
 
 func (x *Message13083_Message13086) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[48].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[48]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13083_Message13086) XXX_Methods() *protoiface.Methods {
+func (x *Message13083_Message13086) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[48].Methods()
 }
 
@@ -3950,6 +4391,7 @@
 }
 
 type Message13083_Message13087 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3965,10 +4407,18 @@
 func (*Message13083_Message13087) ProtoMessage() {}
 
 func (x *Message13083_Message13087) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[49].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[49]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13083_Message13087) XXX_Methods() *protoiface.Methods {
+func (x *Message13083_Message13087) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[49].Methods()
 }
 
@@ -3978,6 +4428,7 @@
 }
 
 type Message13088_Message13089 struct {
+	state         protoimpl.MessageState
 	Field13139    *string  `protobuf:"bytes,2,req,name=field13139" json:"field13139,omitempty"`
 	Field13140    *float32 `protobuf:"fixed32,3,opt,name=field13140" json:"field13140,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3995,10 +4446,18 @@
 func (*Message13088_Message13089) ProtoMessage() {}
 
 func (x *Message13088_Message13089) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[50].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[50]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13088_Message13089) XXX_Methods() *protoiface.Methods {
+func (x *Message13088_Message13089) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[50].Methods()
 }
 
@@ -4022,6 +4481,7 @@
 }
 
 type Message18253_Message18254 struct {
+	state         protoimpl.MessageState
 	Field18362    *uint64  `protobuf:"fixed64,2,req,name=field18362" json:"field18362,omitempty"`
 	Field18363    *float64 `protobuf:"fixed64,3,req,name=field18363" json:"field18363,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -4039,10 +4499,18 @@
 func (*Message18253_Message18254) ProtoMessage() {}
 
 func (x *Message18253_Message18254) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[51].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[51]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message18253_Message18254) XXX_Methods() *protoiface.Methods {
+func (x *Message18253_Message18254) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[51].Methods()
 }
 
@@ -4066,6 +4534,7 @@
 }
 
 type Message16816_Message16817 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4081,10 +4550,18 @@
 func (*Message16816_Message16817) ProtoMessage() {}
 
 func (x *Message16816_Message16817) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[52].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[52]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16816_Message16817) XXX_Methods() *protoiface.Methods {
+func (x *Message16816_Message16817) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[52].Methods()
 }
 
@@ -4094,6 +4571,7 @@
 }
 
 type Message16816_Message16818 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -4109,10 +4587,18 @@
 func (*Message16816_Message16818) ProtoMessage() {}
 
 func (x *Message16816_Message16818) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[53].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[53]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16816_Message16818) XXX_Methods() *protoiface.Methods {
+func (x *Message16816_Message16818) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[53].Methods()
 }
 
@@ -5429,8 +5915,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24346); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5438,36 +5926,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24401); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24402); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24379); i {
-			case 18:
-				return &v.sizeCache
-			case 19:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message27358); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -5476,70 +5936,22 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message34381); i {
-			case 10:
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24402); i {
+			case 0:
+				return &v.state
+			case 2:
 				return &v.sizeCache
-			case 11:
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message34619); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message730); i {
-			case 33:
-				return &v.sizeCache
-			case 34:
-				return &v.unknownFields
-			case 35:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message33958); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6637); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6643); i {
-			case 18:
-				return &v.sizeCache
-			case 19:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6126); i {
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24379); i {
+			case 0:
+				return &v.state
 			case 19:
 				return &v.sizeCache
 			case 20:
@@ -5548,18 +5960,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13083); i {
-			case 10:
-				return &v.sizeCache
-			case 11:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13088); i {
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message27358); i {
+			case 0:
+				return &v.state
 			case 3:
 				return &v.sizeCache
 			case 4:
@@ -5568,30 +5972,108 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10391); i {
-			case 9:
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message34381); i {
+			case 0:
+				return &v.state
+			case 11:
 				return &v.sizeCache
-			case 10:
+			case 12:
 				return &v.unknownFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11873); i {
-			case 12:
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message34619); i {
+			case 0:
+				return &v.state
+			case 8:
 				return &v.sizeCache
-			case 13:
+			case 9:
 				return &v.unknownFields
-			case 14:
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message730); i {
+			case 0:
+				return &v.state
+			case 34:
+				return &v.sizeCache
+			case 35:
+				return &v.unknownFields
+			case 36:
 				return &v.extensionFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message35506); i {
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message33958); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6637); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6643); i {
+			case 0:
+				return &v.state
+			case 19:
+				return &v.sizeCache
+			case 20:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6126); i {
+			case 0:
+				return &v.state
+			case 20:
+				return &v.sizeCache
+			case 21:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13083); i {
+			case 0:
+				return &v.state
+			case 11:
+				return &v.sizeCache
+			case 12:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13088); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -5600,38 +6082,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13151); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message18253); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16685); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16816); i {
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10391); i {
+			case 0:
+				return &v.state
 			case 10:
 				return &v.sizeCache
 			case 11:
@@ -5640,8 +6094,72 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13168); i {
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11873); i {
+			case 0:
+				return &v.state
+			case 13:
+				return &v.sizeCache
+			case 14:
+				return &v.unknownFields
+			case 15:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message35506); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13151); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message18253); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16685); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16816); i {
+			case 0:
+				return &v.state
 			case 11:
 				return &v.sizeCache
 			case 12:
@@ -5650,11 +6168,25 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13168); i {
+			case 0:
+				return &v.state
+			case 12:
+				return &v.sizeCache
+			case 13:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13167); i {
-			case 13:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 14:
+				return &v.sizeCache
+			case 15:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5662,9 +6194,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1374); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5673,8 +6207,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18943); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5683,8 +6219,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18944); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5692,9 +6230,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18856); i {
-			case 31:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 32:
+				return &v.sizeCache
+			case 33:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5702,9 +6242,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3850); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5712,9 +6254,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6721); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5722,9 +6266,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6742); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5732,9 +6278,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6726); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5742,9 +6290,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6733); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5752,9 +6302,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6723); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5762,9 +6314,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6725); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5772,9 +6326,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6734); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5782,9 +6338,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8184); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5792,9 +6350,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8477); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5802,9 +6362,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8454); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5812,16 +6374,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8476); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8455); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -5830,11 +6384,25 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8455); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8475); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5843,8 +6411,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12559); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5852,46 +6422,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12817); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message16480); i {
-			case 9:
-				return &v.sizeCache
-			case 10:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24317); i {
-			case 29:
-				return &v.sizeCache
-			case 30:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message33958_Message33959); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13083_Message13084); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -5900,11 +6432,61 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message16480); i {
+			case 0:
+				return &v.state
+			case 10:
+				return &v.sizeCache
+			case 11:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24317); i {
+			case 0:
+				return &v.state
+			case 30:
+				return &v.sizeCache
+			case 31:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message33958_Message33959); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13083_Message13084); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13083_Message13085); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5913,8 +6495,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13083_Message13086); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5923,8 +6507,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13083_Message13087); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5932,9 +6518,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13088_Message13089); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5942,9 +6530,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message18253_Message18254); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5953,8 +6543,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16816_Message16817); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5963,8 +6555,10 @@
 		file_datasets_google_message3_benchmark_message3_4_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16816_Message16818); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_5.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_5.pb.go
index cc1ddc4..b8391f5 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_5.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_5.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message24377 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Message24377) ProtoMessage() {}
 
 func (x *Message24377) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24377) XXX_Methods() *protoiface.Methods {
+func (x *Message24377) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[0].Methods()
 }
 
@@ -46,6 +55,7 @@
 }
 
 type Message24378 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -61,10 +71,18 @@
 func (*Message24378) ProtoMessage() {}
 
 func (x *Message24378) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24378) XXX_Methods() *protoiface.Methods {
+func (x *Message24378) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[1].Methods()
 }
 
@@ -74,6 +92,7 @@
 }
 
 type Message24400 struct {
+	state         protoimpl.MessageState
 	Field24674    *int32 `protobuf:"varint,1,opt,name=field24674" json:"field24674,omitempty"`
 	Field24675    *int32 `protobuf:"varint,2,opt,name=field24675" json:"field24675,omitempty"`
 	Field24676    *int32 `protobuf:"varint,3,opt,name=field24676" json:"field24676,omitempty"`
@@ -94,10 +113,18 @@
 func (*Message24400) ProtoMessage() {}
 
 func (x *Message24400) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24400) XXX_Methods() *protoiface.Methods {
+func (x *Message24400) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[2].Methods()
 }
 
@@ -142,6 +169,7 @@
 }
 
 type Message24380 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -157,10 +185,18 @@
 func (*Message24380) ProtoMessage() {}
 
 func (x *Message24380) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24380) XXX_Methods() *protoiface.Methods {
+func (x *Message24380) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[3].Methods()
 }
 
@@ -170,6 +206,7 @@
 }
 
 type Message24381 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -185,10 +222,18 @@
 func (*Message24381) ProtoMessage() {}
 
 func (x *Message24381) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24381) XXX_Methods() *protoiface.Methods {
+func (x *Message24381) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[4].Methods()
 }
 
@@ -198,6 +243,7 @@
 }
 
 type Message719 struct {
+	state         protoimpl.MessageState
 	Field881      []string `protobuf:"bytes,1,rep,name=field881" json:"field881,omitempty"`
 	Field882      []string `protobuf:"bytes,2,rep,name=field882" json:"field882,omitempty"`
 	Field883      []string `protobuf:"bytes,3,rep,name=field883" json:"field883,omitempty"`
@@ -217,10 +263,18 @@
 func (*Message719) ProtoMessage() {}
 
 func (x *Message719) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message719) XXX_Methods() *protoiface.Methods {
+func (x *Message719) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[5].Methods()
 }
 
@@ -258,6 +312,7 @@
 }
 
 type Message728 struct {
+	state           protoimpl.MessageState
 	Field887        *string       `protobuf:"bytes,1,req,name=field887" json:"field887,omitempty"`
 	Field888        []string      `protobuf:"bytes,2,rep,name=field888" json:"field888,omitempty"`
 	Field889        []*Message703 `protobuf:"bytes,3,rep,name=field889" json:"field889,omitempty"`
@@ -283,10 +338,18 @@
 func (*Message728) ProtoMessage() {}
 
 func (x *Message728) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message728) XXX_Methods() *protoiface.Methods {
+func (x *Message728) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[6].Methods()
 }
 
@@ -370,6 +433,7 @@
 }
 
 type Message704 struct {
+	state         protoimpl.MessageState
 	Field800      *string             `protobuf:"bytes,1,opt,name=field800" json:"field800,omitempty"`
 	Field801      *string             `protobuf:"bytes,7,opt,name=field801" json:"field801,omitempty"`
 	Field802      *string             `protobuf:"bytes,2,opt,name=field802" json:"field802,omitempty"`
@@ -392,10 +456,18 @@
 func (*Message704) ProtoMessage() {}
 
 func (x *Message704) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message704) XXX_Methods() *protoiface.Methods {
+func (x *Message704) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[7].Methods()
 }
 
@@ -454,6 +526,7 @@
 }
 
 type Message697 struct {
+	state           protoimpl.MessageState
 	Field743        *string       `protobuf:"bytes,7,opt,name=field743" json:"field743,omitempty"`
 	Field744        []string      `protobuf:"bytes,1,rep,name=field744" json:"field744,omitempty"`
 	Field745        []string      `protobuf:"bytes,2,rep,name=field745" json:"field745,omitempty"`
@@ -506,10 +579,18 @@
 func (*Message697) ProtoMessage() {}
 
 func (x *Message697) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message697) XXX_Methods() *protoiface.Methods {
+func (x *Message697) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[8].Methods()
 }
 
@@ -781,6 +862,7 @@
 }
 
 type Message0 struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -797,10 +879,18 @@
 func (*Message0) ProtoMessage() {}
 
 func (x *Message0) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message0) XXX_Methods() *protoiface.Methods {
+func (x *Message0) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[9].Methods()
 }
 
@@ -819,6 +909,7 @@
 }
 
 type Message6578 struct {
+	state         protoimpl.MessageState
 	Field6632     *Enum6579 `protobuf:"varint,1,opt,name=field6632,enum=benchmarks.google_message3.Enum6579" json:"field6632,omitempty"`
 	Field6633     *Enum6588 `protobuf:"varint,2,opt,name=field6633,enum=benchmarks.google_message3.Enum6588" json:"field6633,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -836,10 +927,18 @@
 func (*Message6578) ProtoMessage() {}
 
 func (x *Message6578) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6578) XXX_Methods() *protoiface.Methods {
+func (x *Message6578) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[10].Methods()
 }
 
@@ -863,6 +962,7 @@
 }
 
 type Message6024 struct {
+	state         protoimpl.MessageState
 	Field6048     *Enum6025           `protobuf:"varint,1,opt,name=field6048,enum=benchmarks.google_message3.Enum6025" json:"field6048,omitempty"`
 	Field6049     *string             `protobuf:"bytes,2,opt,name=field6049" json:"field6049,omitempty"`
 	Field6050     *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field6050" json:"field6050,omitempty"`
@@ -881,10 +981,18 @@
 func (*Message6024) ProtoMessage() {}
 
 func (x *Message6024) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6024) XXX_Methods() *protoiface.Methods {
+func (x *Message6024) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[11].Methods()
 }
 
@@ -915,6 +1023,7 @@
 }
 
 type Message6052 struct {
+	state         protoimpl.MessageState
 	Field6084     *string `protobuf:"bytes,1,req,name=field6084" json:"field6084,omitempty"`
 	Field6085     []byte  `protobuf:"bytes,2,req,name=field6085" json:"field6085,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -932,10 +1041,18 @@
 func (*Message6052) ProtoMessage() {}
 
 func (x *Message6052) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6052) XXX_Methods() *protoiface.Methods {
+func (x *Message6052) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[12].Methods()
 }
 
@@ -959,6 +1076,7 @@
 }
 
 type Message6054 struct {
+	state         protoimpl.MessageState
 	Field6089     *string `protobuf:"bytes,1,req,name=field6089" json:"field6089,omitempty"`
 	Field6090     *string `protobuf:"bytes,2,opt,name=field6090" json:"field6090,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -976,10 +1094,18 @@
 func (*Message6054) ProtoMessage() {}
 
 func (x *Message6054) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6054) XXX_Methods() *protoiface.Methods {
+func (x *Message6054) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[13].Methods()
 }
 
@@ -1003,6 +1129,7 @@
 }
 
 type Message10573 struct {
+	state           protoimpl.MessageState
 	Field10580      []*Message10576 `protobuf:"bytes,1,rep,name=field10580" json:"field10580,omitempty"`
 	Field10581      *string         `protobuf:"bytes,2,opt,name=field10581" json:"field10581,omitempty"`
 	sizeCache       protoimpl.SizeCache
@@ -1021,10 +1148,18 @@
 func (*Message10573) ProtoMessage() {}
 
 func (x *Message10573) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10573) XXX_Methods() *protoiface.Methods {
+func (x *Message10573) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[14].Methods()
 }
 
@@ -1057,6 +1192,7 @@
 }
 
 type Message10824 struct {
+	state         protoimpl.MessageState
 	Field10825    *string `protobuf:"bytes,1,req,name=field10825" json:"field10825,omitempty"`
 	Field10826    *int32  `protobuf:"varint,2,opt,name=field10826" json:"field10826,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1074,10 +1210,18 @@
 func (*Message10824) ProtoMessage() {}
 
 func (x *Message10824) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10824) XXX_Methods() *protoiface.Methods {
+func (x *Message10824) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[15].Methods()
 }
 
@@ -1101,6 +1245,7 @@
 }
 
 type Message10582 struct {
+	state         protoimpl.MessageState
 	Field10583    *bool    `protobuf:"varint,1,req,name=field10583" json:"field10583,omitempty"`
 	Field10584    *float64 `protobuf:"fixed64,2,req,name=field10584" json:"field10584,omitempty"`
 	Field10585    *bool    `protobuf:"varint,3,opt,name=field10585" json:"field10585,omitempty"`
@@ -1122,10 +1267,18 @@
 func (*Message10582) ProtoMessage() {}
 
 func (x *Message10582) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10582) XXX_Methods() *protoiface.Methods {
+func (x *Message10582) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[16].Methods()
 }
 
@@ -1177,6 +1330,7 @@
 }
 
 type Message10155 struct {
+	state           protoimpl.MessageState
 	Field10195      *int32                       `protobuf:"varint,1,req,name=field10195" json:"field10195,omitempty"`
 	Field10196      *int32                       `protobuf:"varint,2,req,name=field10196" json:"field10196,omitempty"`
 	Field10197      *Enum10157                   `protobuf:"varint,59,opt,name=field10197,enum=benchmarks.google_message3.Enum10157" json:"field10197,omitempty"`
@@ -1263,10 +1417,18 @@
 func (*Message10155) ProtoMessage() {}
 
 func (x *Message10155) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10155) XXX_Methods() *protoiface.Methods {
+func (x *Message10155) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[17].Methods()
 }
 
@@ -1776,6 +1938,7 @@
 }
 
 type Message11866 struct {
+	state         protoimpl.MessageState
 	Field11868    *Message11014         `protobuf:"bytes,1,req,name=field11868" json:"field11868,omitempty"`
 	Field11869    *bool                 `protobuf:"varint,2,opt,name=field11869" json:"field11869,omitempty"`
 	Field11870    *float64              `protobuf:"fixed64,3,opt,name=field11870" json:"field11870,omitempty"`
@@ -1796,10 +1959,18 @@
 func (*Message11866) ProtoMessage() {}
 
 func (x *Message11866) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11866) XXX_Methods() *protoiface.Methods {
+func (x *Message11866) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[18].Methods()
 }
 
@@ -1844,6 +2015,7 @@
 }
 
 type Message10469 struct {
+	state         protoimpl.MessageState
 	Field10473    *string  `protobuf:"bytes,1,opt,name=field10473" json:"field10473,omitempty"`
 	Field10474    *float32 `protobuf:"fixed32,2,opt,name=field10474" json:"field10474,omitempty"`
 	Field10475    *int32   `protobuf:"varint,3,opt,name=field10475" json:"field10475,omitempty"`
@@ -1868,10 +2040,18 @@
 func (*Message10469) ProtoMessage() {}
 
 func (x *Message10469) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10469) XXX_Methods() *protoiface.Methods {
+func (x *Message10469) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[19].Methods()
 }
 
@@ -1944,6 +2124,7 @@
 }
 
 type Message10818 struct {
+	state         protoimpl.MessageState
 	Field10819    *Message10800 `protobuf:"bytes,1,opt,name=field10819" json:"field10819,omitempty"`
 	Field10820    *Message10801 `protobuf:"bytes,2,opt,name=field10820" json:"field10820,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1961,10 +2142,18 @@
 func (*Message10818) ProtoMessage() {}
 
 func (x *Message10818) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10818) XXX_Methods() *protoiface.Methods {
+func (x *Message10818) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[20].Methods()
 }
 
@@ -1988,6 +2177,7 @@
 }
 
 type Message10773 struct {
+	state         protoimpl.MessageState
 	Field10774    *bool                 `protobuf:"varint,9,opt,name=field10774" json:"field10774,omitempty"`
 	Field10775    *bool                 `protobuf:"varint,1,opt,name=field10775" json:"field10775,omitempty"`
 	Field10776    *bool                 `protobuf:"varint,23,opt,name=field10776" json:"field10776,omitempty"`
@@ -2026,10 +2216,18 @@
 func (*Message10773) ProtoMessage() {}
 
 func (x *Message10773) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10773) XXX_Methods() *protoiface.Methods {
+func (x *Message10773) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[21].Methods()
 }
 
@@ -2200,6 +2398,7 @@
 }
 
 type Message13145 struct {
+	state           protoimpl.MessageState
 	Field13155      *Enum13146 `protobuf:"varint,1,req,name=field13155,enum=benchmarks.google_message3.Enum13146" json:"field13155,omitempty"`
 	Field13156      *float32   `protobuf:"fixed32,2,opt,name=field13156" json:"field13156,omitempty"`
 	Field13157      *float32   `protobuf:"fixed32,3,opt,name=field13157" json:"field13157,omitempty"`
@@ -2219,10 +2418,18 @@
 func (*Message13145) ProtoMessage() {}
 
 func (x *Message13145) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13145) XXX_Methods() *protoiface.Methods {
+func (x *Message13145) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[22].Methods()
 }
 
@@ -2262,6 +2469,7 @@
 }
 
 type Message16686 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2277,10 +2485,18 @@
 func (*Message16686) ProtoMessage() {}
 
 func (x *Message16686) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message16686) XXX_Methods() *protoiface.Methods {
+func (x *Message16686) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[23].Methods()
 }
 
@@ -2290,6 +2506,7 @@
 }
 
 type Message12796 struct {
+	state         protoimpl.MessageState
 	Field12800    []uint64 `protobuf:"fixed64,1,rep,name=field12800" json:"field12800,omitempty"`
 	Field12801    *uint64  `protobuf:"varint,2,opt,name=field12801" json:"field12801,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2307,10 +2524,18 @@
 func (*Message12796) ProtoMessage() {}
 
 func (x *Message12796) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12796) XXX_Methods() *protoiface.Methods {
+func (x *Message12796) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[24].Methods()
 }
 
@@ -2334,6 +2559,7 @@
 }
 
 type Message6722 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2349,10 +2575,18 @@
 func (*Message6722) ProtoMessage() {}
 
 func (x *Message6722) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6722) XXX_Methods() *protoiface.Methods {
+func (x *Message6722) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[25].Methods()
 }
 
@@ -2362,6 +2596,7 @@
 }
 
 type Message6727 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2377,10 +2612,18 @@
 func (*Message6727) ProtoMessage() {}
 
 func (x *Message6727) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6727) XXX_Methods() *protoiface.Methods {
+func (x *Message6727) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[26].Methods()
 }
 
@@ -2390,6 +2633,7 @@
 }
 
 type Message6724 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2405,10 +2649,18 @@
 func (*Message6724) ProtoMessage() {}
 
 func (x *Message6724) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6724) XXX_Methods() *protoiface.Methods {
+func (x *Message6724) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[27].Methods()
 }
 
@@ -2418,6 +2670,7 @@
 }
 
 type Message6735 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2433,10 +2686,18 @@
 func (*Message6735) ProtoMessage() {}
 
 func (x *Message6735) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6735) XXX_Methods() *protoiface.Methods {
+func (x *Message6735) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[28].Methods()
 }
 
@@ -2446,6 +2707,7 @@
 }
 
 type Message8183 struct {
+	state         protoimpl.MessageState
 	Field8226     *string `protobuf:"bytes,1,opt,name=field8226" json:"field8226,omitempty"`
 	Field8227     *string `protobuf:"bytes,2,opt,name=field8227" json:"field8227,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2463,10 +2725,18 @@
 func (*Message8183) ProtoMessage() {}
 
 func (x *Message8183) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8183) XXX_Methods() *protoiface.Methods {
+func (x *Message8183) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[29].Methods()
 }
 
@@ -2490,6 +2760,7 @@
 }
 
 type Message8301 struct {
+	state           protoimpl.MessageState
 	Field8328       *string             `protobuf:"bytes,1,opt,name=field8328" json:"field8328,omitempty"`
 	Field8329       *Message7966        `protobuf:"bytes,2,opt,name=field8329" json:"field8329,omitempty"`
 	Field8330       *string             `protobuf:"bytes,3,opt,name=field8330" json:"field8330,omitempty"`
@@ -2517,10 +2788,18 @@
 func (*Message8301) ProtoMessage() {}
 
 func (x *Message8301) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8301) XXX_Methods() *protoiface.Methods {
+func (x *Message8301) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[30].Methods()
 }
 
@@ -2616,6 +2895,7 @@
 }
 
 type Message8456 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2631,10 +2911,18 @@
 func (*Message8456) ProtoMessage() {}
 
 func (x *Message8456) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8456) XXX_Methods() *protoiface.Methods {
+func (x *Message8456) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[31].Methods()
 }
 
@@ -2644,6 +2932,7 @@
 }
 
 type Message8302 struct {
+	state           protoimpl.MessageState
 	Field8339       *string               `protobuf:"bytes,1,opt,name=field8339" json:"field8339,omitempty"`
 	Field8340       *Message7966          `protobuf:"bytes,2,opt,name=field8340" json:"field8340,omitempty"`
 	Field8341       *string               `protobuf:"bytes,3,opt,name=field8341" json:"field8341,omitempty"`
@@ -2681,10 +2970,18 @@
 func (*Message8302) ProtoMessage() {}
 
 func (x *Message8302) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8302) XXX_Methods() *protoiface.Methods {
+func (x *Message8302) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[32].Methods()
 }
 
@@ -2850,6 +3147,7 @@
 }
 
 type Message8457 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2865,10 +3163,18 @@
 func (*Message8457) ProtoMessage() {}
 
 func (x *Message8457) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8457) XXX_Methods() *protoiface.Methods {
+func (x *Message8457) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[33].Methods()
 }
 
@@ -2878,6 +3184,7 @@
 }
 
 type Message8449 struct {
+	state         protoimpl.MessageState
 	Field8458     *string      `protobuf:"bytes,1,opt,name=field8458" json:"field8458,omitempty"`
 	Field8459     *bool        `protobuf:"varint,2,opt,name=field8459" json:"field8459,omitempty"`
 	Field8460     *Enum8450    `protobuf:"varint,3,opt,name=field8460,enum=benchmarks.google_message3.Enum8450" json:"field8460,omitempty"`
@@ -2900,10 +3207,18 @@
 func (*Message8449) ProtoMessage() {}
 
 func (x *Message8449) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8449) XXX_Methods() *protoiface.Methods {
+func (x *Message8449) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[34].Methods()
 }
 
@@ -2962,6 +3277,7 @@
 }
 
 type Message13358 struct {
+	state         protoimpl.MessageState
 	Field13359    *uint64             `protobuf:"fixed64,1,req,name=field13359" json:"field13359,omitempty"`
 	Field13360    *uint64             `protobuf:"fixed64,2,req,name=field13360" json:"field13360,omitempty"`
 	Field13361    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field13361" json:"field13361,omitempty"`
@@ -2980,10 +3296,18 @@
 func (*Message13358) ProtoMessage() {}
 
 func (x *Message13358) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13358) XXX_Methods() *protoiface.Methods {
+func (x *Message13358) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[35].Methods()
 }
 
@@ -3014,6 +3338,7 @@
 }
 
 type Message13912 struct {
+	state         protoimpl.MessageState
 	Field13913    *uint32             `protobuf:"fixed32,1,req,name=field13913" json:"field13913,omitempty"`
 	Field13914    *uint32             `protobuf:"fixed32,2,req,name=field13914" json:"field13914,omitempty"`
 	Field13915    *UnusedEmptyMessage `protobuf:"bytes,500,opt,name=field13915" json:"field13915,omitempty"`
@@ -3033,10 +3358,18 @@
 func (*Message13912) ProtoMessage() {}
 
 func (x *Message13912) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13912) XXX_Methods() *protoiface.Methods {
+func (x *Message13912) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[36].Methods()
 }
 
@@ -3074,6 +3407,7 @@
 }
 
 type Message24316 struct {
+	state         protoimpl.MessageState
 	Field24443    []string `protobuf:"bytes,1,rep,name=field24443" json:"field24443,omitempty"`
 	Field24444    []string `protobuf:"bytes,2,rep,name=field24444" json:"field24444,omitempty"`
 	Field24445    []string `protobuf:"bytes,3,rep,name=field24445" json:"field24445,omitempty"`
@@ -3092,10 +3426,18 @@
 func (*Message24316) ProtoMessage() {}
 
 func (x *Message24316) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24316) XXX_Methods() *protoiface.Methods {
+func (x *Message24316) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[37].Methods()
 }
 
@@ -3126,6 +3468,7 @@
 }
 
 type Message24312 struct {
+	state         protoimpl.MessageState
 	Field24421    *string  `protobuf:"bytes,1,opt,name=field24421" json:"field24421,omitempty"`
 	Field24422    *string  `protobuf:"bytes,2,opt,name=field24422" json:"field24422,omitempty"`
 	Field24423    []string `protobuf:"bytes,3,rep,name=field24423" json:"field24423,omitempty"`
@@ -3147,10 +3490,18 @@
 func (*Message24312) ProtoMessage() {}
 
 func (x *Message24312) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24312) XXX_Methods() *protoiface.Methods {
+func (x *Message24312) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[38].Methods()
 }
 
@@ -3202,6 +3553,7 @@
 }
 
 type Message24313 struct {
+	state         protoimpl.MessageState
 	Field24427    *string  `protobuf:"bytes,1,opt,name=field24427" json:"field24427,omitempty"`
 	Field24428    *string  `protobuf:"bytes,2,opt,name=field24428" json:"field24428,omitempty"`
 	Field24429    []string `protobuf:"bytes,3,rep,name=field24429" json:"field24429,omitempty"`
@@ -3227,10 +3579,18 @@
 func (*Message24313) ProtoMessage() {}
 
 func (x *Message24313) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24313) XXX_Methods() *protoiface.Methods {
+func (x *Message24313) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[39].Methods()
 }
 
@@ -3310,6 +3670,7 @@
 }
 
 type Message24315 struct {
+	state         protoimpl.MessageState
 	Field24440    *string  `protobuf:"bytes,1,req,name=field24440" json:"field24440,omitempty"`
 	Field24441    []string `protobuf:"bytes,2,rep,name=field24441" json:"field24441,omitempty"`
 	Field24442    []string `protobuf:"bytes,3,rep,name=field24442" json:"field24442,omitempty"`
@@ -3328,10 +3689,18 @@
 func (*Message24315) ProtoMessage() {}
 
 func (x *Message24315) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message24315) XXX_Methods() *protoiface.Methods {
+func (x *Message24315) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[40].Methods()
 }
 
@@ -3362,6 +3731,7 @@
 }
 
 type Message716 struct {
+	state         protoimpl.MessageState
 	Field872      *string     `protobuf:"bytes,1,req,name=field872" json:"field872,omitempty"`
 	Field873      *int32      `protobuf:"varint,2,req,name=field873" json:"field873,omitempty"`
 	Field874      *bool       `protobuf:"varint,3,opt,name=field874" json:"field874,omitempty"`
@@ -3381,10 +3751,18 @@
 func (*Message716) ProtoMessage() {}
 
 func (x *Message716) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message716) XXX_Methods() *protoiface.Methods {
+func (x *Message716) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[41].Methods()
 }
 
@@ -3422,6 +3800,7 @@
 }
 
 type Message718 struct {
+	state         protoimpl.MessageState
 	Field878      []string `protobuf:"bytes,1,rep,name=field878" json:"field878,omitempty"`
 	Field879      []string `protobuf:"bytes,2,rep,name=field879" json:"field879,omitempty"`
 	Field880      *string  `protobuf:"bytes,3,opt,name=field880" json:"field880,omitempty"`
@@ -3440,10 +3819,18 @@
 func (*Message718) ProtoMessage() {}
 
 func (x *Message718) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[42].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message718) XXX_Methods() *protoiface.Methods {
+func (x *Message718) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[42].Methods()
 }
 
@@ -3474,6 +3861,7 @@
 }
 
 type Message703 struct {
+	state         protoimpl.MessageState
 	Field795      *string  `protobuf:"bytes,1,req,name=field795" json:"field795,omitempty"`
 	Field796      []string `protobuf:"bytes,2,rep,name=field796" json:"field796,omitempty"`
 	Field797      []string `protobuf:"bytes,3,rep,name=field797" json:"field797,omitempty"`
@@ -3494,10 +3882,18 @@
 func (*Message703) ProtoMessage() {}
 
 func (x *Message703) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[43].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message703) XXX_Methods() *protoiface.Methods {
+func (x *Message703) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[43].Methods()
 }
 
@@ -3542,6 +3938,7 @@
 }
 
 type Message715 struct {
+	state         protoimpl.MessageState
 	Field859      *string       `protobuf:"bytes,1,req,name=field859" json:"field859,omitempty"`
 	Field860      *string       `protobuf:"bytes,7,opt,name=field860" json:"field860,omitempty"`
 	Field861      []*Message707 `protobuf:"bytes,2,rep,name=field861" json:"field861,omitempty"`
@@ -3570,10 +3967,18 @@
 func (*Message715) ProtoMessage() {}
 
 func (x *Message715) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[44].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message715) XXX_Methods() *protoiface.Methods {
+func (x *Message715) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[44].Methods()
 }
 
@@ -3674,6 +4079,7 @@
 }
 
 type Message700 struct {
+	state         protoimpl.MessageState
 	Field789      []string `protobuf:"bytes,1,rep,name=field789" json:"field789,omitempty"`
 	Field790      []string `protobuf:"bytes,2,rep,name=field790" json:"field790,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3691,10 +4097,18 @@
 func (*Message700) ProtoMessage() {}
 
 func (x *Message700) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[45].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[45]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message700) XXX_Methods() *protoiface.Methods {
+func (x *Message700) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[45].Methods()
 }
 
@@ -3718,6 +4132,7 @@
 }
 
 type Message699 struct {
+	state         protoimpl.MessageState
 	Field787      *string  `protobuf:"bytes,1,req,name=field787" json:"field787,omitempty"`
 	Field788      []string `protobuf:"bytes,2,rep,name=field788" json:"field788,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3735,10 +4150,18 @@
 func (*Message699) ProtoMessage() {}
 
 func (x *Message699) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[46].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[46]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message699) XXX_Methods() *protoiface.Methods {
+func (x *Message699) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[46].Methods()
 }
 
@@ -3762,6 +4185,7 @@
 }
 
 type Message698 struct {
+	state         protoimpl.MessageState
 	Field779      *string  `protobuf:"bytes,1,opt,name=field779" json:"field779,omitempty"`
 	Field780      *string  `protobuf:"bytes,2,opt,name=field780" json:"field780,omitempty"`
 	Field781      *string  `protobuf:"bytes,3,opt,name=field781" json:"field781,omitempty"`
@@ -3785,10 +4209,18 @@
 func (*Message698) ProtoMessage() {}
 
 func (x *Message698) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[47].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[47]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message698) XXX_Methods() *protoiface.Methods {
+func (x *Message698) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[47].Methods()
 }
 
@@ -3854,6 +4286,7 @@
 }
 
 type Message10155_Message10156 struct {
+	state         protoimpl.MessageState
 	Field10266    *Enum8862 `protobuf:"varint,51,opt,name=field10266,enum=benchmarks.google_message3.Enum8862" json:"field10266,omitempty"`
 	Field10267    *int32    `protobuf:"varint,52,opt,name=field10267" json:"field10267,omitempty"`
 	Field10268    *int32    `protobuf:"varint,53,opt,name=field10268" json:"field10268,omitempty"`
@@ -3873,10 +4306,18 @@
 func (*Message10155_Message10156) ProtoMessage() {}
 
 func (x *Message10155_Message10156) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[48].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[48]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10155_Message10156) XXX_Methods() *protoiface.Methods {
+func (x *Message10155_Message10156) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[48].Methods()
 }
 
@@ -4962,8 +5403,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24377); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4972,8 +5415,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24378); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4981,9 +5426,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24400); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4992,8 +5439,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24380); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5002,8 +5451,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message24381); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5011,9 +5462,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message719); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5021,11 +5474,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message728); i {
-			case 9:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 10:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 11:
+				return &v.unknownFields
+			case 12:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5033,9 +5488,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message704); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5043,11 +5500,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message697); i {
-			case 36:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 37:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 38:
+				return &v.unknownFields
+			case 39:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5056,10 +5515,12 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message0); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5067,9 +5528,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6578); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5077,9 +5540,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6024); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5087,9 +5552,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6052); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5097,9 +5564,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6054); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5107,11 +5576,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10573); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 4:
+				return &v.unknownFields
+			case 5:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5119,9 +5590,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10824); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5129,6 +5602,34 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10582); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10155); i {
+			case 0:
+				return &v.state
+			case 71:
+				return &v.sizeCache
+			case 72:
+				return &v.unknownFields
+			case 73:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11866); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -5137,33 +5638,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10155); i {
-			case 70:
-				return &v.sizeCache
-			case 71:
-				return &v.unknownFields
-			case 72:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11866); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10469); i {
-			case 9:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 10:
+				return &v.sizeCache
+			case 11:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5171,9 +5652,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10818); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5181,9 +5664,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10773); i {
-			case 23:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 24:
+				return &v.sizeCache
+			case 25:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5191,11 +5676,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13145); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 5:
+				return &v.unknownFields
+			case 6:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5204,8 +5691,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message16686); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5213,9 +5702,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12796); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5224,8 +5715,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6722); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5234,8 +5727,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6727); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5244,8 +5739,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6724); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5254,8 +5751,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6735); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5263,9 +5762,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8183); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5273,11 +5774,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8301); i {
-			case 11:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 12:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 13:
+				return &v.unknownFields
+			case 14:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5286,8 +5789,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8456); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5295,11 +5800,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8302); i {
-			case 21:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 22:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 23:
+				return &v.unknownFields
+			case 24:
 				return &v.extensionFields
 			default:
 				return nil
@@ -5308,8 +5815,10 @@
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8457); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5317,136 +5826,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8449); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13358); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message13912); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24316); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24312); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24313); i {
-			case 10:
-				return &v.sizeCache
-			case 11:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message24315); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message716); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message718); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message703); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message715); i {
-			case 13:
-				return &v.sizeCache
-			case 14:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message700); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message699); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message698); i {
+			case 0:
+				return &v.state
 			case 8:
 				return &v.sizeCache
 			case 9:
@@ -5455,8 +5836,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10155_Message10156); i {
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13358); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -5465,6 +5848,162 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message13912); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24316); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24312); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24313); i {
+			case 0:
+				return &v.state
+			case 11:
+				return &v.sizeCache
+			case 12:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message24315); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message716); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message718); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message703); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message715); i {
+			case 0:
+				return &v.state
+			case 14:
+				return &v.sizeCache
+			case 15:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message700); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message699); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message698); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_5_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10155_Message10156); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_6.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_6.pb.go
index 80fd184..3fd2b21 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_6.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_6.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message10576 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Message10576) ProtoMessage() {}
 
 func (x *Message10576) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10576) XXX_Methods() *protoiface.Methods {
+func (x *Message10576) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[0].Methods()
 }
 
@@ -46,6 +55,7 @@
 }
 
 type Message10154 struct {
+	state         protoimpl.MessageState
 	Field10192    []byte `protobuf:"bytes,1,opt,name=field10192" json:"field10192,omitempty"`
 	Field10193    *int32 `protobuf:"varint,2,opt,name=field10193" json:"field10193,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -63,10 +73,18 @@
 func (*Message10154) ProtoMessage() {}
 
 func (x *Message10154) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10154) XXX_Methods() *protoiface.Methods {
+func (x *Message10154) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[1].Methods()
 }
 
@@ -90,6 +108,7 @@
 }
 
 type Message8944 struct {
+	state         protoimpl.MessageState
 	Field9045     *string      `protobuf:"bytes,2,opt,name=field9045" json:"field9045,omitempty"`
 	Field9046     *string      `protobuf:"bytes,3,opt,name=field9046" json:"field9046,omitempty"`
 	Field9047     *string      `protobuf:"bytes,23,opt,name=field9047" json:"field9047,omitempty"`
@@ -167,10 +186,18 @@
 func (*Message8944) ProtoMessage() {}
 
 func (x *Message8944) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8944) XXX_Methods() *protoiface.Methods {
+func (x *Message8944) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[2].Methods()
 }
 
@@ -614,6 +641,7 @@
 }
 
 type Message9182 struct {
+	state           protoimpl.MessageState
 	Field9205       *string               `protobuf:"bytes,1,opt,name=field9205" json:"field9205,omitempty"`
 	Field9206       *string               `protobuf:"bytes,2,opt,name=field9206" json:"field9206,omitempty"`
 	Field9207       *float32              `protobuf:"fixed32,16,opt,name=field9207" json:"field9207,omitempty"`
@@ -656,10 +684,18 @@
 func (*Message9182) ProtoMessage() {}
 
 func (x *Message9182) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9182) XXX_Methods() *protoiface.Methods {
+func (x *Message9182) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[3].Methods()
 }
 
@@ -864,6 +900,7 @@
 }
 
 type Message9160 struct {
+	state         protoimpl.MessageState
 	Field9161     *int32 `protobuf:"varint,1,opt,name=field9161" json:"field9161,omitempty"`
 	Field9162     []byte `protobuf:"bytes,2,opt,name=field9162" json:"field9162,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -881,10 +918,18 @@
 func (*Message9160) ProtoMessage() {}
 
 func (x *Message9160) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9160) XXX_Methods() *protoiface.Methods {
+func (x *Message9160) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[4].Methods()
 }
 
@@ -908,6 +953,7 @@
 }
 
 type Message9242 struct {
+	state         protoimpl.MessageState
 	Field9327     []Enum9243 `protobuf:"varint,1,rep,name=field9327,enum=benchmarks.google_message3.Enum9243" json:"field9327,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -924,10 +970,18 @@
 func (*Message9242) ProtoMessage() {}
 
 func (x *Message9242) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9242) XXX_Methods() *protoiface.Methods {
+func (x *Message9242) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[5].Methods()
 }
 
@@ -944,6 +998,7 @@
 }
 
 type Message8890 struct {
+	state         protoimpl.MessageState
 	Field8916     []*Message8888 `protobuf:"bytes,1,rep,name=field8916" json:"field8916,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -960,10 +1015,18 @@
 func (*Message8890) ProtoMessage() {}
 
 func (x *Message8890) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8890) XXX_Methods() *protoiface.Methods {
+func (x *Message8890) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[6].Methods()
 }
 
@@ -980,6 +1043,7 @@
 }
 
 type Message9123 struct {
+	state         protoimpl.MessageState
 	Field9135     *float32 `protobuf:"fixed32,1,opt,name=field9135" json:"field9135,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -996,10 +1060,18 @@
 func (*Message9123) ProtoMessage() {}
 
 func (x *Message9123) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9123) XXX_Methods() *protoiface.Methods {
+func (x *Message9123) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[7].Methods()
 }
 
@@ -1016,6 +1088,7 @@
 }
 
 type Message9628 struct {
+	state         protoimpl.MessageState
 	Field9673     *Message9627 `protobuf:"bytes,1,opt,name=field9673" json:"field9673,omitempty"`
 	Field9674     *string      `protobuf:"bytes,2,opt,name=field9674" json:"field9674,omitempty"`
 	Field9675     []int32      `protobuf:"varint,3,rep,name=field9675" json:"field9675,omitempty"`
@@ -1035,10 +1108,18 @@
 func (*Message9628) ProtoMessage() {}
 
 func (x *Message9628) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9628) XXX_Methods() *protoiface.Methods {
+func (x *Message9628) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[8].Methods()
 }
 
@@ -1076,6 +1157,7 @@
 }
 
 type Message11014 struct {
+	state         protoimpl.MessageState
 	Field11780    *int32                `protobuf:"varint,40,opt,name=field11780" json:"field11780,omitempty"`
 	Field11781    *string               `protobuf:"bytes,46,opt,name=field11781" json:"field11781,omitempty"`
 	Field11782    *bool                 `protobuf:"varint,47,opt,name=field11782" json:"field11782,omitempty"`
@@ -1156,10 +1238,18 @@
 func (*Message11014) ProtoMessage() {}
 
 func (x *Message11014) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11014) XXX_Methods() *protoiface.Methods {
+func (x *Message11014) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[9].Methods()
 }
 
@@ -1624,6 +1714,7 @@
 }
 
 type Message10801 struct {
+	state         protoimpl.MessageState
 	Field10812    *Message10800   `protobuf:"bytes,1,opt,name=field10812" json:"field10812,omitempty"`
 	Field10813    []*Message10802 `protobuf:"bytes,2,rep,name=field10813" json:"field10813,omitempty"`
 	Field10814    *int32          `protobuf:"varint,3,opt,name=field10814" json:"field10814,omitempty"`
@@ -1642,10 +1733,18 @@
 func (*Message10801) ProtoMessage() {}
 
 func (x *Message10801) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10801) XXX_Methods() *protoiface.Methods {
+func (x *Message10801) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[10].Methods()
 }
 
@@ -1676,6 +1775,7 @@
 }
 
 type Message10749 struct {
+	state         protoimpl.MessageState
 	Field10754    []*Message10748 `protobuf:"bytes,1,rep,name=field10754" json:"field10754,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1692,10 +1792,18 @@
 func (*Message10749) ProtoMessage() {}
 
 func (x *Message10749) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10749) XXX_Methods() *protoiface.Methods {
+func (x *Message10749) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[11].Methods()
 }
 
@@ -1712,6 +1820,7 @@
 }
 
 type Message8298 struct {
+	state         protoimpl.MessageState
 	Field8321     *Message7966 `protobuf:"bytes,1,opt,name=field8321" json:"field8321,omitempty"`
 	Field8322     *int64       `protobuf:"varint,2,opt,name=field8322" json:"field8322,omitempty"`
 	Field8323     *string      `protobuf:"bytes,3,opt,name=field8323" json:"field8323,omitempty"`
@@ -1730,10 +1839,18 @@
 func (*Message8298) ProtoMessage() {}
 
 func (x *Message8298) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8298) XXX_Methods() *protoiface.Methods {
+func (x *Message8298) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[12].Methods()
 }
 
@@ -1764,6 +1881,7 @@
 }
 
 type Message8300 struct {
+	state         protoimpl.MessageState
 	Field8326     *string      `protobuf:"bytes,1,opt,name=field8326" json:"field8326,omitempty"`
 	Field8327     *Message7966 `protobuf:"bytes,2,opt,name=field8327" json:"field8327,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1781,10 +1899,18 @@
 func (*Message8300) ProtoMessage() {}
 
 func (x *Message8300) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8300) XXX_Methods() *protoiface.Methods {
+func (x *Message8300) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[13].Methods()
 }
 
@@ -1808,6 +1934,7 @@
 }
 
 type Message8291 struct {
+	state         protoimpl.MessageState
 	Field8306     *string   `protobuf:"bytes,1,opt,name=field8306" json:"field8306,omitempty"`
 	Field8307     *int32    `protobuf:"varint,2,opt,name=field8307" json:"field8307,omitempty"`
 	Field8308     *string   `protobuf:"bytes,3,opt,name=field8308" json:"field8308,omitempty"`
@@ -1828,10 +1955,18 @@
 func (*Message8291) ProtoMessage() {}
 
 func (x *Message8291) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8291) XXX_Methods() *protoiface.Methods {
+func (x *Message8291) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[14].Methods()
 }
 
@@ -1876,6 +2011,7 @@
 }
 
 type Message8296 struct {
+	state         protoimpl.MessageState
 	Field8311     *Message7966 `protobuf:"bytes,1,opt,name=field8311" json:"field8311,omitempty"`
 	Field8312     *string      `protobuf:"bytes,2,opt,name=field8312" json:"field8312,omitempty"`
 	Field8313     *Message7966 `protobuf:"bytes,3,opt,name=field8313" json:"field8313,omitempty"`
@@ -1897,10 +2033,18 @@
 func (*Message8296) ProtoMessage() {}
 
 func (x *Message8296) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8296) XXX_Methods() *protoiface.Methods {
+func (x *Message8296) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[15].Methods()
 }
 
@@ -1952,6 +2096,7 @@
 }
 
 type Message7965 struct {
+	state         protoimpl.MessageState
 	Field7967     *int32 `protobuf:"varint,1,opt,name=field7967" json:"field7967,omitempty"`
 	Field7968     *int32 `protobuf:"varint,2,opt,name=field7968" json:"field7968,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1969,10 +2114,18 @@
 func (*Message7965) ProtoMessage() {}
 
 func (x *Message7965) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7965) XXX_Methods() *protoiface.Methods {
+func (x *Message7965) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[16].Methods()
 }
 
@@ -1996,6 +2149,7 @@
 }
 
 type Message8290 struct {
+	state         protoimpl.MessageState
 	Field8304     *string `protobuf:"bytes,1,opt,name=field8304" json:"field8304,omitempty"`
 	Field8305     *string `protobuf:"bytes,2,opt,name=field8305" json:"field8305,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2013,10 +2167,18 @@
 func (*Message8290) ProtoMessage() {}
 
 func (x *Message8290) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8290) XXX_Methods() *protoiface.Methods {
+func (x *Message8290) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[17].Methods()
 }
 
@@ -2040,6 +2202,7 @@
 }
 
 type Message717 struct {
+	state         protoimpl.MessageState
 	Field876      []string `protobuf:"bytes,1,rep,name=field876" json:"field876,omitempty"`
 	Field877      *float64 `protobuf:"fixed64,2,opt,name=field877" json:"field877,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2057,10 +2220,18 @@
 func (*Message717) ProtoMessage() {}
 
 func (x *Message717) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message717) XXX_Methods() *protoiface.Methods {
+func (x *Message717) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[18].Methods()
 }
 
@@ -2084,6 +2255,7 @@
 }
 
 type Message713 struct {
+	state         protoimpl.MessageState
 	Field852      *Message708 `protobuf:"bytes,1,req,name=field852" json:"field852,omitempty"`
 	Field853      []string    `protobuf:"bytes,2,rep,name=field853" json:"field853,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2101,10 +2273,18 @@
 func (*Message713) ProtoMessage() {}
 
 func (x *Message713) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message713) XXX_Methods() *protoiface.Methods {
+func (x *Message713) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[19].Methods()
 }
 
@@ -2128,6 +2308,7 @@
 }
 
 type Message705 struct {
+	state         protoimpl.MessageState
 	Field807      *string  `protobuf:"bytes,1,req,name=field807" json:"field807,omitempty"`
 	Field808      *string  `protobuf:"bytes,2,opt,name=field808" json:"field808,omitempty"`
 	Field809      *string  `protobuf:"bytes,3,opt,name=field809" json:"field809,omitempty"`
@@ -2150,10 +2331,18 @@
 func (*Message705) ProtoMessage() {}
 
 func (x *Message705) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message705) XXX_Methods() *protoiface.Methods {
+func (x *Message705) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[20].Methods()
 }
 
@@ -2212,6 +2401,7 @@
 }
 
 type Message709 struct {
+	state         protoimpl.MessageState
 	Field829      []string `protobuf:"bytes,1,rep,name=field829" json:"field829,omitempty"`
 	Field830      []string `protobuf:"bytes,2,rep,name=field830" json:"field830,omitempty"`
 	Field831      []string `protobuf:"bytes,3,rep,name=field831" json:"field831,omitempty"`
@@ -2232,10 +2422,18 @@
 func (*Message709) ProtoMessage() {}
 
 func (x *Message709) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message709) XXX_Methods() *protoiface.Methods {
+func (x *Message709) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[21].Methods()
 }
 
@@ -2280,6 +2478,7 @@
 }
 
 type Message702 struct {
+	state         protoimpl.MessageState
 	Field793      *string `protobuf:"bytes,1,opt,name=field793" json:"field793,omitempty"`
 	Field794      *string `protobuf:"bytes,2,opt,name=field794" json:"field794,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2297,10 +2496,18 @@
 func (*Message702) ProtoMessage() {}
 
 func (x *Message702) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message702) XXX_Methods() *protoiface.Methods {
+func (x *Message702) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[22].Methods()
 }
 
@@ -2324,6 +2531,7 @@
 }
 
 type Message714 struct {
+	state         protoimpl.MessageState
 	Field854      *string `protobuf:"bytes,1,opt,name=field854" json:"field854,omitempty"`
 	Field855      *string `protobuf:"bytes,2,opt,name=field855" json:"field855,omitempty"`
 	Field856      *string `protobuf:"bytes,3,opt,name=field856" json:"field856,omitempty"`
@@ -2344,10 +2552,18 @@
 func (*Message714) ProtoMessage() {}
 
 func (x *Message714) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message714) XXX_Methods() *protoiface.Methods {
+func (x *Message714) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[23].Methods()
 }
 
@@ -2392,6 +2608,7 @@
 }
 
 type Message710 struct {
+	state         protoimpl.MessageState
 	Field834      []string `protobuf:"bytes,1,rep,name=field834" json:"field834,omitempty"`
 	Field835      *string  `protobuf:"bytes,2,opt,name=field835" json:"field835,omitempty"`
 	Field836      *string  `protobuf:"bytes,3,opt,name=field836" json:"field836,omitempty"`
@@ -2412,10 +2629,18 @@
 func (*Message710) ProtoMessage() {}
 
 func (x *Message710) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message710) XXX_Methods() *protoiface.Methods {
+func (x *Message710) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[24].Methods()
 }
 
@@ -2460,6 +2685,7 @@
 }
 
 type Message706 struct {
+	state         protoimpl.MessageState
 	Field814      []string `protobuf:"bytes,1,rep,name=field814" json:"field814,omitempty"`
 	Field815      *string  `protobuf:"bytes,2,opt,name=field815" json:"field815,omitempty"`
 	Field816      []string `protobuf:"bytes,3,rep,name=field816" json:"field816,omitempty"`
@@ -2479,10 +2705,18 @@
 func (*Message706) ProtoMessage() {}
 
 func (x *Message706) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message706) XXX_Methods() *protoiface.Methods {
+func (x *Message706) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[25].Methods()
 }
 
@@ -2520,6 +2754,7 @@
 }
 
 type Message707 struct {
+	state         protoimpl.MessageState
 	Field818      *string  `protobuf:"bytes,1,req,name=field818" json:"field818,omitempty"`
 	Field819      *string  `protobuf:"bytes,2,req,name=field819" json:"field819,omitempty"`
 	Field820      *string  `protobuf:"bytes,3,req,name=field820" json:"field820,omitempty"`
@@ -2540,10 +2775,18 @@
 func (*Message707) ProtoMessage() {}
 
 func (x *Message707) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message707) XXX_Methods() *protoiface.Methods {
+func (x *Message707) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[26].Methods()
 }
 
@@ -2588,6 +2831,7 @@
 }
 
 type Message711 struct {
+	state         protoimpl.MessageState
 	Field839      *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field839" json:"field839,omitempty"`
 	Field840      []string            `protobuf:"bytes,4,rep,name=field840" json:"field840,omitempty"`
 	Field841      []string            `protobuf:"bytes,2,rep,name=field841" json:"field841,omitempty"`
@@ -2607,10 +2851,18 @@
 func (*Message711) ProtoMessage() {}
 
 func (x *Message711) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message711) XXX_Methods() *protoiface.Methods {
+func (x *Message711) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[27].Methods()
 }
 
@@ -2648,6 +2900,7 @@
 }
 
 type Message712 struct {
+	state         protoimpl.MessageState
 	Field843      []string `protobuf:"bytes,1,rep,name=field843" json:"field843,omitempty"`
 	Field844      *string  `protobuf:"bytes,2,req,name=field844" json:"field844,omitempty"`
 	Field845      *string  `protobuf:"bytes,3,opt,name=field845" json:"field845,omitempty"`
@@ -2672,10 +2925,18 @@
 func (*Message712) ProtoMessage() {}
 
 func (x *Message712) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message712) XXX_Methods() *protoiface.Methods {
+func (x *Message712) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[28].Methods()
 }
 
@@ -2748,6 +3009,7 @@
 }
 
 type Message8939 struct {
+	state         protoimpl.MessageState
 	Field9010     *string                    `protobuf:"bytes,1,opt,name=field9010" json:"field9010,omitempty"`
 	Field9011     *string                    `protobuf:"bytes,2,opt,name=field9011" json:"field9011,omitempty"`
 	Field9012     *string                    `protobuf:"bytes,3,opt,name=field9012" json:"field9012,omitempty"`
@@ -2785,10 +3047,18 @@
 func (*Message8939) ProtoMessage() {}
 
 func (x *Message8939) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8939) XXX_Methods() *protoiface.Methods {
+func (x *Message8939) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[29].Methods()
 }
 
@@ -2952,6 +3222,7 @@
 }
 
 type Message9181 struct {
+	state         protoimpl.MessageState
 	Field9204     *string `protobuf:"bytes,1,opt,name=field9204" json:"field9204,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2968,10 +3239,18 @@
 func (*Message9181) ProtoMessage() {}
 
 func (x *Message9181) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9181) XXX_Methods() *protoiface.Methods {
+func (x *Message9181) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[30].Methods()
 }
 
@@ -2988,6 +3267,7 @@
 }
 
 type Message9164 struct {
+	state         protoimpl.MessageState
 	Field9168     *int32 `protobuf:"varint,1,opt,name=field9168" json:"field9168,omitempty"`
 	Field9169     *int32 `protobuf:"varint,2,opt,name=field9169" json:"field9169,omitempty"`
 	Field9170     *int32 `protobuf:"varint,3,opt,name=field9170" json:"field9170,omitempty"`
@@ -3006,10 +3286,18 @@
 func (*Message9164) ProtoMessage() {}
 
 func (x *Message9164) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9164) XXX_Methods() *protoiface.Methods {
+func (x *Message9164) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[31].Methods()
 }
 
@@ -3040,6 +3328,7 @@
 }
 
 type Message9165 struct {
+	state         protoimpl.MessageState
 	Field9171     *float32 `protobuf:"fixed32,1,opt,name=field9171" json:"field9171,omitempty"`
 	Field9172     *float32 `protobuf:"fixed32,2,opt,name=field9172" json:"field9172,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3057,10 +3346,18 @@
 func (*Message9165) ProtoMessage() {}
 
 func (x *Message9165) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9165) XXX_Methods() *protoiface.Methods {
+func (x *Message9165) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[32].Methods()
 }
 
@@ -3084,6 +3381,7 @@
 }
 
 type Message9166 struct {
+	state         protoimpl.MessageState
 	Field9173     *float32 `protobuf:"fixed32,1,opt,name=field9173" json:"field9173,omitempty"`
 	Field9174     *int32   `protobuf:"varint,2,opt,name=field9174" json:"field9174,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3101,10 +3399,18 @@
 func (*Message9166) ProtoMessage() {}
 
 func (x *Message9166) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9166) XXX_Methods() *protoiface.Methods {
+func (x *Message9166) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[33].Methods()
 }
 
@@ -3128,6 +3434,7 @@
 }
 
 type Message9151 struct {
+	state         protoimpl.MessageState
 	Field9152     *float64 `protobuf:"fixed64,1,opt,name=field9152" json:"field9152,omitempty"`
 	Field9153     *float64 `protobuf:"fixed64,2,opt,name=field9153" json:"field9153,omitempty"`
 	Field9154     *float32 `protobuf:"fixed32,3,opt,name=field9154" json:"field9154,omitempty"`
@@ -3151,10 +3458,18 @@
 func (*Message9151) ProtoMessage() {}
 
 func (x *Message9151) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9151) XXX_Methods() *protoiface.Methods {
+func (x *Message9151) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[34].Methods()
 }
 
@@ -3220,6 +3535,7 @@
 }
 
 type Message8888 struct {
+	state         protoimpl.MessageState
 	Field8908     *int32    `protobuf:"varint,1,opt,name=field8908" json:"field8908,omitempty"`
 	Field8909     *Enum8900 `protobuf:"varint,4,opt,name=field8909,enum=benchmarks.google_message3.Enum8900" json:"field8909,omitempty"`
 	Field8910     []int32   `protobuf:"varint,2,rep,packed,name=field8910" json:"field8910,omitempty"`
@@ -3239,10 +3555,18 @@
 func (*Message8888) ProtoMessage() {}
 
 func (x *Message8888) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8888) XXX_Methods() *protoiface.Methods {
+func (x *Message8888) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[35].Methods()
 }
 
@@ -3280,6 +3604,7 @@
 }
 
 type Message9627 struct {
+	state         protoimpl.MessageState
 	Field9668     *int32   `protobuf:"varint,1,req,name=field9668" json:"field9668,omitempty"`
 	Field9669     *int32   `protobuf:"varint,2,req,name=field9669" json:"field9669,omitempty"`
 	Field9670     *int32   `protobuf:"varint,3,req,name=field9670" json:"field9670,omitempty"`
@@ -3300,10 +3625,18 @@
 func (*Message9627) ProtoMessage() {}
 
 func (x *Message9627) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message9627) XXX_Methods() *protoiface.Methods {
+func (x *Message9627) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[36].Methods()
 }
 
@@ -3348,6 +3681,7 @@
 }
 
 type Message11020 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3363,10 +3697,18 @@
 func (*Message11020) ProtoMessage() {}
 
 func (x *Message11020) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11020) XXX_Methods() *protoiface.Methods {
+func (x *Message11020) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[37].Methods()
 }
 
@@ -3376,6 +3718,7 @@
 }
 
 type Message11013 struct {
+	state         protoimpl.MessageState
 	Field11757    []byte              `protobuf:"bytes,19,opt,name=field11757" json:"field11757,omitempty"`
 	Field11758    []byte              `protobuf:"bytes,1,opt,name=field11758" json:"field11758,omitempty"`
 	Field11759    []byte              `protobuf:"bytes,2,opt,name=field11759" json:"field11759,omitempty"`
@@ -3414,10 +3757,18 @@
 func (*Message11013) ProtoMessage() {}
 
 func (x *Message11013) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11013) XXX_Methods() *protoiface.Methods {
+func (x *Message11013) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[38].Methods()
 }
 
@@ -3588,6 +3939,7 @@
 }
 
 type Message8939_Message8940 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3603,10 +3955,18 @@
 func (*Message8939_Message8940) ProtoMessage() {}
 
 func (x *Message8939_Message8940) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8939_Message8940) XXX_Methods() *protoiface.Methods {
+func (x *Message8939_Message8940) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[39].Methods()
 }
 
@@ -3616,6 +3976,7 @@
 }
 
 type Message8939_Message8941 struct {
+	state         protoimpl.MessageState
 	Field9033     *string `protobuf:"bytes,32,opt,name=field9033" json:"field9033,omitempty"`
 	Field9034     *string `protobuf:"bytes,33,opt,name=field9034" json:"field9034,omitempty"`
 	Field9035     *string `protobuf:"bytes,34,opt,name=field9035" json:"field9035,omitempty"`
@@ -3637,10 +3998,18 @@
 func (*Message8939_Message8941) ProtoMessage() {}
 
 func (x *Message8939_Message8941) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8939_Message8941) XXX_Methods() *protoiface.Methods {
+func (x *Message8939_Message8941) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[40].Methods()
 }
 
@@ -3692,6 +4061,7 @@
 }
 
 type Message8939_Message8943 struct {
+	state         protoimpl.MessageState
 	Field9039     *string `protobuf:"bytes,1,opt,name=field9039" json:"field9039,omitempty"`
 	Field9040     *string `protobuf:"bytes,2,opt,name=field9040" json:"field9040,omitempty"`
 	Field9041     *string `protobuf:"bytes,3,opt,name=field9041" json:"field9041,omitempty"`
@@ -3713,10 +4083,18 @@
 func (*Message8939_Message8943) ProtoMessage() {}
 
 func (x *Message8939_Message8943) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8939_Message8943) XXX_Methods() *protoiface.Methods {
+func (x *Message8939_Message8943) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[41].Methods()
 }
 
@@ -4711,8 +5089,10 @@
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10576); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4720,9 +5100,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10154); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4730,9 +5112,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8944); i {
-			case 62:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 63:
+				return &v.sizeCache
+			case 64:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4740,11 +5124,13 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9182); i {
-			case 26:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 27:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 28:
+				return &v.unknownFields
+			case 29:
 				return &v.extensionFields
 			default:
 				return nil
@@ -4752,9 +5138,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9160); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4762,9 +5150,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9242); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4772,9 +5162,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8890); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4782,9 +5174,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9123); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4792,9 +5186,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message9628); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4802,9 +5198,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11014); i {
-			case 65:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 66:
+				return &v.sizeCache
+			case 67:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4812,9 +5210,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10801); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4822,9 +5222,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10749); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4832,9 +5234,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8298); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4842,9 +5246,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8300); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4852,9 +5258,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8291); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4862,9 +5270,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8296); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4872,9 +5282,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7965); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4882,9 +5294,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8290); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4892,9 +5306,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message717); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4902,9 +5318,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message713); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4912,9 +5330,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message705); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4922,9 +5342,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message709); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4932,9 +5354,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message702); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4942,9 +5366,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message714); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4952,9 +5378,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message710); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4962,9 +5390,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message706); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4972,9 +5402,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message707); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -4982,96 +5414,8 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message711); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message712); i {
-			case 9:
-				return &v.sizeCache
-			case 10:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8939); i {
-			case 22:
-				return &v.sizeCache
-			case 23:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9181); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9164); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9165); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9166); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9151); i {
-			case 8:
-				return &v.sizeCache
-			case 9:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8888); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message9627); i {
+			case 0:
+				return &v.state
 			case 5:
 				return &v.sizeCache
 			case 6:
@@ -5080,18 +5424,22 @@
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11020); i {
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message712); i {
 			case 0:
+				return &v.state
+			case 10:
 				return &v.sizeCache
-			case 1:
+			case 11:
 				return &v.unknownFields
 			default:
 				return nil
 			}
 		}
-		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11013); i {
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8939); i {
+			case 0:
+				return &v.state
 			case 23:
 				return &v.sizeCache
 			case 24:
@@ -5100,11 +5448,121 @@
 				return nil
 			}
 		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9181); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9164); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9165); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9166); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9151); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8888); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message9627); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11020); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11013); i {
+			case 0:
+				return &v.state
+			case 24:
+				return &v.sizeCache
+			case 25:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8939_Message8940); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5112,9 +5570,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8939_Message8941); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5122,9 +5582,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_6_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8939_Message8943); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_7.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_7.pb.go
index 6b9263e..134ac4e 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_7.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_7.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message11018 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*Message11018) ProtoMessage() {}
 
 func (x *Message11018) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11018) XXX_Methods() *protoiface.Methods {
+func (x *Message11018) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[0].Methods()
 }
 
@@ -46,6 +55,7 @@
 }
 
 type Message10800 struct {
+	state         protoimpl.MessageState
 	Field10808    *string  `protobuf:"bytes,1,opt,name=field10808" json:"field10808,omitempty"`
 	Field10809    *int64   `protobuf:"varint,2,opt,name=field10809" json:"field10809,omitempty"`
 	Field10810    *bool    `protobuf:"varint,3,opt,name=field10810" json:"field10810,omitempty"`
@@ -65,10 +75,18 @@
 func (*Message10800) ProtoMessage() {}
 
 func (x *Message10800) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10800) XXX_Methods() *protoiface.Methods {
+func (x *Message10800) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[1].Methods()
 }
 
@@ -106,6 +124,7 @@
 }
 
 type Message10802 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -121,10 +140,18 @@
 func (*Message10802) ProtoMessage() {}
 
 func (x *Message10802) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10802) XXX_Methods() *protoiface.Methods {
+func (x *Message10802) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[2].Methods()
 }
 
@@ -134,6 +161,7 @@
 }
 
 type Message10748 struct {
+	state         protoimpl.MessageState
 	Field10750    *string `protobuf:"bytes,1,opt,name=field10750" json:"field10750,omitempty"`
 	Field10751    *int32  `protobuf:"varint,2,opt,name=field10751" json:"field10751,omitempty"`
 	Field10752    *int32  `protobuf:"varint,3,opt,name=field10752" json:"field10752,omitempty"`
@@ -153,10 +181,18 @@
 func (*Message10748) ProtoMessage() {}
 
 func (x *Message10748) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10748) XXX_Methods() *protoiface.Methods {
+func (x *Message10748) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[3].Methods()
 }
 
@@ -194,6 +230,7 @@
 }
 
 type Message7966 struct {
+	state         protoimpl.MessageState
 	Field7969     *string `protobuf:"bytes,1,opt,name=field7969" json:"field7969,omitempty"`
 	Field7970     *bool   `protobuf:"varint,2,opt,name=field7970" json:"field7970,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -211,10 +248,18 @@
 func (*Message7966) ProtoMessage() {}
 
 func (x *Message7966) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7966) XXX_Methods() *protoiface.Methods {
+func (x *Message7966) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[4].Methods()
 }
 
@@ -238,6 +283,7 @@
 }
 
 type Message708 struct {
+	state         protoimpl.MessageState
 	Field823      *Message741 `protobuf:"bytes,1,opt,name=field823" json:"field823,omitempty"`
 	Field824      []string    `protobuf:"bytes,6,rep,name=field824" json:"field824,omitempty"`
 	Field825      *string     `protobuf:"bytes,2,opt,name=field825" json:"field825,omitempty"`
@@ -259,10 +305,18 @@
 func (*Message708) ProtoMessage() {}
 
 func (x *Message708) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message708) XXX_Methods() *protoiface.Methods {
+func (x *Message708) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[5].Methods()
 }
 
@@ -314,6 +368,7 @@
 }
 
 type Message8942 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -329,10 +384,18 @@
 func (*Message8942) ProtoMessage() {}
 
 func (x *Message8942) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8942) XXX_Methods() *protoiface.Methods {
+func (x *Message8942) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[6].Methods()
 }
 
@@ -342,6 +405,7 @@
 }
 
 type Message11011 struct {
+	state         protoimpl.MessageState
 	Field11752    []byte `protobuf:"bytes,1,req,name=field11752" json:"field11752,omitempty"`
 	Field11753    []byte `protobuf:"bytes,2,req,name=field11753" json:"field11753,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -359,10 +423,18 @@
 func (*Message11011) ProtoMessage() {}
 
 func (x *Message11011) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11011) XXX_Methods() *protoiface.Methods {
+func (x *Message11011) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[7].Methods()
 }
 
@@ -386,6 +458,7 @@
 }
 
 type UnusedEmptyMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -401,10 +474,18 @@
 func (*UnusedEmptyMessage) ProtoMessage() {}
 
 func (x *UnusedEmptyMessage) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UnusedEmptyMessage) XXX_Methods() *protoiface.Methods {
+func (x *UnusedEmptyMessage) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[8].Methods()
 }
 
@@ -414,6 +495,7 @@
 }
 
 type Message741 struct {
+	state         protoimpl.MessageState
 	Field936      []string `protobuf:"bytes,1,rep,name=field936" json:"field936,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -430,10 +512,18 @@
 func (*Message741) ProtoMessage() {}
 
 func (x *Message741) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message741) XXX_Methods() *protoiface.Methods {
+func (x *Message741) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[9].Methods()
 }
 
@@ -559,8 +649,10 @@
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11018); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -568,9 +660,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10800); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -579,8 +673,10 @@
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10802); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -588,9 +684,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10748); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -598,9 +696,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7966); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -608,9 +708,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message708); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -619,8 +721,10 @@
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8942); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -628,9 +732,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11011); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -639,8 +745,10 @@
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UnusedEmptyMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -648,9 +756,11 @@
 		}
 		file_datasets_google_message3_benchmark_message3_7_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message741); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4.pb.go b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4.pb.go
index 9994dbd..ba428a8 100644
--- a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4.pb.go
@@ -18,6 +18,7 @@
 )
 
 type GoogleMessage4 struct {
+	state         protoimpl.MessageState
 	Field37503    *int32              `protobuf:"varint,1,opt,name=field37503" json:"field37503,omitempty"`
 	Field37504    *UnusedEmptyMessage `protobuf:"bytes,2,opt,name=field37504" json:"field37504,omitempty"`
 	Field37505    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field37505" json:"field37505,omitempty"`
@@ -49,10 +50,18 @@
 func (*GoogleMessage4) ProtoMessage() {}
 
 func (x *GoogleMessage4) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GoogleMessage4) XXX_Methods() *protoiface.Methods {
+func (x *GoogleMessage4) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[0].Methods()
 }
 
@@ -174,6 +183,7 @@
 }
 
 type Message37489 struct {
+	state         protoimpl.MessageState
 	Field37534    *Message2517  `protobuf:"bytes,3,opt,name=field37534" json:"field37534,omitempty"`
 	Field37535    *Message7330  `protobuf:"bytes,4,opt,name=field37535" json:"field37535,omitempty"`
 	Field37536    *Message8815  `protobuf:"bytes,6,opt,name=field37536" json:"field37536,omitempty"`
@@ -210,10 +220,18 @@
 func (*Message37489) ProtoMessage() {}
 
 func (x *Message37489) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37489) XXX_Methods() *protoiface.Methods {
+func (x *Message37489) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[1].Methods()
 }
 
@@ -370,6 +388,7 @@
 }
 
 type Message7319 struct {
+	state         protoimpl.MessageState
 	Field7321     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field7321" json:"field7321,omitempty"`
 	Field7322     *UnusedEmptyMessage `protobuf:"bytes,7,opt,name=field7322" json:"field7322,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -387,10 +406,18 @@
 func (*Message7319) ProtoMessage() {}
 
 func (x *Message7319) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7319) XXX_Methods() *protoiface.Methods {
+func (x *Message7319) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[2].Methods()
 }
 
@@ -414,6 +441,7 @@
 }
 
 type Message12717 struct {
+	state         protoimpl.MessageState
 	Field12719    *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field12719" json:"field12719,omitempty"`
 	Field12720    *string             `protobuf:"bytes,2,opt,name=field12720" json:"field12720,omitempty"`
 	Field12721    *uint32             `protobuf:"varint,3,opt,name=field12721" json:"field12721,omitempty"`
@@ -438,10 +466,18 @@
 func (*Message12717) ProtoMessage() {}
 
 func (x *Message12717) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12717) XXX_Methods() *protoiface.Methods {
+func (x *Message12717) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[3].Methods()
 }
 
@@ -514,6 +550,7 @@
 }
 
 type Message37331 struct {
+	state         protoimpl.MessageState
 	Field37367    *UnusedEmptyMessage `protobuf:"bytes,4,opt,name=field37367" json:"field37367,omitempty"`
 	Field37368    *Message37326       `protobuf:"bytes,1,req,name=field37368" json:"field37368,omitempty"`
 	Field37369    *int64              `protobuf:"varint,2,req,name=field37369" json:"field37369,omitempty"`
@@ -533,10 +570,18 @@
 func (*Message37331) ProtoMessage() {}
 
 func (x *Message37331) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37331) XXX_Methods() *protoiface.Methods {
+func (x *Message37331) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[4].Methods()
 }
 
@@ -574,6 +619,7 @@
 }
 
 type Message8815 struct {
+	state         protoimpl.MessageState
 	Field8819     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field8819" json:"field8819,omitempty"`
 	Field8820     []*Message8768      `protobuf:"bytes,2,rep,name=field8820" json:"field8820,omitempty"`
 	Field8821     *bool               `protobuf:"varint,3,opt,name=field8821" json:"field8821,omitempty"`
@@ -592,10 +638,18 @@
 func (*Message8815) ProtoMessage() {}
 
 func (x *Message8815) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8815) XXX_Methods() *protoiface.Methods {
+func (x *Message8815) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[5].Methods()
 }
 
@@ -626,6 +680,7 @@
 }
 
 type Message7330 struct {
+	state         protoimpl.MessageState
 	Field7332     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field7332" json:"field7332,omitempty"`
 	Field7333     *Message3069        `protobuf:"bytes,2,opt,name=field7333" json:"field7333,omitempty"`
 	Field7334     *Message7320        `protobuf:"bytes,3,opt,name=field7334" json:"field7334,omitempty"`
@@ -647,10 +702,18 @@
 func (*Message7330) ProtoMessage() {}
 
 func (x *Message7330) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7330) XXX_Methods() *protoiface.Methods {
+func (x *Message7330) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[6].Methods()
 }
 
@@ -702,6 +765,7 @@
 }
 
 type Message12960 struct {
+	state         protoimpl.MessageState
 	Field12962    *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field12962" json:"field12962,omitempty"`
 	Field12963    *Message12948       `protobuf:"bytes,2,opt,name=field12963" json:"field12963,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -719,10 +783,18 @@
 func (*Message12960) ProtoMessage() {}
 
 func (x *Message12960) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12960) XXX_Methods() *protoiface.Methods {
+func (x *Message12960) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[7].Methods()
 }
 
@@ -746,6 +818,7 @@
 }
 
 type Message176 struct {
+	state         protoimpl.MessageState
 	Field408      *string                  `protobuf:"bytes,1,req,name=field408" json:"field408,omitempty"`
 	Field409      *int32                   `protobuf:"varint,4,opt,name=field409" json:"field409,omitempty"`
 	Field410      *string                  `protobuf:"bytes,50,opt,name=field410" json:"field410,omitempty"`
@@ -820,10 +893,18 @@
 func (*Message176) ProtoMessage() {}
 
 func (x *Message176) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message176) XXX_Methods() *protoiface.Methods {
+func (x *Message176) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[8].Methods()
 }
 
@@ -1246,6 +1327,7 @@
 }
 
 type Message8817 struct {
+	state         protoimpl.MessageState
 	Field8825     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field8825" json:"field8825,omitempty"`
 	Field8826     []*Message8768      `protobuf:"bytes,2,rep,name=field8826" json:"field8826,omitempty"`
 	Field8827     *string             `protobuf:"bytes,3,opt,name=field8827" json:"field8827,omitempty"`
@@ -1264,10 +1346,18 @@
 func (*Message8817) ProtoMessage() {}
 
 func (x *Message8817) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8817) XXX_Methods() *protoiface.Methods {
+func (x *Message8817) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[9].Methods()
 }
 
@@ -1298,6 +1388,7 @@
 }
 
 type Message8835 struct {
+	state         protoimpl.MessageState
 	Field8837     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field8837" json:"field8837,omitempty"`
 	Field8838     []string            `protobuf:"bytes,2,rep,name=field8838" json:"field8838,omitempty"`
 	Field8839     *UnusedEnum         `protobuf:"varint,3,opt,name=field8839,enum=benchmarks.google_message4.UnusedEnum" json:"field8839,omitempty"`
@@ -1316,10 +1407,18 @@
 func (*Message8835) ProtoMessage() {}
 
 func (x *Message8835) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8835) XXX_Methods() *protoiface.Methods {
+func (x *Message8835) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[10].Methods()
 }
 
@@ -1350,6 +1449,7 @@
 }
 
 type Message37333 struct {
+	state         protoimpl.MessageState
 	Field37372    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field37372" json:"field37372,omitempty"`
 	Field37373    *Message37326       `protobuf:"bytes,1,req,name=field37373" json:"field37373,omitempty"`
 	Field37374    *uint64             `protobuf:"varint,2,opt,name=field37374" json:"field37374,omitempty"`
@@ -1368,10 +1468,18 @@
 func (*Message37333) ProtoMessage() {}
 
 func (x *Message37333) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37333) XXX_Methods() *protoiface.Methods {
+func (x *Message37333) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[11].Methods()
 }
 
@@ -1402,6 +1510,7 @@
 }
 
 type Message13000 struct {
+	state         protoimpl.MessageState
 	Field13015    *int64          `protobuf:"varint,1,opt,name=field13015" json:"field13015,omitempty"`
 	Field13016    []*Message12979 `protobuf:"bytes,2,rep,name=field13016" json:"field13016,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1419,10 +1528,18 @@
 func (*Message13000) ProtoMessage() {}
 
 func (x *Message13000) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13000) XXX_Methods() *protoiface.Methods {
+func (x *Message13000) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[12].Methods()
 }
 
@@ -1446,6 +1563,7 @@
 }
 
 type Message37335 struct {
+	state         protoimpl.MessageState
 	Field37376    *UnusedEmptyMessage `protobuf:"bytes,4,opt,name=field37376" json:"field37376,omitempty"`
 	Field37377    *Message37326       `protobuf:"bytes,1,req,name=field37377" json:"field37377,omitempty"`
 	Field37378    *Message37173       `protobuf:"bytes,2,req,name=field37378" json:"field37378,omitempty"`
@@ -1465,10 +1583,18 @@
 func (*Message37335) ProtoMessage() {}
 
 func (x *Message37335) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37335) XXX_Methods() *protoiface.Methods {
+func (x *Message37335) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[13].Methods()
 }
 
@@ -1506,6 +1632,7 @@
 }
 
 type Message8848 struct {
+	state         protoimpl.MessageState
 	Field8850     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field8850" json:"field8850,omitempty"`
 	Field8851     *string             `protobuf:"bytes,2,opt,name=field8851" json:"field8851,omitempty"`
 	Field8852     []byte              `protobuf:"bytes,3,opt,name=field8852" json:"field8852,omitempty"`
@@ -1524,10 +1651,18 @@
 func (*Message8848) ProtoMessage() {}
 
 func (x *Message8848) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8848) XXX_Methods() *protoiface.Methods {
+func (x *Message8848) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[14].Methods()
 }
 
@@ -1558,6 +1693,7 @@
 }
 
 type Message13035 struct {
+	state         protoimpl.MessageState
 	Field13058    *int64  `protobuf:"varint,1,opt,name=field13058" json:"field13058,omitempty"`
 	Field13059    []int64 `protobuf:"varint,2,rep,name=field13059" json:"field13059,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1575,10 +1711,18 @@
 func (*Message13035) ProtoMessage() {}
 
 func (x *Message13035) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message13035) XXX_Methods() *protoiface.Methods {
+func (x *Message13035) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[15].Methods()
 }
 
@@ -1602,6 +1746,7 @@
 }
 
 type Message8856 struct {
+	state         protoimpl.MessageState
 	Field8858     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field8858" json:"field8858,omitempty"`
 	Field8859     *string             `protobuf:"bytes,2,opt,name=field8859" json:"field8859,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1619,10 +1764,18 @@
 func (*Message8856) ProtoMessage() {}
 
 func (x *Message8856) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8856) XXX_Methods() *protoiface.Methods {
+func (x *Message8856) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[16].Methods()
 }
 
@@ -1646,6 +1799,7 @@
 }
 
 type Message12908 struct {
+	state         protoimpl.MessageState
 	Field12912    *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field12912" json:"field12912,omitempty"`
 	Field12913    *string             `protobuf:"bytes,2,opt,name=field12913" json:"field12913,omitempty"`
 	Field12914    *Message12799       `protobuf:"bytes,3,opt,name=field12914" json:"field12914,omitempty"`
@@ -1667,10 +1821,18 @@
 func (*Message12908) ProtoMessage() {}
 
 func (x *Message12908) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12908) XXX_Methods() *protoiface.Methods {
+func (x *Message12908) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[17].Methods()
 }
 
@@ -1722,6 +1884,7 @@
 }
 
 type Message12910 struct {
+	state         protoimpl.MessageState
 	Field12920    *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field12920" json:"field12920,omitempty"`
 	Field12921    *Message12818       `protobuf:"bytes,2,opt,name=field12921" json:"field12921,omitempty"`
 	Field12922    []*Message12903     `protobuf:"bytes,3,rep,name=field12922" json:"field12922,omitempty"`
@@ -1740,10 +1903,18 @@
 func (*Message12910) ProtoMessage() {}
 
 func (x *Message12910) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12910) XXX_Methods() *protoiface.Methods {
+func (x *Message12910) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[18].Methods()
 }
 
@@ -1774,6 +1945,7 @@
 }
 
 type Message37327 struct {
+	state         protoimpl.MessageState
 	Field37347    *UnusedEmptyMessage `protobuf:"bytes,11,opt,name=field37347" json:"field37347,omitempty"`
 	Field37348    *Message37326       `protobuf:"bytes,1,req,name=field37348" json:"field37348,omitempty"`
 	Field37349    *bool               `protobuf:"varint,2,opt,name=field37349" json:"field37349,omitempty"`
@@ -1800,10 +1972,18 @@
 func (*Message37327) ProtoMessage() {}
 
 func (x *Message37327) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37327) XXX_Methods() *protoiface.Methods {
+func (x *Message37327) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[19].Methods()
 }
 
@@ -1890,6 +2070,7 @@
 }
 
 type Message37329 struct {
+	state         protoimpl.MessageState
 	Field37359    *UnusedEmptyMessage `protobuf:"bytes,6,opt,name=field37359" json:"field37359,omitempty"`
 	Field37360    *Message37326       `protobuf:"bytes,1,req,name=field37360" json:"field37360,omitempty"`
 	Field37361    *int64              `protobuf:"varint,2,req,name=field37361" json:"field37361,omitempty"`
@@ -1910,10 +2091,18 @@
 func (*Message37329) ProtoMessage() {}
 
 func (x *Message37329) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37329) XXX_Methods() *protoiface.Methods {
+func (x *Message37329) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[20].Methods()
 }
 
@@ -1958,6 +2147,7 @@
 }
 
 type Message2517 struct {
+	state         protoimpl.MessageState
 	Field2519     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field2519" json:"field2519,omitempty"`
 	Field2520     *Message2356        `protobuf:"bytes,2,opt,name=field2520" json:"field2520,omitempty"`
 	Field2521     *Message0           `protobuf:"bytes,3,opt,name=field2521" json:"field2521,omitempty"`
@@ -1978,10 +2168,18 @@
 func (*Message2517) ProtoMessage() {}
 
 func (x *Message2517) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2517) XXX_Methods() *protoiface.Methods {
+func (x *Message2517) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[21].Methods()
 }
 
@@ -2026,6 +2224,7 @@
 }
 
 type Message12748 struct {
+	state         protoimpl.MessageState
 	Field12754    *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field12754" json:"field12754,omitempty"`
 	Field12755    *string             `protobuf:"bytes,2,opt,name=field12755" json:"field12755,omitempty"`
 	Field12756    *string             `protobuf:"bytes,3,opt,name=field12756" json:"field12756,omitempty"`
@@ -2045,10 +2244,18 @@
 func (*Message12748) ProtoMessage() {}
 
 func (x *Message12748) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12748) XXX_Methods() *protoiface.Methods {
+func (x *Message12748) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[22].Methods()
 }
 
@@ -2086,6 +2293,7 @@
 }
 
 type Message12687 struct {
+	state         protoimpl.MessageState
 	Field12701    []*Message12686 `protobuf:"bytes,1,rep,name=field12701" json:"field12701,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2102,10 +2310,18 @@
 func (*Message12687) ProtoMessage() {}
 
 func (x *Message12687) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12687) XXX_Methods() *protoiface.Methods {
+func (x *Message12687) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[23].Methods()
 }
 
@@ -2122,6 +2338,7 @@
 }
 
 type Message11948 struct {
+	state         protoimpl.MessageState
 	Field11954    *string         `protobuf:"bytes,1,opt,name=field11954" json:"field11954,omitempty"`
 	Field11955    []*Message11949 `protobuf:"bytes,2,rep,name=field11955" json:"field11955,omitempty"`
 	Field11956    *bool           `protobuf:"varint,3,opt,name=field11956" json:"field11956,omitempty"`
@@ -2140,10 +2357,18 @@
 func (*Message11948) ProtoMessage() {}
 
 func (x *Message11948) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11948) XXX_Methods() *protoiface.Methods {
+func (x *Message11948) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[24].Methods()
 }
 
@@ -2174,6 +2399,7 @@
 }
 
 type Message11976 struct {
+	state         protoimpl.MessageState
 	Field12002    []*Message11975 `protobuf:"bytes,1,rep,name=field12002" json:"field12002,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2190,10 +2416,18 @@
 func (*Message11976) ProtoMessage() {}
 
 func (x *Message11976) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11976) XXX_Methods() *protoiface.Methods {
+func (x *Message11976) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[25].Methods()
 }
 
@@ -2210,6 +2444,7 @@
 }
 
 type Message7320 struct {
+	state         protoimpl.MessageState
 	Field7323     *UnusedEmptyMessage `protobuf:"bytes,1,opt,name=field7323" json:"field7323,omitempty"`
 	Field7324     *Message7287        `protobuf:"bytes,8,opt,name=field7324" json:"field7324,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2227,10 +2462,18 @@
 func (*Message7320) ProtoMessage() {}
 
 func (x *Message7320) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7320) XXX_Methods() *protoiface.Methods {
+func (x *Message7320) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[26].Methods()
 }
 
@@ -2254,6 +2497,7 @@
 }
 
 type Message3069 struct {
+	state           protoimpl.MessageState
 	Field3374       *Message3061               `protobuf:"bytes,1,opt,name=field3374" json:"field3374,omitempty"`
 	Field3375       []byte                     `protobuf:"bytes,2,opt,name=field3375" json:"field3375,omitempty"`
 	Message3070     []*Message3069_Message3070 `protobuf:"group,3,rep,name=Message3070,json=message3070" json:"message3070,omitempty"`
@@ -2273,10 +2517,18 @@
 func (*Message3069) ProtoMessage() {}
 
 func (x *Message3069) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3069) XXX_Methods() *protoiface.Methods {
+func (x *Message3069) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[27].Methods()
 }
 
@@ -2316,6 +2568,7 @@
 }
 
 type Message12948 struct {
+	state         protoimpl.MessageState
 	Field12958    []*Message12949 `protobuf:"bytes,1,rep,name=field12958" json:"field12958,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2332,10 +2585,18 @@
 func (*Message12948) ProtoMessage() {}
 
 func (x *Message12948) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12948) XXX_Methods() *protoiface.Methods {
+func (x *Message12948) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[28].Methods()
 }
 
@@ -2352,6 +2613,7 @@
 }
 
 type Message8768 struct {
+	state         protoimpl.MessageState
 	Field8782     *string             `protobuf:"bytes,1,opt,name=field8782" json:"field8782,omitempty"`
 	Field8783     *Message8572        `protobuf:"bytes,2,opt,name=field8783" json:"field8783,omitempty"`
 	Field8784     *bool               `protobuf:"varint,3,opt,name=field8784" json:"field8784,omitempty"`
@@ -2374,10 +2636,18 @@
 func (*Message8768) ProtoMessage() {}
 
 func (x *Message8768) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8768) XXX_Methods() *protoiface.Methods {
+func (x *Message8768) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[29].Methods()
 }
 
@@ -2436,6 +2706,7 @@
 }
 
 type Message12979 struct {
+	state         protoimpl.MessageState
 	Field12981    []byte              `protobuf:"bytes,1,req,name=field12981" json:"field12981,omitempty"`
 	Field12982    []string            `protobuf:"bytes,2,rep,name=field12982" json:"field12982,omitempty"`
 	Field12983    *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field12983" json:"field12983,omitempty"`
@@ -2458,10 +2729,18 @@
 func (*Message12979) ProtoMessage() {}
 
 func (x *Message12979) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12979) XXX_Methods() *protoiface.Methods {
+func (x *Message12979) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[30].Methods()
 }
 
@@ -2520,6 +2799,7 @@
 }
 
 type Message37173 struct {
+	state         protoimpl.MessageState
 	Field37252    *string             `protobuf:"bytes,1,opt,name=field37252" json:"field37252,omitempty"`
 	Field37253    *int64              `protobuf:"varint,2,opt,name=field37253" json:"field37253,omitempty"`
 	Field37254    *UnusedEnum         `protobuf:"varint,4,opt,name=field37254,enum=benchmarks.google_message4.UnusedEnum" json:"field37254,omitempty"`
@@ -2560,10 +2840,18 @@
 func (*Message37173) ProtoMessage() {}
 
 func (x *Message37173) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37173) XXX_Methods() *protoiface.Methods {
+func (x *Message37173) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[31].Methods()
 }
 
@@ -2748,6 +3036,7 @@
 }
 
 type Message12799 struct {
+	state         protoimpl.MessageState
 	Field12809    *string         `protobuf:"bytes,1,req,name=field12809" json:"field12809,omitempty"`
 	Field12810    []uint64        `protobuf:"fixed64,2,rep,name=field12810" json:"field12810,omitempty"`
 	Field12811    []*Message12776 `protobuf:"bytes,8,rep,name=field12811" json:"field12811,omitempty"`
@@ -2771,10 +3060,18 @@
 func (*Message12799) ProtoMessage() {}
 
 func (x *Message12799) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12799) XXX_Methods() *protoiface.Methods {
+func (x *Message12799) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[32].Methods()
 }
 
@@ -2840,6 +3137,7 @@
 }
 
 type Message12870 struct {
+	state         protoimpl.MessageState
 	Field12879    *int32          `protobuf:"varint,1,req,name=field12879" json:"field12879,omitempty"`
 	Field12880    *int32          `protobuf:"varint,7,opt,name=field12880" json:"field12880,omitempty"`
 	Field12881    *int32          `protobuf:"varint,2,req,name=field12881" json:"field12881,omitempty"`
@@ -2875,10 +3173,18 @@
 func (*Message12870) ProtoMessage() {}
 
 func (x *Message12870) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12870) XXX_Methods() *protoiface.Methods {
+func (x *Message12870) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[33].Methods()
 }
 
@@ -3028,6 +3334,7 @@
 }
 
 type Message3804 struct {
+	state         protoimpl.MessageState
 	Field3818     *int64     `protobuf:"varint,1,req,name=field3818" json:"field3818,omitempty"`
 	Field3819     *bool      `protobuf:"varint,2,req,name=field3819" json:"field3819,omitempty"`
 	Field3820     []Enum3805 `protobuf:"varint,4,rep,name=field3820,enum=benchmarks.google_message4.Enum3805" json:"field3820,omitempty"`
@@ -3050,10 +3357,18 @@
 func (*Message3804) ProtoMessage() {}
 
 func (x *Message3804) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3804) XXX_Methods() *protoiface.Methods {
+func (x *Message3804) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[34].Methods()
 }
 
@@ -3112,6 +3427,7 @@
 }
 
 type Message12903 struct {
+	state         protoimpl.MessageState
 	Field12905    *string        `protobuf:"bytes,1,opt,name=field12905" json:"field12905,omitempty"`
 	Field12906    *Message8587   `protobuf:"bytes,2,opt,name=field12906" json:"field12906,omitempty"`
 	Field12907    []*Message8590 `protobuf:"bytes,3,rep,name=field12907" json:"field12907,omitempty"`
@@ -3130,10 +3446,18 @@
 func (*Message12903) ProtoMessage() {}
 
 func (x *Message12903) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12903) XXX_Methods() *protoiface.Methods {
+func (x *Message12903) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[35].Methods()
 }
 
@@ -3164,6 +3488,7 @@
 }
 
 type Message37326 struct {
+	state         protoimpl.MessageState
 	Field37345    *string `protobuf:"bytes,1,req,name=field37345" json:"field37345,omitempty"`
 	Field37346    *string `protobuf:"bytes,2,opt,name=field37346" json:"field37346,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3181,10 +3506,18 @@
 func (*Message37326) ProtoMessage() {}
 
 func (x *Message37326) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message37326) XXX_Methods() *protoiface.Methods {
+func (x *Message37326) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[36].Methods()
 }
 
@@ -3208,6 +3541,7 @@
 }
 
 type Message2356 struct {
+	state         protoimpl.MessageState
 	Field2368     *Message1374               `protobuf:"bytes,121,opt,name=field2368" json:"field2368,omitempty"`
 	Field2369     *uint64                    `protobuf:"varint,1,opt,name=field2369" json:"field2369,omitempty"`
 	Field2370     *int32                     `protobuf:"varint,2,opt,name=field2370" json:"field2370,omitempty"`
@@ -3254,10 +3588,18 @@
 func (*Message2356) ProtoMessage() {}
 
 func (x *Message2356) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356) XXX_Methods() *protoiface.Methods {
+func (x *Message2356) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[37].Methods()
 }
 
@@ -3484,6 +3826,7 @@
 }
 
 type Message0 struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -3500,10 +3843,18 @@
 func (*Message0) ProtoMessage() {}
 
 func (x *Message0) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message0) XXX_Methods() *protoiface.Methods {
+func (x *Message0) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[38].Methods()
 }
 
@@ -3522,6 +3873,7 @@
 }
 
 type Message971 struct {
+	state         protoimpl.MessageState
 	Field972      *string `protobuf:"bytes,1,opt,name=field972" json:"field972,omitempty"`
 	Field973      *int32  `protobuf:"varint,2,opt,name=field973" json:"field973,omitempty"`
 	Field974      *bool   `protobuf:"varint,3,opt,name=field974" json:"field974,omitempty"`
@@ -3540,10 +3892,18 @@
 func (*Message971) ProtoMessage() {}
 
 func (x *Message971) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message971) XXX_Methods() *protoiface.Methods {
+func (x *Message971) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[39].Methods()
 }
 
@@ -3574,6 +3934,7 @@
 }
 
 type Message176_Message178 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3589,10 +3950,18 @@
 func (*Message176_Message178) ProtoMessage() {}
 
 func (x *Message176_Message178) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message176_Message178) XXX_Methods() *protoiface.Methods {
+func (x *Message176_Message178) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[40].Methods()
 }
 
@@ -3602,6 +3971,7 @@
 }
 
 type Message3069_Message3070 struct {
+	state         protoimpl.MessageState
 	Field3378     *Enum3071 `protobuf:"varint,4,req,name=field3378,enum=benchmarks.google_message4.Enum3071" json:"field3378,omitempty"`
 	Field3379     []byte    `protobuf:"bytes,5,req,name=field3379" json:"field3379,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -3619,10 +3989,18 @@
 func (*Message3069_Message3070) ProtoMessage() {}
 
 func (x *Message3069_Message3070) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3069_Message3070) XXX_Methods() *protoiface.Methods {
+func (x *Message3069_Message3070) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[41].Methods()
 }
 
@@ -3646,6 +4024,7 @@
 }
 
 type Message2356_Message2357 struct {
+	state         protoimpl.MessageState
 	Field2399     *int64 `protobuf:"varint,9,opt,name=field2399" json:"field2399,omitempty"`
 	Field2400     *int32 `protobuf:"varint,10,opt,name=field2400" json:"field2400,omitempty"`
 	Field2401     *int32 `protobuf:"varint,11,opt,name=field2401" json:"field2401,omitempty"`
@@ -3673,10 +4052,18 @@
 func (*Message2356_Message2357) ProtoMessage() {}
 
 func (x *Message2356_Message2357) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[42].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2357) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2357) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[42].Methods()
 }
 
@@ -3770,6 +4157,7 @@
 }
 
 type Message2356_Message2358 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3785,10 +4173,18 @@
 func (*Message2356_Message2358) ProtoMessage() {}
 
 func (x *Message2356_Message2358) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[43].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2358) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2358) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[43].Methods()
 }
 
@@ -3798,6 +4194,7 @@
 }
 
 type Message2356_Message2359 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3813,10 +4210,18 @@
 func (*Message2356_Message2359) ProtoMessage() {}
 
 func (x *Message2356_Message2359) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[44].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_proto_msgTypes[44]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2356_Message2359) XXX_Methods() *protoiface.Methods {
+func (x *Message2356_Message2359) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_proto_msgTypes[44].Methods()
 }
 
@@ -5120,9 +5525,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GoogleMessage4); i {
-			case 16:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 17:
+				return &v.sizeCache
+			case 18:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5130,9 +5537,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message37489); i {
-			case 21:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 22:
+				return &v.sizeCache
+			case 23:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5140,9 +5549,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7319); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5150,9 +5561,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12717); i {
-			case 9:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 10:
+				return &v.sizeCache
+			case 11:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5160,9 +5573,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message37331); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5170,9 +5585,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8815); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5180,9 +5597,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7330); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5190,9 +5609,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12960); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5200,9 +5621,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message176); i {
-			case 59:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 60:
+				return &v.sizeCache
+			case 61:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5210,9 +5633,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8817); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5220,9 +5645,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8835); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5230,9 +5657,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message37333); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5240,9 +5669,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13000); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5250,9 +5681,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message37335); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5260,9 +5693,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8848); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5270,9 +5705,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message13035); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5280,9 +5717,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8856); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5290,9 +5729,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12908); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5300,9 +5741,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12910); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5310,240 +5753,8 @@
 		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message37327); i {
-			case 11:
-				return &v.sizeCache
-			case 12:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message37329); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message2517); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12748); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12687); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11948); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message11976); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7320); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3069); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			case 5:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12948); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message8768); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12979); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message37173); i {
-			case 25:
-				return &v.sizeCache
-			case 26:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12799); i {
-			case 8:
-				return &v.sizeCache
-			case 9:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12870); i {
-			case 20:
-				return &v.sizeCache
-			case 21:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3804); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12903); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message37326); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message2356); i {
-			case 31:
-				return &v.sizeCache
-			case 32:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message0); i {
 			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			case 2:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message971); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message176_Message178); i {
-			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3069_Message3070); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message2356_Message2357); i {
+				return &v.state
 			case 12:
 				return &v.sizeCache
 			case 13:
@@ -5552,11 +5763,293 @@
 				return nil
 			}
 		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message37329); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message2517); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12748); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12687); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11948); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message11976); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7320); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3069); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			case 6:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12948); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message8768); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12979); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message37173); i {
+			case 0:
+				return &v.state
+			case 26:
+				return &v.sizeCache
+			case 27:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12799); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12870); i {
+			case 0:
+				return &v.state
+			case 21:
+				return &v.sizeCache
+			case 22:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3804); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12903); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message37326); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message2356); i {
+			case 0:
+				return &v.state
+			case 32:
+				return &v.sizeCache
+			case 33:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message0); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			case 3:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message971); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message176_Message178); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3069_Message3070); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message2356_Message2357); i {
+			case 0:
+				return &v.state
+			case 13:
+				return &v.sizeCache
+			case 14:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356_Message2358); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5565,8 +6058,10 @@
 		file_datasets_google_message4_benchmark_message4_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2356_Message2359); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_1.pb.go b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_1.pb.go
index 9bfa0b1..2a68946 100644
--- a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_1.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_1.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message2463 struct {
+	state         protoimpl.MessageState
 	Field2498     []*Message2462 `protobuf:"bytes,1,rep,name=field2498" json:"field2498,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -34,10 +35,18 @@
 func (*Message2463) ProtoMessage() {}
 
 func (x *Message2463) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2463) XXX_Methods() *protoiface.Methods {
+func (x *Message2463) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[0].Methods()
 }
 
@@ -54,6 +63,7 @@
 }
 
 type Message12686 struct {
+	state         protoimpl.MessageState
 	Field12699    *string       `protobuf:"bytes,1,opt,name=field12699" json:"field12699,omitempty"`
 	Field12700    *Message12685 `protobuf:"bytes,2,opt,name=field12700" json:"field12700,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -71,10 +81,18 @@
 func (*Message12686) ProtoMessage() {}
 
 func (x *Message12686) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12686) XXX_Methods() *protoiface.Methods {
+func (x *Message12686) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[1].Methods()
 }
 
@@ -98,6 +116,7 @@
 }
 
 type Message11949 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -113,10 +132,18 @@
 func (*Message11949) ProtoMessage() {}
 
 func (x *Message11949) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11949) XXX_Methods() *protoiface.Methods {
+func (x *Message11949) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[2].Methods()
 }
 
@@ -126,6 +153,7 @@
 }
 
 type Message11975 struct {
+	state         protoimpl.MessageState
 	Field11992    *string         `protobuf:"bytes,1,opt,name=field11992" json:"field11992,omitempty"`
 	Field11993    *int32          `protobuf:"varint,2,opt,name=field11993" json:"field11993,omitempty"`
 	Field11994    []*Message10320 `protobuf:"bytes,3,rep,name=field11994" json:"field11994,omitempty"`
@@ -151,10 +179,18 @@
 func (*Message11975) ProtoMessage() {}
 
 func (x *Message11975) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11975) XXX_Methods() *protoiface.Methods {
+func (x *Message11975) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[3].Methods()
 }
 
@@ -234,6 +270,7 @@
 }
 
 type Message7287 struct {
+	state         protoimpl.MessageState
 	Field7311     *Message6133        `protobuf:"bytes,1,opt,name=field7311" json:"field7311,omitempty"`
 	Field7312     *UnusedEmptyMessage `protobuf:"bytes,8,opt,name=field7312" json:"field7312,omitempty"`
 	Field7313     *string             `protobuf:"bytes,3,opt,name=field7313" json:"field7313,omitempty"`
@@ -257,10 +294,18 @@
 func (*Message7287) ProtoMessage() {}
 
 func (x *Message7287) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7287) XXX_Methods() *protoiface.Methods {
+func (x *Message7287) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[4].Methods()
 }
 
@@ -326,6 +371,7 @@
 }
 
 type Message3061 struct {
+	state         protoimpl.MessageState
 	Field3286     *string                    `protobuf:"bytes,2,opt,name=field3286" json:"field3286,omitempty"`
 	Field3287     *int32                     `protobuf:"varint,77,opt,name=field3287" json:"field3287,omitempty"`
 	Field3288     *string                    `protobuf:"bytes,49,opt,name=field3288" json:"field3288,omitempty"`
@@ -389,10 +435,18 @@
 func (*Message3061) ProtoMessage() {}
 
 func (x *Message3061) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061) XXX_Methods() *protoiface.Methods {
+func (x *Message3061) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[5].Methods()
 }
 
@@ -738,6 +792,7 @@
 }
 
 type Message12949 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -753,10 +808,18 @@
 func (*Message12949) ProtoMessage() {}
 
 func (x *Message12949) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12949) XXX_Methods() *protoiface.Methods {
+func (x *Message12949) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[6].Methods()
 }
 
@@ -766,6 +829,7 @@
 }
 
 type Message8572 struct {
+	state         protoimpl.MessageState
 	Field8647     []byte              `protobuf:"bytes,1,opt,name=field8647" json:"field8647,omitempty"`
 	Field8648     []byte              `protobuf:"bytes,3,opt,name=field8648" json:"field8648,omitempty"`
 	Field8649     *Message3886        `protobuf:"bytes,4,opt,name=field8649" json:"field8649,omitempty"`
@@ -831,10 +895,18 @@
 func (*Message8572) ProtoMessage() {}
 
 func (x *Message8572) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8572) XXX_Methods() *protoiface.Methods {
+func (x *Message8572) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[7].Methods()
 }
 
@@ -1194,6 +1266,7 @@
 }
 
 type Message8774 struct {
+	state         protoimpl.MessageState
 	Field8810     *string `protobuf:"bytes,1,opt,name=field8810" json:"field8810,omitempty"`
 	Field8811     *string `protobuf:"bytes,2,opt,name=field8811" json:"field8811,omitempty"`
 	Field8812     *string `protobuf:"bytes,3,opt,name=field8812" json:"field8812,omitempty"`
@@ -1214,10 +1287,18 @@
 func (*Message8774) ProtoMessage() {}
 
 func (x *Message8774) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8774) XXX_Methods() *protoiface.Methods {
+func (x *Message8774) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[8].Methods()
 }
 
@@ -1262,6 +1343,7 @@
 }
 
 type Message12776 struct {
+	state           protoimpl.MessageState
 	Field12786      *string             `protobuf:"bytes,1,opt,name=field12786" json:"field12786,omitempty"`
 	Field12787      *uint64             `protobuf:"fixed64,11,opt,name=field12787" json:"field12787,omitempty"`
 	Field12788      *int32              `protobuf:"varint,6,opt,name=field12788" json:"field12788,omitempty"`
@@ -1288,10 +1370,18 @@
 func (*Message12776) ProtoMessage() {}
 
 func (x *Message12776) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12776) XXX_Methods() *protoiface.Methods {
+func (x *Message12776) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[9].Methods()
 }
 
@@ -1385,6 +1475,7 @@
 }
 
 type Message12798 struct {
+	state         protoimpl.MessageState
 	Field12805    *int32        `protobuf:"varint,1,opt,name=field12805" json:"field12805,omitempty"`
 	Field12806    *int32        `protobuf:"varint,2,opt,name=field12806" json:"field12806,omitempty"`
 	Field12807    *Message12774 `protobuf:"bytes,6,opt,name=field12807" json:"field12807,omitempty"`
@@ -1404,10 +1495,18 @@
 func (*Message12798) ProtoMessage() {}
 
 func (x *Message12798) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12798) XXX_Methods() *protoiface.Methods {
+func (x *Message12798) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[10].Methods()
 }
 
@@ -1445,6 +1544,7 @@
 }
 
 type Message12797 struct {
+	state         protoimpl.MessageState
 	Field12802    *Message12796   `protobuf:"bytes,1,opt,name=field12802" json:"field12802,omitempty"`
 	Field12803    []*Message12796 `protobuf:"bytes,2,rep,name=field12803" json:"field12803,omitempty"`
 	Field12804    *string         `protobuf:"bytes,3,opt,name=field12804" json:"field12804,omitempty"`
@@ -1463,10 +1563,18 @@
 func (*Message12797) ProtoMessage() {}
 
 func (x *Message12797) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12797) XXX_Methods() *protoiface.Methods {
+func (x *Message12797) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[11].Methods()
 }
 
@@ -1497,6 +1605,7 @@
 }
 
 type Message12825 struct {
+	state         protoimpl.MessageState
 	Field12862    []*Message12818       `protobuf:"bytes,1,rep,name=field12862" json:"field12862,omitempty"`
 	Field12863    *int32                `protobuf:"varint,2,opt,name=field12863" json:"field12863,omitempty"`
 	Field12864    *Message12819         `protobuf:"bytes,3,opt,name=field12864" json:"field12864,omitempty"`
@@ -1519,10 +1628,18 @@
 func (*Message12825) ProtoMessage() {}
 
 func (x *Message12825) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12825) XXX_Methods() *protoiface.Methods {
+func (x *Message12825) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[12].Methods()
 }
 
@@ -1581,6 +1698,7 @@
 }
 
 type Message8590 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1596,10 +1714,18 @@
 func (*Message8590) ProtoMessage() {}
 
 func (x *Message8590) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8590) XXX_Methods() *protoiface.Methods {
+func (x *Message8590) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[13].Methods()
 }
 
@@ -1609,6 +1735,7 @@
 }
 
 type Message8587 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1624,10 +1751,18 @@
 func (*Message8587) ProtoMessage() {}
 
 func (x *Message8587) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8587) XXX_Methods() *protoiface.Methods {
+func (x *Message8587) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[14].Methods()
 }
 
@@ -1637,6 +1772,7 @@
 }
 
 type Message1374 struct {
+	state         protoimpl.MessageState
 	Field1375     *string `protobuf:"bytes,1,req,name=field1375" json:"field1375,omitempty"`
 	Field1376     *string `protobuf:"bytes,2,opt,name=field1376" json:"field1376,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1654,10 +1790,18 @@
 func (*Message1374) ProtoMessage() {}
 
 func (x *Message1374) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1374) XXX_Methods() *protoiface.Methods {
+func (x *Message1374) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[15].Methods()
 }
 
@@ -1681,6 +1825,7 @@
 }
 
 type Message2462 struct {
+	state         protoimpl.MessageState
 	Field2496     []byte   `protobuf:"bytes,1,req,name=field2496" json:"field2496,omitempty"`
 	Field2497     *float64 `protobuf:"fixed64,2,req,name=field2497" json:"field2497,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1698,10 +1843,18 @@
 func (*Message2462) ProtoMessage() {}
 
 func (x *Message2462) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2462) XXX_Methods() *protoiface.Methods {
+func (x *Message2462) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[16].Methods()
 }
 
@@ -1725,6 +1878,7 @@
 }
 
 type Message12685 struct {
+	state         protoimpl.MessageState
 	Field12692    []string `protobuf:"bytes,1,rep,name=field12692" json:"field12692,omitempty"`
 	Field12693    []string `protobuf:"bytes,2,rep,name=field12693" json:"field12693,omitempty"`
 	Field12694    *int64   `protobuf:"varint,3,opt,name=field12694" json:"field12694,omitempty"`
@@ -1747,10 +1901,18 @@
 func (*Message12685) ProtoMessage() {}
 
 func (x *Message12685) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12685) XXX_Methods() *protoiface.Methods {
+func (x *Message12685) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[17].Methods()
 }
 
@@ -1809,6 +1971,7 @@
 }
 
 type Message10320 struct {
+	state         protoimpl.MessageState
 	Field10347    *Enum10335      `protobuf:"varint,1,opt,name=field10347,enum=benchmarks.google_message4.Enum10335" json:"field10347,omitempty"`
 	Field10348    []*Message10319 `protobuf:"bytes,2,rep,name=field10348" json:"field10348,omitempty"`
 	Field10349    *int32          `protobuf:"varint,3,opt,name=field10349" json:"field10349,omitempty"`
@@ -1831,10 +1994,18 @@
 func (*Message10320) ProtoMessage() {}
 
 func (x *Message10320) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10320) XXX_Methods() *protoiface.Methods {
+func (x *Message10320) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[18].Methods()
 }
 
@@ -1893,6 +2064,7 @@
 }
 
 type Message11947 struct {
+	state         protoimpl.MessageState
 	Field11951    *uint32 `protobuf:"varint,1,opt,name=field11951" json:"field11951,omitempty"`
 	Field11952    *bool   `protobuf:"varint,2,opt,name=field11952" json:"field11952,omitempty"`
 	Field11953    *int32  `protobuf:"varint,3,opt,name=field11953" json:"field11953,omitempty"`
@@ -1911,10 +2083,18 @@
 func (*Message11947) ProtoMessage() {}
 
 func (x *Message11947) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11947) XXX_Methods() *protoiface.Methods {
+func (x *Message11947) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[19].Methods()
 }
 
@@ -1945,6 +2125,7 @@
 }
 
 type Message11920 struct {
+	state         protoimpl.MessageState
 	Field11945    *Enum11901  `protobuf:"varint,1,opt,name=field11945,enum=benchmarks.google_message4.Enum11901" json:"field11945,omitempty"`
 	Field11946    *UnusedEnum `protobuf:"varint,2,opt,name=field11946,enum=benchmarks.google_message4.UnusedEnum" json:"field11946,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1962,10 +2143,18 @@
 func (*Message11920) ProtoMessage() {}
 
 func (x *Message11920) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message11920) XXX_Methods() *protoiface.Methods {
+func (x *Message11920) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[20].Methods()
 }
 
@@ -1989,6 +2178,7 @@
 }
 
 type Message6643 struct {
+	state         protoimpl.MessageState
 	Field6683     *UnusedEmptyMessage   `protobuf:"bytes,3,opt,name=field6683" json:"field6683,omitempty"`
 	Field6684     *UnusedEmptyMessage   `protobuf:"bytes,4,opt,name=field6684" json:"field6684,omitempty"`
 	Field6685     *float64              `protobuf:"fixed64,5,opt,name=field6685" json:"field6685,omitempty"`
@@ -2022,10 +2212,18 @@
 func (*Message6643) ProtoMessage() {}
 
 func (x *Message6643) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6643) XXX_Methods() *protoiface.Methods {
+func (x *Message6643) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[21].Methods()
 }
 
@@ -2161,6 +2359,7 @@
 }
 
 type Message6133 struct {
+	state         protoimpl.MessageState
 	Field6173     *Message4016   `protobuf:"bytes,12,opt,name=field6173" json:"field6173,omitempty"`
 	Field6174     *float64       `protobuf:"fixed64,16,opt,name=field6174" json:"field6174,omitempty"`
 	Field6175     *string        `protobuf:"bytes,1,req,name=field6175" json:"field6175,omitempty"`
@@ -2196,10 +2395,18 @@
 func (*Message6133) ProtoMessage() {}
 
 func (x *Message6133) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6133) XXX_Methods() *protoiface.Methods {
+func (x *Message6133) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[22].Methods()
 }
 
@@ -2349,6 +2556,7 @@
 }
 
 type Message6109 struct {
+	state           protoimpl.MessageState
 	Field6140       *string        `protobuf:"bytes,1,opt,name=field6140" json:"field6140,omitempty"`
 	Field6141       *Enum6111      `protobuf:"varint,2,req,name=field6141,enum=benchmarks.google_message4.Enum6111" json:"field6141,omitempty"`
 	Field6142       *int32         `protobuf:"varint,9,opt,name=field6142" json:"field6142,omitempty"`
@@ -2377,10 +2585,18 @@
 func (*Message6109) ProtoMessage() {}
 
 func (x *Message6109) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6109) XXX_Methods() *protoiface.Methods {
+func (x *Message6109) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[23].Methods()
 }
 
@@ -2483,6 +2699,7 @@
 }
 
 type Message3046 struct {
+	state         protoimpl.MessageState
 	Field3222     *Enum2593 `protobuf:"varint,1,req,name=field3222,enum=benchmarks.google_message4.Enum2593" json:"field3222,omitempty"`
 	Field3223     *int32    `protobuf:"varint,4,opt,name=field3223" json:"field3223,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2500,10 +2717,18 @@
 func (*Message3046) ProtoMessage() {}
 
 func (x *Message3046) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3046) XXX_Methods() *protoiface.Methods {
+func (x *Message3046) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[24].Methods()
 }
 
@@ -2527,6 +2752,7 @@
 }
 
 type Message3060 struct {
+	state         protoimpl.MessageState
 	Field3283     *int64 `protobuf:"varint,1,opt,name=field3283" json:"field3283,omitempty"`
 	Field3284     *int64 `protobuf:"varint,2,opt,name=field3284" json:"field3284,omitempty"`
 	Field3285     *int64 `protobuf:"varint,3,opt,name=field3285" json:"field3285,omitempty"`
@@ -2545,10 +2771,18 @@
 func (*Message3060) ProtoMessage() {}
 
 func (x *Message3060) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3060) XXX_Methods() *protoiface.Methods {
+func (x *Message3060) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[25].Methods()
 }
 
@@ -2579,6 +2813,7 @@
 }
 
 type Message3041 struct {
+	state         protoimpl.MessageState
 	Field3214     *string `protobuf:"bytes,1,opt,name=field3214" json:"field3214,omitempty"`
 	Field3215     *int32  `protobuf:"varint,2,opt,name=field3215" json:"field3215,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2596,10 +2831,18 @@
 func (*Message3041) ProtoMessage() {}
 
 func (x *Message3041) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3041) XXX_Methods() *protoiface.Methods {
+func (x *Message3041) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[26].Methods()
 }
 
@@ -2623,6 +2866,7 @@
 }
 
 type Message3040 struct {
+	state         protoimpl.MessageState
 	Field3209     *uint64  `protobuf:"fixed64,1,req,name=field3209" json:"field3209,omitempty"`
 	Field3210     []uint64 `protobuf:"fixed64,4,rep,name=field3210" json:"field3210,omitempty"`
 	Field3211     *int32   `protobuf:"varint,5,opt,name=field3211" json:"field3211,omitempty"`
@@ -2643,10 +2887,18 @@
 func (*Message3040) ProtoMessage() {}
 
 func (x *Message3040) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3040) XXX_Methods() *protoiface.Methods {
+func (x *Message3040) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[27].Methods()
 }
 
@@ -2691,6 +2943,7 @@
 }
 
 type Message3050 struct {
+	state         protoimpl.MessageState
 	Field3245     []byte  `protobuf:"bytes,5,opt,name=field3245" json:"field3245,omitempty"`
 	Field3246     *int32  `protobuf:"varint,2,opt,name=field3246" json:"field3246,omitempty"`
 	Field3247     []byte  `protobuf:"bytes,6,opt,name=field3247" json:"field3247,omitempty"`
@@ -2712,10 +2965,18 @@
 func (*Message3050) ProtoMessage() {}
 
 func (x *Message3050) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3050) XXX_Methods() *protoiface.Methods {
+func (x *Message3050) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[28].Methods()
 }
 
@@ -2767,6 +3028,7 @@
 }
 
 type Message7905 struct {
+	state         protoimpl.MessageState
 	Field7911     *int32 `protobuf:"varint,1,opt,name=field7911" json:"field7911,omitempty"`
 	Field7912     *bool  `protobuf:"varint,2,opt,name=field7912" json:"field7912,omitempty"`
 	Field7913     []byte `protobuf:"bytes,3,opt,name=field7913" json:"field7913,omitempty"`
@@ -2789,10 +3051,18 @@
 func (*Message7905) ProtoMessage() {}
 
 func (x *Message7905) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7905) XXX_Methods() *protoiface.Methods {
+func (x *Message7905) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[29].Methods()
 }
 
@@ -2851,6 +3121,7 @@
 }
 
 type Message3886 struct {
+	state         protoimpl.MessageState
 	Message3887   []*Message3886_Message3887 `protobuf:"group,1,rep,name=Message3887,json=message3887" json:"message3887,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2867,10 +3138,18 @@
 func (*Message3886) ProtoMessage() {}
 
 func (x *Message3886) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3886) XXX_Methods() *protoiface.Methods {
+func (x *Message3886) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[30].Methods()
 }
 
@@ -2887,6 +3166,7 @@
 }
 
 type Message7864 struct {
+	state         protoimpl.MessageState
 	Field7866     *string               `protobuf:"bytes,1,opt,name=field7866" json:"field7866,omitempty"`
 	Field7867     *string               `protobuf:"bytes,2,opt,name=field7867" json:"field7867,omitempty"`
 	Field7868     []*Message7865        `protobuf:"bytes,5,rep,name=field7868" json:"field7868,omitempty"`
@@ -2908,10 +3188,18 @@
 func (*Message7864) ProtoMessage() {}
 
 func (x *Message7864) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7864) XXX_Methods() *protoiface.Methods {
+func (x *Message7864) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[31].Methods()
 }
 
@@ -2963,6 +3251,7 @@
 }
 
 type Message3922 struct {
+	state         protoimpl.MessageState
 	Field4012     *uint64 `protobuf:"varint,1,opt,name=field4012" json:"field4012,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2979,10 +3268,18 @@
 func (*Message3922) ProtoMessage() {}
 
 func (x *Message3922) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3922) XXX_Methods() *protoiface.Methods {
+func (x *Message3922) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[32].Methods()
 }
 
@@ -2999,6 +3296,7 @@
 }
 
 type Message3052 struct {
+	state         protoimpl.MessageState
 	Field3254     []string `protobuf:"bytes,1,rep,name=field3254" json:"field3254,omitempty"`
 	Field3255     []string `protobuf:"bytes,2,rep,name=field3255" json:"field3255,omitempty"`
 	Field3256     [][]byte `protobuf:"bytes,3,rep,name=field3256" json:"field3256,omitempty"`
@@ -3023,10 +3321,18 @@
 func (*Message3052) ProtoMessage() {}
 
 func (x *Message3052) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3052) XXX_Methods() *protoiface.Methods {
+func (x *Message3052) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[33].Methods()
 }
 
@@ -3099,6 +3405,7 @@
 }
 
 type Message8575 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3114,10 +3421,18 @@
 func (*Message8575) ProtoMessage() {}
 
 func (x *Message8575) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message8575) XXX_Methods() *protoiface.Methods {
+func (x *Message8575) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[34].Methods()
 }
 
@@ -3127,6 +3442,7 @@
 }
 
 type Message7843 struct {
+	state         protoimpl.MessageState
 	Field7844     *bool               `protobuf:"varint,5,opt,name=field7844" json:"field7844,omitempty"`
 	Field7845     *int32              `protobuf:"varint,1,opt,name=field7845" json:"field7845,omitempty"`
 	Field7846     *UnusedEmptyMessage `protobuf:"bytes,22,opt,name=field7846" json:"field7846,omitempty"`
@@ -3158,10 +3474,18 @@
 func (*Message7843) ProtoMessage() {}
 
 func (x *Message7843) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[35].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7843) XXX_Methods() *protoiface.Methods {
+func (x *Message7843) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[35].Methods()
 }
 
@@ -3283,6 +3607,7 @@
 }
 
 type Message3919 struct {
+	state         protoimpl.MessageState
 	Field4009     []*Message3920 `protobuf:"bytes,1,rep,name=field4009" json:"field4009,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -3299,10 +3624,18 @@
 func (*Message3919) ProtoMessage() {}
 
 func (x *Message3919) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[36].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3919) XXX_Methods() *protoiface.Methods {
+func (x *Message3919) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[36].Methods()
 }
 
@@ -3319,6 +3652,7 @@
 }
 
 type Message7929 struct {
+	state         protoimpl.MessageState
 	Field7942     *int64                `protobuf:"varint,1,opt,name=field7942" json:"field7942,omitempty"`
 	Field7943     *int64                `protobuf:"varint,4,opt,name=field7943" json:"field7943,omitempty"`
 	Field7944     *int64                `protobuf:"varint,5,opt,name=field7944" json:"field7944,omitempty"`
@@ -3354,10 +3688,18 @@
 func (*Message7929) ProtoMessage() {}
 
 func (x *Message7929) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[37].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[37]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7929) XXX_Methods() *protoiface.Methods {
+func (x *Message7929) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[37].Methods()
 }
 
@@ -3507,6 +3849,7 @@
 }
 
 type Message3061_Message3062 struct {
+	state         protoimpl.MessageState
 	Field3335     *int32 `protobuf:"varint,5,req,name=field3335" json:"field3335,omitempty"`
 	Field3336     *int32 `protobuf:"varint,6,opt,name=field3336" json:"field3336,omitempty"`
 	Field3337     *int32 `protobuf:"varint,7,opt,name=field3337" json:"field3337,omitempty"`
@@ -3525,10 +3868,18 @@
 func (*Message3061_Message3062) ProtoMessage() {}
 
 func (x *Message3061_Message3062) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[38].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[38]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061_Message3062) XXX_Methods() *protoiface.Methods {
+func (x *Message3061_Message3062) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[38].Methods()
 }
 
@@ -3559,6 +3910,7 @@
 }
 
 type Message3061_Message3063 struct {
+	state         protoimpl.MessageState
 	Field3338     *int32    `protobuf:"varint,14,req,name=field3338" json:"field3338,omitempty"`
 	Field3339     *Enum2851 `protobuf:"varint,18,opt,name=field3339,enum=benchmarks.google_message4.Enum2851" json:"field3339,omitempty"`
 	Field3340     *int64    `protobuf:"varint,15,opt,name=field3340" json:"field3340,omitempty"`
@@ -3578,10 +3930,18 @@
 func (*Message3061_Message3063) ProtoMessage() {}
 
 func (x *Message3061_Message3063) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[39].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[39]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061_Message3063) XXX_Methods() *protoiface.Methods {
+func (x *Message3061_Message3063) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[39].Methods()
 }
 
@@ -3619,6 +3979,7 @@
 }
 
 type Message3061_Message3064 struct {
+	state         protoimpl.MessageState
 	Field3342     *Enum2602           `protobuf:"varint,9,req,name=field3342,enum=benchmarks.google_message4.Enum2602" json:"field3342,omitempty"`
 	Field3343     *int32              `protobuf:"varint,92,opt,name=field3343" json:"field3343,omitempty"`
 	Field3344     *string             `protobuf:"bytes,10,opt,name=field3344" json:"field3344,omitempty"`
@@ -3653,10 +4014,18 @@
 func (*Message3061_Message3064) ProtoMessage() {}
 
 func (x *Message3061_Message3064) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[40].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[40]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061_Message3064) XXX_Methods() *protoiface.Methods {
+func (x *Message3061_Message3064) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[40].Methods()
 }
 
@@ -3799,6 +4168,7 @@
 }
 
 type Message3061_Message3065 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -3814,10 +4184,18 @@
 func (*Message3061_Message3065) ProtoMessage() {}
 
 func (x *Message3061_Message3065) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[41].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[41]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061_Message3065) XXX_Methods() *protoiface.Methods {
+func (x *Message3061_Message3065) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[41].Methods()
 }
 
@@ -3827,6 +4205,7 @@
 }
 
 type Message3061_Message3066 struct {
+	state         protoimpl.MessageState
 	Field3366     *int32              `protobuf:"varint,22,opt,name=field3366" json:"field3366,omitempty"`
 	Field3367     *int32              `protobuf:"varint,55,opt,name=field3367" json:"field3367,omitempty"`
 	Field3368     *int32              `protobuf:"varint,88,opt,name=field3368" json:"field3368,omitempty"`
@@ -3850,10 +4229,18 @@
 func (*Message3061_Message3066) ProtoMessage() {}
 
 func (x *Message3061_Message3066) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[42].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[42]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3061_Message3066) XXX_Methods() *protoiface.Methods {
+func (x *Message3061_Message3066) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[42].Methods()
 }
 
@@ -3919,6 +4306,7 @@
 }
 
 type Message3886_Message3887 struct {
+	state         protoimpl.MessageState
 	Field3932     *string      `protobuf:"bytes,2,req,name=field3932" json:"field3932,omitempty"`
 	Field3933     *string      `protobuf:"bytes,9,opt,name=field3933" json:"field3933,omitempty"`
 	Field3934     *Message3850 `protobuf:"bytes,3,opt,name=field3934" json:"field3934,omitempty"`
@@ -3938,10 +4326,18 @@
 func (*Message3886_Message3887) ProtoMessage() {}
 
 func (x *Message3886_Message3887) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[43].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[43]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3886_Message3887) XXX_Methods() *protoiface.Methods {
+func (x *Message3886_Message3887) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[43].Methods()
 }
 
@@ -5240,9 +5636,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2463); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5250,9 +5648,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12686); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5261,8 +5661,10 @@
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11949); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5270,9 +5672,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11975); i {
-			case 10:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 11:
+				return &v.sizeCache
+			case 12:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5280,9 +5684,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7287); i {
-			case 8:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 9:
+				return &v.sizeCache
+			case 10:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5290,9 +5696,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3061); i {
-			case 48:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 49:
+				return &v.sizeCache
+			case 50:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5301,8 +5709,10 @@
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12949); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5310,9 +5720,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8572); i {
-			case 50:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 51:
+				return &v.sizeCache
+			case 52:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5320,6 +5732,34 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8774); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12776); i {
+			case 0:
+				return &v.state
+			case 11:
+				return &v.sizeCache
+			case 12:
+				return &v.unknownFields
+			case 13:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12798); i {
+			case 0:
+				return &v.state
 			case 5:
 				return &v.sizeCache
 			case 6:
@@ -5328,20 +5768,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12776); i {
-			case 10:
-				return &v.sizeCache
-			case 11:
-				return &v.unknownFields
-			case 12:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12798); i {
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12797); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -5350,21 +5780,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12797); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12825); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5373,8 +5795,10 @@
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8590); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5383,8 +5807,10 @@
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8587); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5392,9 +5818,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1374); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5402,9 +5830,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2462); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5412,9 +5842,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12685); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5422,9 +5854,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message10320); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5432,9 +5866,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11947); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5442,58 +5878,8 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message11920); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6643); i {
-			case 18:
-				return &v.sizeCache
-			case 19:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6133); i {
-			case 20:
-				return &v.sizeCache
-			case 21:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6109); i {
-			case 12:
-				return &v.sizeCache
-			case 13:
-				return &v.unknownFields
-			case 14:
-				return &v.extensionFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3046); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3060); i {
+			case 0:
+				return &v.state
 			case 3:
 				return &v.sizeCache
 			case 4:
@@ -5502,11 +5888,75 @@
 				return nil
 			}
 		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6643); i {
+			case 0:
+				return &v.state
+			case 19:
+				return &v.sizeCache
+			case 20:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6133); i {
+			case 0:
+				return &v.state
+			case 21:
+				return &v.sizeCache
+			case 22:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6109); i {
+			case 0:
+				return &v.state
+			case 13:
+				return &v.sizeCache
+			case 14:
+				return &v.unknownFields
+			case 15:
+				return &v.extensionFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3046); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3060); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3041); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5514,16 +5964,8 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3040); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3050); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -5532,8 +5974,10 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7905); i {
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3050); i {
+			case 0:
+				return &v.state
 			case 7:
 				return &v.sizeCache
 			case 8:
@@ -5542,11 +5986,25 @@
 				return nil
 			}
 		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7905); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3886); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5554,9 +6012,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7864); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5564,9 +6024,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3922); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5574,9 +6036,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3052); i {
-			case 9:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 10:
+				return &v.sizeCache
+			case 11:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5585,25 +6049,7 @@
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message8575); i {
 			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7843); i {
-			case 16:
-				return &v.sizeCache
-			case 17:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3919); i {
+				return &v.state
 			case 1:
 				return &v.sizeCache
 			case 2:
@@ -5612,8 +6058,70 @@
 				return nil
 			}
 		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7843); i {
+			case 0:
+				return &v.state
+			case 17:
+				return &v.sizeCache
+			case 18:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3919); i {
+			case 0:
+				return &v.state
+			case 2:
+				return &v.sizeCache
+			case 3:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7929); i {
+			case 0:
+				return &v.state
+			case 21:
+				return &v.sizeCache
+			case 22:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3061_Message3062); i {
+			case 0:
+				return &v.state
+			case 4:
+				return &v.sizeCache
+			case 5:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3061_Message3063); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3061_Message3064); i {
+			case 0:
+				return &v.state
 			case 20:
 				return &v.sizeCache
 			case 21:
@@ -5622,41 +6130,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3061_Message3062); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3061_Message3063); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3061_Message3064); i {
-			case 19:
-				return &v.sizeCache
-			case 20:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3061_Message3065); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5664,9 +6144,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3061_Message3066); i {
-			case 8:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 9:
+				return &v.sizeCache
+			case 10:
 				return &v.unknownFields
 			default:
 				return nil
@@ -5674,9 +6156,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_1_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3886_Message3887); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_2.pb.go b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_2.pb.go
index 6070f9d..b77e245 100644
--- a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_2.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_2.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message12774 struct {
+	state         protoimpl.MessageState
 	Field12777    *uint32 `protobuf:"varint,1,opt,name=field12777" json:"field12777,omitempty"`
 	Field12778    *uint32 `protobuf:"varint,2,opt,name=field12778" json:"field12778,omitempty"`
 	Field12779    *uint32 `protobuf:"varint,3,opt,name=field12779" json:"field12779,omitempty"`
@@ -39,10 +40,18 @@
 func (*Message12774) ProtoMessage() {}
 
 func (x *Message12774) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12774) XXX_Methods() *protoiface.Methods {
+func (x *Message12774) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[0].Methods()
 }
 
@@ -94,6 +103,7 @@
 }
 
 type Message12796 struct {
+	state         protoimpl.MessageState
 	Field12800    []uint64 `protobuf:"fixed64,1,rep,name=field12800" json:"field12800,omitempty"`
 	Field12801    *uint64  `protobuf:"varint,2,opt,name=field12801" json:"field12801,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -111,10 +121,18 @@
 func (*Message12796) ProtoMessage() {}
 
 func (x *Message12796) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[1].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12796) XXX_Methods() *protoiface.Methods {
+func (x *Message12796) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[1].Methods()
 }
 
@@ -138,6 +156,7 @@
 }
 
 type Message12821 struct {
+	state         protoimpl.MessageState
 	Field12848    *int32 `protobuf:"varint,1,opt,name=field12848" json:"field12848,omitempty"`
 	Field12849    *int32 `protobuf:"varint,2,opt,name=field12849" json:"field12849,omitempty"`
 	Field12850    *int32 `protobuf:"varint,3,opt,name=field12850" json:"field12850,omitempty"`
@@ -158,10 +177,18 @@
 func (*Message12821) ProtoMessage() {}
 
 func (x *Message12821) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[2].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12821) XXX_Methods() *protoiface.Methods {
+func (x *Message12821) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[2].Methods()
 }
 
@@ -206,6 +233,7 @@
 }
 
 type Message12820 struct {
+	state         protoimpl.MessageState
 	Field12840    *int32 `protobuf:"varint,1,opt,name=field12840" json:"field12840,omitempty"`
 	Field12841    *int32 `protobuf:"varint,2,opt,name=field12841" json:"field12841,omitempty"`
 	Field12842    *int32 `protobuf:"varint,3,opt,name=field12842" json:"field12842,omitempty"`
@@ -229,10 +257,18 @@
 func (*Message12820) ProtoMessage() {}
 
 func (x *Message12820) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[3].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12820) XXX_Methods() *protoiface.Methods {
+func (x *Message12820) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[3].Methods()
 }
 
@@ -298,6 +334,7 @@
 }
 
 type Message12819 struct {
+	state         protoimpl.MessageState
 	Field12834    *float64 `protobuf:"fixed64,1,opt,name=field12834" json:"field12834,omitempty"`
 	Field12835    *float64 `protobuf:"fixed64,2,opt,name=field12835" json:"field12835,omitempty"`
 	Field12836    *float64 `protobuf:"fixed64,3,opt,name=field12836" json:"field12836,omitempty"`
@@ -319,10 +356,18 @@
 func (*Message12819) ProtoMessage() {}
 
 func (x *Message12819) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[4].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12819) XXX_Methods() *protoiface.Methods {
+func (x *Message12819) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[4].Methods()
 }
 
@@ -374,6 +419,7 @@
 }
 
 type Message12818 struct {
+	state         protoimpl.MessageState
 	Field12829    *uint64         `protobuf:"varint,1,opt,name=field12829" json:"field12829,omitempty"`
 	Field12830    *int32          `protobuf:"varint,2,opt,name=field12830" json:"field12830,omitempty"`
 	Field12831    *int32          `protobuf:"varint,3,opt,name=field12831" json:"field12831,omitempty"`
@@ -394,10 +440,18 @@
 func (*Message12818) ProtoMessage() {}
 
 func (x *Message12818) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[5].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12818) XXX_Methods() *protoiface.Methods {
+func (x *Message12818) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[5].Methods()
 }
 
@@ -442,6 +496,7 @@
 }
 
 type Message10319 struct {
+	state         protoimpl.MessageState
 	Field10340    *Enum10325 `protobuf:"varint,1,opt,name=field10340,enum=benchmarks.google_message4.Enum10325" json:"field10340,omitempty"`
 	Field10341    *int32     `protobuf:"varint,4,opt,name=field10341" json:"field10341,omitempty"`
 	Field10342    *int32     `protobuf:"varint,5,opt,name=field10342" json:"field10342,omitempty"`
@@ -464,10 +519,18 @@
 func (*Message10319) ProtoMessage() {}
 
 func (x *Message10319) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[6].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message10319) XXX_Methods() *protoiface.Methods {
+func (x *Message10319) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[6].Methods()
 }
 
@@ -526,6 +589,7 @@
 }
 
 type Message6578 struct {
+	state         protoimpl.MessageState
 	Field6632     *Enum6579 `protobuf:"varint,1,opt,name=field6632,enum=benchmarks.google_message4.Enum6579" json:"field6632,omitempty"`
 	Field6633     *Enum6588 `protobuf:"varint,2,opt,name=field6633,enum=benchmarks.google_message4.Enum6588" json:"field6633,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -543,10 +607,18 @@
 func (*Message6578) ProtoMessage() {}
 
 func (x *Message6578) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[7].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6578) XXX_Methods() *protoiface.Methods {
+func (x *Message6578) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[7].Methods()
 }
 
@@ -570,6 +642,7 @@
 }
 
 type Message6126 struct {
+	state         protoimpl.MessageState
 	Field6152     *string               `protobuf:"bytes,1,req,name=field6152" json:"field6152,omitempty"`
 	Field6153     []*Message6127        `protobuf:"bytes,9,rep,name=field6153" json:"field6153,omitempty"`
 	Field6154     *int32                `protobuf:"varint,14,opt,name=field6154" json:"field6154,omitempty"`
@@ -604,10 +677,18 @@
 func (*Message6126) ProtoMessage() {}
 
 func (x *Message6126) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[8].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6126) XXX_Methods() *protoiface.Methods {
+func (x *Message6126) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[8].Methods()
 }
 
@@ -750,6 +831,7 @@
 }
 
 type Message5881 struct {
+	state         protoimpl.MessageState
 	Field5897     *float64            `protobuf:"fixed64,1,req,name=field5897" json:"field5897,omitempty"`
 	Field5898     *string             `protobuf:"bytes,5,opt,name=field5898" json:"field5898,omitempty"`
 	Field5899     *Message5861        `protobuf:"bytes,2,opt,name=field5899" json:"field5899,omitempty"`
@@ -771,10 +853,18 @@
 func (*Message5881) ProtoMessage() {}
 
 func (x *Message5881) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[9].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5881) XXX_Methods() *protoiface.Methods {
+func (x *Message5881) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[9].Methods()
 }
 
@@ -826,6 +916,7 @@
 }
 
 type Message6110 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -841,10 +932,18 @@
 func (*Message6110) ProtoMessage() {}
 
 func (x *Message6110) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[10].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6110) XXX_Methods() *protoiface.Methods {
+func (x *Message6110) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[10].Methods()
 }
 
@@ -854,6 +953,7 @@
 }
 
 type Message6107 struct {
+	state         protoimpl.MessageState
 	Field6134     *Message4016   `protobuf:"bytes,1,opt,name=field6134" json:"field6134,omitempty"`
 	Field6135     *int32         `protobuf:"varint,2,opt,name=field6135" json:"field6135,omitempty"`
 	Field6136     *string        `protobuf:"bytes,3,opt,name=field6136" json:"field6136,omitempty"`
@@ -875,10 +975,18 @@
 func (*Message6107) ProtoMessage() {}
 
 func (x *Message6107) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[11].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6107) XXX_Methods() *protoiface.Methods {
+func (x *Message6107) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[11].Methods()
 }
 
@@ -930,6 +1038,7 @@
 }
 
 type Message6129 struct {
+	state         protoimpl.MessageState
 	Field6171     *Enum6130 `protobuf:"varint,1,req,name=field6171,enum=benchmarks.google_message4.Enum6130" json:"field6171,omitempty"`
 	Field6172     *string   `protobuf:"bytes,2,req,name=field6172" json:"field6172,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -947,10 +1056,18 @@
 func (*Message6129) ProtoMessage() {}
 
 func (x *Message6129) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[12].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6129) XXX_Methods() *protoiface.Methods {
+func (x *Message6129) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[12].Methods()
 }
 
@@ -974,6 +1091,7 @@
 }
 
 type Message5908 struct {
+	state         protoimpl.MessageState
 	Field5971     *string      `protobuf:"bytes,1,opt,name=field5971" json:"field5971,omitempty"`
 	Field5972     *int32       `protobuf:"varint,2,opt,name=field5972" json:"field5972,omitempty"`
 	Field5973     *int32       `protobuf:"varint,3,opt,name=field5973" json:"field5973,omitempty"`
@@ -1039,10 +1157,18 @@
 func (*Message5908) ProtoMessage() {}
 
 func (x *Message5908) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[13].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5908) XXX_Methods() *protoiface.Methods {
+func (x *Message5908) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[13].Methods()
 }
 
@@ -1402,6 +1528,7 @@
 }
 
 type Message3850 struct {
+	state         protoimpl.MessageState
 	Field3924     *Enum3851 `protobuf:"varint,2,opt,name=field3924,enum=benchmarks.google_message4.Enum3851" json:"field3924,omitempty"`
 	Field3925     *bool     `protobuf:"varint,12,opt,name=field3925" json:"field3925,omitempty"`
 	Field3926     *int32    `protobuf:"varint,4,opt,name=field3926" json:"field3926,omitempty"`
@@ -1423,10 +1550,18 @@
 func (*Message3850) ProtoMessage() {}
 
 func (x *Message3850) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[14].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3850) XXX_Methods() *protoiface.Methods {
+func (x *Message3850) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[14].Methods()
 }
 
@@ -1478,6 +1613,7 @@
 }
 
 type Message7865 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1493,10 +1629,18 @@
 func (*Message7865) ProtoMessage() {}
 
 func (x *Message7865) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[15].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7865) XXX_Methods() *protoiface.Methods {
+func (x *Message7865) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[15].Methods()
 }
 
@@ -1506,6 +1650,7 @@
 }
 
 type Message7511 struct {
+	state         protoimpl.MessageState
 	Field7523     *bool     `protobuf:"varint,1,opt,name=field7523" json:"field7523,omitempty"`
 	Field7524     *Enum7512 `protobuf:"varint,2,opt,name=field7524,enum=benchmarks.google_message4.Enum7512" json:"field7524,omitempty"`
 	Field7525     *int32    `protobuf:"varint,3,opt,name=field7525" json:"field7525,omitempty"`
@@ -1528,10 +1673,18 @@
 func (*Message7511) ProtoMessage() {}
 
 func (x *Message7511) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[16].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7511) XXX_Methods() *protoiface.Methods {
+func (x *Message7511) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[16].Methods()
 }
 
@@ -1590,6 +1743,7 @@
 }
 
 type Message3920 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1605,10 +1759,18 @@
 func (*Message3920) ProtoMessage() {}
 
 func (x *Message3920) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[17].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3920) XXX_Methods() *protoiface.Methods {
+func (x *Message3920) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[17].Methods()
 }
 
@@ -1618,6 +1780,7 @@
 }
 
 type Message7928 struct {
+	state         protoimpl.MessageState
 	Field7940     *string `protobuf:"bytes,1,opt,name=field7940" json:"field7940,omitempty"`
 	Field7941     *int64  `protobuf:"varint,2,opt,name=field7941" json:"field7941,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1635,10 +1798,18 @@
 func (*Message7928) ProtoMessage() {}
 
 func (x *Message7928) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[18].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7928) XXX_Methods() *protoiface.Methods {
+func (x *Message7928) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[18].Methods()
 }
 
@@ -1662,6 +1833,7 @@
 }
 
 type Message7921 struct {
+	state         protoimpl.MessageState
 	Field7936     *int32    `protobuf:"varint,1,opt,name=field7936" json:"field7936,omitempty"`
 	Field7937     *int64    `protobuf:"varint,2,opt,name=field7937" json:"field7937,omitempty"`
 	Field7938     *float32  `protobuf:"fixed32,3,opt,name=field7938" json:"field7938,omitempty"`
@@ -1681,10 +1853,18 @@
 func (*Message7921) ProtoMessage() {}
 
 func (x *Message7921) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[19].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7921) XXX_Methods() *protoiface.Methods {
+func (x *Message7921) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[19].Methods()
 }
 
@@ -1722,6 +1902,7 @@
 }
 
 type Message7920 struct {
+	state         protoimpl.MessageState
 	Field7934     *int64 `protobuf:"varint,1,opt,name=field7934" json:"field7934,omitempty"`
 	Field7935     *int64 `protobuf:"varint,2,opt,name=field7935" json:"field7935,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1739,10 +1920,18 @@
 func (*Message7920) ProtoMessage() {}
 
 func (x *Message7920) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[20].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7920) XXX_Methods() *protoiface.Methods {
+func (x *Message7920) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[20].Methods()
 }
 
@@ -1766,6 +1955,7 @@
 }
 
 type Message7919 struct {
+	state         protoimpl.MessageState
 	Field7931     *uint64 `protobuf:"fixed64,1,opt,name=field7931" json:"field7931,omitempty"`
 	Field7932     *int64  `protobuf:"varint,2,opt,name=field7932" json:"field7932,omitempty"`
 	Field7933     []byte  `protobuf:"bytes,3,opt,name=field7933" json:"field7933,omitempty"`
@@ -1784,10 +1974,18 @@
 func (*Message7919) ProtoMessage() {}
 
 func (x *Message7919) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[21].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message7919) XXX_Methods() *protoiface.Methods {
+func (x *Message7919) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[21].Methods()
 }
 
@@ -1818,6 +2016,7 @@
 }
 
 type Message12817 struct {
+	state         protoimpl.MessageState
 	Field12826    *int32 `protobuf:"varint,1,opt,name=field12826" json:"field12826,omitempty"`
 	Field12827    *int32 `protobuf:"varint,2,opt,name=field12827" json:"field12827,omitempty"`
 	Field12828    *int32 `protobuf:"varint,3,opt,name=field12828" json:"field12828,omitempty"`
@@ -1836,10 +2035,18 @@
 func (*Message12817) ProtoMessage() {}
 
 func (x *Message12817) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[22].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message12817) XXX_Methods() *protoiface.Methods {
+func (x *Message12817) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[22].Methods()
 }
 
@@ -1870,6 +2077,7 @@
 }
 
 type Message6054 struct {
+	state         protoimpl.MessageState
 	Field6089     *string `protobuf:"bytes,1,req,name=field6089" json:"field6089,omitempty"`
 	Field6090     *string `protobuf:"bytes,2,opt,name=field6090" json:"field6090,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1887,10 +2095,18 @@
 func (*Message6054) ProtoMessage() {}
 
 func (x *Message6054) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[23].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6054) XXX_Methods() *protoiface.Methods {
+func (x *Message6054) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[23].Methods()
 }
 
@@ -1914,6 +2130,7 @@
 }
 
 type Message6127 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1929,10 +2146,18 @@
 func (*Message6127) ProtoMessage() {}
 
 func (x *Message6127) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[24].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6127) XXX_Methods() *protoiface.Methods {
+func (x *Message6127) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[24].Methods()
 }
 
@@ -1942,6 +2167,7 @@
 }
 
 type Message6052 struct {
+	state         protoimpl.MessageState
 	Field6084     *string `protobuf:"bytes,1,req,name=field6084" json:"field6084,omitempty"`
 	Field6085     []byte  `protobuf:"bytes,2,req,name=field6085" json:"field6085,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1959,10 +2185,18 @@
 func (*Message6052) ProtoMessage() {}
 
 func (x *Message6052) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[25].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6052) XXX_Methods() *protoiface.Methods {
+func (x *Message6052) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[25].Methods()
 }
 
@@ -1986,6 +2220,7 @@
 }
 
 type Message6024 struct {
+	state         protoimpl.MessageState
 	Field6048     *Enum6025           `protobuf:"varint,1,opt,name=field6048,enum=benchmarks.google_message4.Enum6025" json:"field6048,omitempty"`
 	Field6049     *string             `protobuf:"bytes,2,opt,name=field6049" json:"field6049,omitempty"`
 	Field6050     *UnusedEmptyMessage `protobuf:"bytes,3,opt,name=field6050" json:"field6050,omitempty"`
@@ -2004,10 +2239,18 @@
 func (*Message6024) ProtoMessage() {}
 
 func (x *Message6024) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[26].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6024) XXX_Methods() *protoiface.Methods {
+func (x *Message6024) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[26].Methods()
 }
 
@@ -2038,6 +2281,7 @@
 }
 
 type Message5861 struct {
+	state         protoimpl.MessageState
 	Field5882     *Enum5862 `protobuf:"varint,1,req,name=field5882,enum=benchmarks.google_message4.Enum5862" json:"field5882,omitempty"`
 	Field5883     *string   `protobuf:"bytes,2,req,name=field5883" json:"field5883,omitempty"`
 	Field5884     *bool     `protobuf:"varint,3,opt,name=field5884" json:"field5884,omitempty"`
@@ -2057,10 +2301,18 @@
 func (*Message5861) ProtoMessage() {}
 
 func (x *Message5861) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[27].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5861) XXX_Methods() *protoiface.Methods {
+func (x *Message5861) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[27].Methods()
 }
 
@@ -2098,6 +2350,7 @@
 }
 
 type Message5880 struct {
+	state         protoimpl.MessageState
 	Field5896     *string `protobuf:"bytes,1,opt,name=field5896" json:"field5896,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -2114,10 +2367,18 @@
 func (*Message5880) ProtoMessage() {}
 
 func (x *Message5880) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[28].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5880) XXX_Methods() *protoiface.Methods {
+func (x *Message5880) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[28].Methods()
 }
 
@@ -2134,6 +2395,7 @@
 }
 
 type Message5867 struct {
+	state         protoimpl.MessageState
 	Field5890     *Enum5868   `protobuf:"varint,1,opt,name=field5890,enum=benchmarks.google_message4.Enum5868" json:"field5890,omitempty"`
 	Field5891     *string     `protobuf:"bytes,2,opt,name=field5891" json:"field5891,omitempty"`
 	Field5892     *Enum5873   `protobuf:"varint,3,opt,name=field5892,enum=benchmarks.google_message4.Enum5873" json:"field5892,omitempty"`
@@ -2155,10 +2417,18 @@
 func (*Message5867) ProtoMessage() {}
 
 func (x *Message5867) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[29].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[29]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5867) XXX_Methods() *protoiface.Methods {
+func (x *Message5867) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[29].Methods()
 }
 
@@ -2210,6 +2480,7 @@
 }
 
 type Message4016 struct {
+	state         protoimpl.MessageState
 	Field4017     *int32 `protobuf:"varint,1,req,name=field4017" json:"field4017,omitempty"`
 	Field4018     *int32 `protobuf:"varint,2,req,name=field4018" json:"field4018,omitempty"`
 	Field4019     *int32 `protobuf:"varint,3,req,name=field4019" json:"field4019,omitempty"`
@@ -2229,10 +2500,18 @@
 func (*Message4016) ProtoMessage() {}
 
 func (x *Message4016) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[30].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[30]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message4016) XXX_Methods() *protoiface.Methods {
+func (x *Message4016) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[30].Methods()
 }
 
@@ -2270,6 +2549,7 @@
 }
 
 type Message6108 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2285,10 +2565,18 @@
 func (*Message6108) ProtoMessage() {}
 
 func (x *Message6108) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[31].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[31]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message6108) XXX_Methods() *protoiface.Methods {
+func (x *Message6108) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[31].Methods()
 }
 
@@ -2298,6 +2586,7 @@
 }
 
 type Message5907 struct {
+	state         protoimpl.MessageState
 	Field5967     *Message5903 `protobuf:"bytes,1,opt,name=field5967" json:"field5967,omitempty"`
 	Field5968     *Message5903 `protobuf:"bytes,2,opt,name=field5968" json:"field5968,omitempty"`
 	Field5969     *Message5903 `protobuf:"bytes,3,opt,name=field5969" json:"field5969,omitempty"`
@@ -2317,10 +2606,18 @@
 func (*Message5907) ProtoMessage() {}
 
 func (x *Message5907) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[32].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[32]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5907) XXX_Methods() *protoiface.Methods {
+func (x *Message5907) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[32].Methods()
 }
 
@@ -2358,6 +2655,7 @@
 }
 
 type UnusedEmptyMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -2373,10 +2671,18 @@
 func (*UnusedEmptyMessage) ProtoMessage() {}
 
 func (x *UnusedEmptyMessage) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[33].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[33]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UnusedEmptyMessage) XXX_Methods() *protoiface.Methods {
+func (x *UnusedEmptyMessage) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[33].Methods()
 }
 
@@ -2386,6 +2692,7 @@
 }
 
 type Message5903 struct {
+	state         protoimpl.MessageState
 	Field5965     *int32    `protobuf:"varint,1,req,name=field5965" json:"field5965,omitempty"`
 	Field5966     *Enum5904 `protobuf:"varint,2,opt,name=field5966,enum=benchmarks.google_message4.Enum5904" json:"field5966,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2403,10 +2710,18 @@
 func (*Message5903) ProtoMessage() {}
 
 func (x *Message5903) ProtoReflect() protoreflect.Message {
-	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[34].MessageOf(x)
+	mi := &file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[34]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message5903) XXX_Methods() *protoiface.Methods {
+func (x *Message5903) XXX_Methods() *protoiface.Methods {
 	return file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[34].Methods()
 }
 
@@ -3132,6 +3447,32 @@
 	if !protoimpl.UnsafeEnabled {
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12774); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12796); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12821); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -3140,28 +3481,46 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12796); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12821); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12820); i {
+			case 0:
+				return &v.state
+			case 9:
+				return &v.sizeCache
+			case 10:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12819); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message12818); i {
+			case 0:
+				return &v.state
+			case 6:
+				return &v.sizeCache
+			case 7:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message10319); i {
+			case 0:
+				return &v.state
 			case 8:
 				return &v.sizeCache
 			case 9:
@@ -3170,41 +3529,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12819); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message12818); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message10319); i {
-			case 7:
-				return &v.sizeCache
-			case 8:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6578); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3212,9 +3543,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6126); i {
-			case 19:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 20:
+				return &v.sizeCache
+			case 21:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3222,9 +3555,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5881); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3233,8 +3568,10 @@
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6110); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3242,56 +3579,8 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6107); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message6129); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message5908); i {
-			case 50:
-				return &v.sizeCache
-			case 51:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message3850); i {
-			case 6:
-				return &v.sizeCache
-			case 7:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7865); i {
 			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7511); i {
+				return &v.state
 			case 7:
 				return &v.sizeCache
 			case 8:
@@ -3300,11 +3589,73 @@
 				return nil
 			}
 		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message6129); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message5908); i {
+			case 0:
+				return &v.state
+			case 51:
+				return &v.sizeCache
+			case 52:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message3850); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7865); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7511); i {
+			case 0:
+				return &v.state
+			case 8:
+				return &v.sizeCache
+			case 9:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3920); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3312,9 +3663,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7928); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3322,6 +3675,32 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message7921); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7920); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Message7919); i {
+			case 0:
+				return &v.state
 			case 4:
 				return &v.sizeCache
 			case 5:
@@ -3330,31 +3709,13 @@
 				return nil
 			}
 		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7920); i {
-			case 2:
-				return &v.sizeCache
-			case 3:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Message7919); i {
-			case 3:
-				return &v.sizeCache
-			case 4:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message12817); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3362,9 +3723,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6054); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3373,8 +3736,10 @@
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6127); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3382,9 +3747,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6052); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3392,9 +3759,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6024); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3402,9 +3771,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5861); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3412,9 +3783,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5880); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3422,9 +3795,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5867); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3432,9 +3807,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message4016); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3443,8 +3820,10 @@
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message6108); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3452,9 +3831,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5907); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3463,8 +3844,10 @@
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UnusedEmptyMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3472,9 +3855,11 @@
 		}
 		file_datasets_google_message4_benchmark_message4_2_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message5903); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/conformance/conformance.pb.go b/internal/testprotos/conformance/conformance.pb.go
index 29b39cd..9ca9562 100644
--- a/internal/testprotos/conformance/conformance.pb.go
+++ b/internal/testprotos/conformance/conformance.pb.go
@@ -131,6 +131,7 @@
 // This will be known by message_type == "conformance.FailureSet", a conformance
 // test should return a serialized FailureSet in protobuf_payload.
 type FailureSet struct {
+	state         protoimpl.MessageState
 	Failure       []string `protobuf:"bytes,1,rep,name=failure,proto3" json:"failure,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -147,10 +148,18 @@
 func (*FailureSet) ProtoMessage() {}
 
 func (x *FailureSet) ProtoReflect() protoreflect.Message {
-	return file_conformance_conformance_proto_msgTypes[0].MessageOf(x)
+	mi := &file_conformance_conformance_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FailureSet) XXX_Methods() *protoiface.Methods {
+func (x *FailureSet) XXX_Methods() *protoiface.Methods {
 	return file_conformance_conformance_proto_msgTypes[0].Methods()
 }
 
@@ -172,6 +181,7 @@
 //   2. parse the protobuf or JSON payload in "payload" (which may fail)
 //   3. if the parse succeeded, serialize the message in the requested format.
 type ConformanceRequest struct {
+	state protoimpl.MessageState
 	// The payload (whether protobuf of JSON) is always for a
 	// protobuf_test_messages.proto3.TestAllTypes proto (as defined in
 	// src/google/protobuf/proto3_test_messages.proto).
@@ -214,10 +224,18 @@
 func (*ConformanceRequest) ProtoMessage() {}
 
 func (x *ConformanceRequest) ProtoReflect() protoreflect.Message {
-	return file_conformance_conformance_proto_msgTypes[1].MessageOf(x)
+	mi := &file_conformance_conformance_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ConformanceRequest) XXX_Methods() *protoiface.Methods {
+func (x *ConformanceRequest) XXX_Methods() *protoiface.Methods {
 	return file_conformance_conformance_proto_msgTypes[1].Methods()
 }
 
@@ -319,6 +337,7 @@
 
 // Represents a single test case's output.
 type ConformanceResponse struct {
+	state protoimpl.MessageState
 	// Types that are valid to be assigned to Result:
 	// This string should be set to indicate parsing failed.  The string can
 	// provide more information about the parse error if it is available.
@@ -366,10 +385,18 @@
 func (*ConformanceResponse) ProtoMessage() {}
 
 func (x *ConformanceResponse) ProtoReflect() protoreflect.Message {
-	return file_conformance_conformance_proto_msgTypes[2].MessageOf(x)
+	mi := &file_conformance_conformance_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ConformanceResponse) XXX_Methods() *protoiface.Methods {
+func (x *ConformanceResponse) XXX_Methods() *protoiface.Methods {
 	return file_conformance_conformance_proto_msgTypes[2].Methods()
 }
 
@@ -495,6 +522,7 @@
 
 // Encoding options for jspb format.
 type JspbEncodingConfig struct {
+	state protoimpl.MessageState
 	// Encode the value field of Any as jspb array if ture, otherwise binary.
 	UseJspbArrayAnyFormat bool `protobuf:"varint,1,opt,name=use_jspb_array_any_format,json=useJspbArrayAnyFormat,proto3" json:"use_jspb_array_any_format,omitempty"`
 	sizeCache             protoimpl.SizeCache
@@ -512,10 +540,18 @@
 func (*JspbEncodingConfig) ProtoMessage() {}
 
 func (x *JspbEncodingConfig) ProtoReflect() protoreflect.Message {
-	return file_conformance_conformance_proto_msgTypes[3].MessageOf(x)
+	mi := &file_conformance_conformance_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *JspbEncodingConfig) XXX_Methods() *protoiface.Methods {
+func (x *JspbEncodingConfig) XXX_Methods() *protoiface.Methods {
 	return file_conformance_conformance_proto_msgTypes[3].Methods()
 }
 
@@ -658,9 +694,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_conformance_conformance_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FailureSet); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -668,9 +706,11 @@
 		}
 		file_conformance_conformance_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ConformanceRequest); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -678,9 +718,11 @@
 		}
 		file_conformance_conformance_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ConformanceResponse); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -688,9 +730,11 @@
 		}
 		file_conformance_conformance_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*JspbEncodingConfig); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/conformance/test_messages_proto2.pb.go b/internal/testprotos/conformance/test_messages_proto2.pb.go
index 39ef291..f4bf2c8 100644
--- a/internal/testprotos/conformance/test_messages_proto2.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto2.pb.go
@@ -135,6 +135,7 @@
 // could trigger bugs that occur in any message type in this file.  We verify
 // this stays true in a unit test.
 type TestAllTypesProto2 struct {
+	state protoimpl.MessageState
 	// Singular
 	OptionalInt32          *int32                            `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"`
 	OptionalInt64          *int64                            `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64" json:"optional_int64,omitempty"`
@@ -248,10 +249,18 @@
 func (*TestAllTypesProto2) ProtoMessage() {}
 
 func (x *TestAllTypesProto2) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[0].Methods()
 }
 
@@ -965,6 +974,7 @@
 func (*TestAllTypesProto2_OneofEnum) isTestAllTypesProto2_OneofField() {}
 
 type ForeignMessageProto2 struct {
+	state         protoimpl.MessageState
 	C             *int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -981,10 +991,18 @@
 func (*ForeignMessageProto2) ProtoMessage() {}
 
 func (x *ForeignMessageProto2) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ForeignMessageProto2) XXX_Methods() *protoiface.Methods {
+func (x *ForeignMessageProto2) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[1].Methods()
 }
 
@@ -1001,6 +1019,7 @@
 }
 
 type TestAllTypesProto2_NestedMessage struct {
+	state         protoimpl.MessageState
 	A             *int32              `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	Corecursive   *TestAllTypesProto2 `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1018,10 +1037,18 @@
 func (*TestAllTypesProto2_NestedMessage) ProtoMessage() {}
 
 func (x *TestAllTypesProto2_NestedMessage) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2_NestedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2_NestedMessage) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[2].Methods()
 }
 
@@ -1046,6 +1073,7 @@
 
 // groups
 type TestAllTypesProto2_Data struct {
+	state         protoimpl.MessageState
 	GroupInt32    *int32  `protobuf:"varint,202,opt,name=group_int32,json=groupInt32" json:"group_int32,omitempty"`
 	GroupUint32   *uint32 `protobuf:"varint,203,opt,name=group_uint32,json=groupUint32" json:"group_uint32,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1063,10 +1091,18 @@
 func (*TestAllTypesProto2_Data) ProtoMessage() {}
 
 func (x *TestAllTypesProto2_Data) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[22].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2_Data) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2_Data) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[22].Methods()
 }
 
@@ -1091,6 +1127,7 @@
 
 // message_set test case.
 type TestAllTypesProto2_MessageSetCorrect struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -1107,10 +1144,18 @@
 func (*TestAllTypesProto2_MessageSetCorrect) ProtoMessage() {}
 
 func (x *TestAllTypesProto2_MessageSetCorrect) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[23].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2_MessageSetCorrect) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2_MessageSetCorrect) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[23].Methods()
 }
 
@@ -1129,6 +1174,7 @@
 }
 
 type TestAllTypesProto2_MessageSetCorrectExtension1 struct {
+	state         protoimpl.MessageState
 	Str           *string `protobuf:"bytes,25,opt,name=str" json:"str,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1145,10 +1191,18 @@
 func (*TestAllTypesProto2_MessageSetCorrectExtension1) ProtoMessage() {}
 
 func (x *TestAllTypesProto2_MessageSetCorrectExtension1) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[24].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2_MessageSetCorrectExtension1) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2_MessageSetCorrectExtension1) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[24].Methods()
 }
 
@@ -1165,6 +1219,7 @@
 }
 
 type TestAllTypesProto2_MessageSetCorrectExtension2 struct {
+	state         protoimpl.MessageState
 	I             *int32 `protobuf:"varint,9,opt,name=i" json:"i,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1181,10 +1236,18 @@
 func (*TestAllTypesProto2_MessageSetCorrectExtension2) ProtoMessage() {}
 
 func (x *TestAllTypesProto2_MessageSetCorrectExtension2) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto2_proto_msgTypes[25].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto2_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto2_MessageSetCorrectExtension2) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto2_MessageSetCorrectExtension2) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto2_proto_msgTypes[25].Methods()
 }
 
@@ -1883,11 +1946,13 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2); i {
-			case 82:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 83:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 84:
+				return &v.unknownFields
+			case 85:
 				return &v.extensionFields
 			default:
 				return nil
@@ -1895,9 +1960,11 @@
 		}
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ForeignMessageProto2); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1905,9 +1972,11 @@
 		}
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2_NestedMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1915,9 +1984,11 @@
 		}
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2_Data); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1926,10 +1997,12 @@
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2_MessageSetCorrect); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -1937,9 +2010,11 @@
 		}
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2_MessageSetCorrectExtension1); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1947,9 +2022,11 @@
 		}
 		file_google_protobuf_test_messages_proto2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto2_MessageSetCorrectExtension2); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/conformance/test_messages_proto3.pb.go b/internal/testprotos/conformance/test_messages_proto3.pb.go
index 9f8bb92..894404c 100644
--- a/internal/testprotos/conformance/test_messages_proto3.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto3.pb.go
@@ -173,6 +173,7 @@
 // could trigger bugs that occur in any message type in this file.  We verify
 // this stays true in a unit test.
 type TestAllTypesProto3 struct {
+	state protoimpl.MessageState
 	// Singular
 	OptionalInt32          int32                             `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32,proto3" json:"optional_int32,omitempty"`
 	OptionalInt64          int64                             `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64,proto3" json:"optional_int64,omitempty"`
@@ -317,10 +318,18 @@
 func (*TestAllTypesProto3) ProtoMessage() {}
 
 func (x *TestAllTypesProto3) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto3_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto3_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto3) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto3) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto3_proto_msgTypes[0].Methods()
 }
 
@@ -1242,6 +1251,7 @@
 func (*TestAllTypesProto3_OneofEnum) isTestAllTypesProto3_OneofField() {}
 
 type ForeignMessage struct {
+	state         protoimpl.MessageState
 	C             int32 `protobuf:"varint,1,opt,name=c,proto3" json:"c,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1258,10 +1268,18 @@
 func (*ForeignMessage) ProtoMessage() {}
 
 func (x *ForeignMessage) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto3_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto3_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ForeignMessage) XXX_Methods() *protoiface.Methods {
+func (x *ForeignMessage) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto3_proto_msgTypes[1].Methods()
 }
 
@@ -1278,6 +1296,7 @@
 }
 
 type TestAllTypesProto3_NestedMessage struct {
+	state         protoimpl.MessageState
 	A             int32               `protobuf:"varint,1,opt,name=a,proto3" json:"a,omitempty"`
 	Corecursive   *TestAllTypesProto3 `protobuf:"bytes,2,opt,name=corecursive,proto3" json:"corecursive,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1295,10 +1314,18 @@
 func (*TestAllTypesProto3_NestedMessage) ProtoMessage() {}
 
 func (x *TestAllTypesProto3_NestedMessage) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_test_messages_proto3_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_test_messages_proto3_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypesProto3_NestedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypesProto3_NestedMessage) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_test_messages_proto3_proto_msgTypes[2].Methods()
 }
 
@@ -2133,9 +2160,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_test_messages_proto3_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto3); i {
-			case 113:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 114:
+				return &v.sizeCache
+			case 115:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2143,9 +2172,11 @@
 		}
 		file_google_protobuf_test_messages_proto3_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ForeignMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -2153,9 +2184,11 @@
 		}
 		file_google_protobuf_test_messages_proto3_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypesProto3_NestedMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/irregular/test.pb.go b/internal/testprotos/irregular/test.pb.go
index 5ea3cb0..6a26b23 100644
--- a/internal/testprotos/irregular/test.pb.go
+++ b/internal/testprotos/irregular/test.pb.go
@@ -18,6 +18,7 @@
 )
 
 type Message struct {
+	state           protoimpl.MessageState
 	OptionalMessage *IrregularMessage            `protobuf:"bytes,1,opt,name=optional_message,json=optionalMessage" json:"optional_message,omitempty"`
 	RepeatedMessage []*IrregularMessage          `protobuf:"bytes,2,rep,name=repeated_message,json=repeatedMessage" json:"repeated_message,omitempty"`
 	RequiredMessage *IrregularMessage            `protobuf:"bytes,3,req,name=required_message,json=requiredMessage" json:"required_message,omitempty"`
@@ -40,10 +41,18 @@
 func (*Message) ProtoMessage() {}
 
 func (x *Message) ProtoReflect() protoreflect.Message {
-	return file_irregular_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_irregular_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message) XXX_Methods() *protoiface.Methods {
+func (x *Message) XXX_Methods() *protoiface.Methods {
 	return file_irregular_test_proto_msgTypes[0].Methods()
 }
 
@@ -193,9 +202,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_irregular_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/legacy/legacy.pb.go b/internal/testprotos/legacy/legacy.pb.go
index 717cd58..ff29662 100644
--- a/internal/testprotos/legacy/legacy.pb.go
+++ b/internal/testprotos/legacy/legacy.pb.go
@@ -30,6 +30,7 @@
 )
 
 type Legacy struct {
+	state         protoimpl.MessageState
 	F1            *proto2_v0_0.Message  `protobuf:"bytes,1,opt,name=f1,proto3" json:"f1,omitempty"`
 	F2            *proto3_v0_0.Message  `protobuf:"bytes,2,opt,name=f2,proto3" json:"f2,omitempty"`
 	F3            *proto2_v0_01.Message `protobuf:"bytes,3,opt,name=f3,proto3" json:"f3,omitempty"`
@@ -57,10 +58,18 @@
 func (*Legacy) ProtoMessage() {}
 
 func (x *Legacy) ProtoReflect() protoreflect.Message {
-	return file_legacy_legacy_proto_msgTypes[0].MessageOf(x)
+	mi := &file_legacy_legacy_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Legacy) XXX_Methods() *protoiface.Methods {
+func (x *Legacy) XXX_Methods() *protoiface.Methods {
 	return file_legacy_legacy_proto_msgTypes[0].Methods()
 }
 
@@ -305,9 +314,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_legacy_legacy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Legacy); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index f8c7e8c..fe2efba 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -222,6 +222,7 @@
 }
 
 type TestAllTypes struct {
+	state                  protoimpl.MessageState
 	OptionalInt32          *int32                                 `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"`
 	OptionalInt64          *int64                                 `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64" json:"optional_int64,omitempty"`
 	OptionalUint32         *uint32                                `protobuf:"varint,3,opt,name=optional_uint32,json=optionalUint32" json:"optional_uint32,omitempty"`
@@ -327,10 +328,18 @@
 func (*TestAllTypes) ProtoMessage() {}
 
 func (x *TestAllTypes) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[0].Methods()
 }
 
@@ -1035,6 +1044,7 @@
 
 // Deprecated: Do not use.
 type TestDeprecatedMessage struct {
+	state           protoimpl.MessageState
 	DeprecatedInt32 *int32 `protobuf:"varint,1,opt,name=deprecated_int32,json=deprecatedInt32" json:"deprecated_int32,omitempty"` // Deprecated: Do not use.
 	// Types that are valid to be assigned to DeprecatedOneof:
 	//	*TestDeprecatedMessage_DeprecatedOneofField
@@ -1054,10 +1064,18 @@
 func (*TestDeprecatedMessage) ProtoMessage() {}
 
 func (x *TestDeprecatedMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestDeprecatedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestDeprecatedMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[1].Methods()
 }
 
@@ -1100,6 +1118,7 @@
 func (*TestDeprecatedMessage_DeprecatedOneofField) isTestDeprecatedMessage_DeprecatedOneof() {}
 
 type ForeignMessage struct {
+	state         protoimpl.MessageState
 	C             *int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"`
 	D             *int32 `protobuf:"varint,2,opt,name=d" json:"d,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1117,10 +1136,18 @@
 func (*ForeignMessage) ProtoMessage() {}
 
 func (x *ForeignMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ForeignMessage) XXX_Methods() *protoiface.Methods {
+func (x *ForeignMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[2].Methods()
 }
 
@@ -1144,6 +1171,7 @@
 }
 
 type TestReservedFields struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1159,10 +1187,18 @@
 func (*TestReservedFields) ProtoMessage() {}
 
 func (x *TestReservedFields) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[3].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestReservedFields) XXX_Methods() *protoiface.Methods {
+func (x *TestReservedFields) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[3].Methods()
 }
 
@@ -1172,6 +1208,7 @@
 }
 
 type TestAllExtensions struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -1188,10 +1225,18 @@
 func (*TestAllExtensions) ProtoMessage() {}
 
 func (x *TestAllExtensions) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[4].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllExtensions) XXX_Methods() *protoiface.Methods {
+func (x *TestAllExtensions) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[4].Methods()
 }
 
@@ -1210,6 +1255,7 @@
 }
 
 type OptionalGroupExtension struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,17,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1226,10 +1272,18 @@
 func (*OptionalGroupExtension) ProtoMessage() {}
 
 func (x *OptionalGroupExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[5].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *OptionalGroupExtension) XXX_Methods() *protoiface.Methods {
+func (x *OptionalGroupExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[5].Methods()
 }
 
@@ -1246,6 +1300,7 @@
 }
 
 type RepeatedGroupExtension struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,47,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1262,10 +1317,18 @@
 func (*RepeatedGroupExtension) ProtoMessage() {}
 
 func (x *RepeatedGroupExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[6].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *RepeatedGroupExtension) XXX_Methods() *protoiface.Methods {
+func (x *RepeatedGroupExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[6].Methods()
 }
 
@@ -1282,6 +1345,7 @@
 }
 
 type TestNestedExtension struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1297,10 +1361,18 @@
 func (*TestNestedExtension) ProtoMessage() {}
 
 func (x *TestNestedExtension) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[7].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestNestedExtension) XXX_Methods() *protoiface.Methods {
+func (x *TestNestedExtension) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[7].Methods()
 }
 
@@ -1310,6 +1382,7 @@
 }
 
 type TestRequired struct {
+	state         protoimpl.MessageState
 	RequiredField *int32 `protobuf:"varint,1,req,name=required_field,json=requiredField" json:"required_field,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1326,10 +1399,18 @@
 func (*TestRequired) ProtoMessage() {}
 
 func (x *TestRequired) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[8].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequired) XXX_Methods() *protoiface.Methods {
+func (x *TestRequired) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[8].Methods()
 }
 
@@ -1346,6 +1427,7 @@
 }
 
 type TestRequiredForeign struct {
+	state           protoimpl.MessageState
 	OptionalMessage *TestRequired           `protobuf:"bytes,1,opt,name=optional_message,json=optionalMessage" json:"optional_message,omitempty"`
 	RepeatedMessage []*TestRequired         `protobuf:"bytes,2,rep,name=repeated_message,json=repeatedMessage" json:"repeated_message,omitempty"`
 	MapMessage      map[int32]*TestRequired `protobuf:"bytes,3,rep,name=map_message,json=mapMessage" json:"map_message,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
@@ -1367,10 +1449,18 @@
 func (*TestRequiredForeign) ProtoMessage() {}
 
 func (x *TestRequiredForeign) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[9].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredForeign) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredForeign) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[9].Methods()
 }
 
@@ -1425,6 +1515,7 @@
 func (*TestRequiredForeign_OneofMessage) isTestRequiredForeign_OneofField() {}
 
 type TestRequiredGroupFields struct {
+	state         protoimpl.MessageState
 	Optionalgroup *TestRequiredGroupFields_OptionalGroup   `protobuf:"group,1,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"`
 	Repeatedgroup []*TestRequiredGroupFields_RepeatedGroup `protobuf:"group,3,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1442,10 +1533,18 @@
 func (*TestRequiredGroupFields) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[10].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[10].Methods()
 }
 
@@ -1469,6 +1568,7 @@
 }
 
 type TestWeak struct {
+	state         protoimpl.MessageState
 	WeakMessage   *weak.WeakImportMessage `protobuf:"bytes,1,opt,weak=goproto.proto.test.weak.WeakImportMessage,name=weak_message,json=weakMessage" json:"weak_message,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1485,10 +1585,18 @@
 func (*TestWeak) ProtoMessage() {}
 
 func (x *TestWeak) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[11].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestWeak) XXX_Methods() *protoiface.Methods {
+func (x *TestWeak) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[11].Methods()
 }
 
@@ -1506,6 +1614,7 @@
 
 // Test that RPC services work.
 type FooRequest struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1521,10 +1630,18 @@
 func (*FooRequest) ProtoMessage() {}
 
 func (x *FooRequest) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[12].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FooRequest) XXX_Methods() *protoiface.Methods {
+func (x *FooRequest) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[12].Methods()
 }
 
@@ -1534,6 +1651,7 @@
 }
 
 type FooResponse struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -1549,10 +1667,18 @@
 func (*FooResponse) ProtoMessage() {}
 
 func (x *FooResponse) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[13].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FooResponse) XXX_Methods() *protoiface.Methods {
+func (x *FooResponse) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[13].Methods()
 }
 
@@ -1562,6 +1688,7 @@
 }
 
 type TestAllTypes_NestedMessage struct {
+	state         protoimpl.MessageState
 	A             *int32        `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	Corecursive   *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive" json:"corecursive,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -1579,10 +1706,18 @@
 func (*TestAllTypes_NestedMessage) ProtoMessage() {}
 
 func (x *TestAllTypes_NestedMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[14].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[14].Methods()
 }
 
@@ -1606,6 +1741,7 @@
 }
 
 type TestAllTypes_OptionalGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,17,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1622,10 +1758,18 @@
 func (*TestAllTypes_OptionalGroup) ProtoMessage() {}
 
 func (x *TestAllTypes_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[15].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_OptionalGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_OptionalGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[15].Methods()
 }
 
@@ -1642,6 +1786,7 @@
 }
 
 type TestAllTypes_RepeatedGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,47,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1658,10 +1803,18 @@
 func (*TestAllTypes_RepeatedGroup) ProtoMessage() {}
 
 func (x *TestAllTypes_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[16].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[16].Methods()
 }
 
@@ -1678,6 +1831,7 @@
 }
 
 type TestRequiredGroupFields_OptionalGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,2,req,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1694,10 +1848,18 @@
 func (*TestRequiredGroupFields_OptionalGroup) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields_OptionalGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[35].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[35]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields_OptionalGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields_OptionalGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[35].Methods()
 }
 
@@ -1714,6 +1876,7 @@
 }
 
 type TestRequiredGroupFields_RepeatedGroup struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,4,req,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -1730,10 +1893,18 @@
 func (*TestRequiredGroupFields_RepeatedGroup) ProtoMessage() {}
 
 func (x *TestRequiredGroupFields_RepeatedGroup) ProtoReflect() protoreflect.Message {
-	return file_test_test_proto_msgTypes[36].MessageOf(x)
+	mi := &file_test_test_proto_msgTypes[36]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestRequiredGroupFields_RepeatedGroup) XXX_Methods() *protoiface.Methods {
+func (x *TestRequiredGroupFields_RepeatedGroup) XXX_Methods() *protoiface.Methods {
 	return file_test_test_proto_msgTypes[36].Methods()
 }
 
@@ -3459,9 +3630,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_test_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes); i {
-			case 79:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 80:
+				return &v.sizeCache
+			case 81:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3469,9 +3642,11 @@
 		}
 		file_test_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestDeprecatedMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3479,9 +3654,11 @@
 		}
 		file_test_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ForeignMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3490,8 +3667,10 @@
 		file_test_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestReservedFields); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3500,10 +3679,12 @@
 		file_test_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllExtensions); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3511,9 +3692,11 @@
 		}
 		file_test_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*OptionalGroupExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3521,9 +3704,11 @@
 		}
 		file_test_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*RepeatedGroupExtension); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3532,15 +3717,7 @@
 		file_test_test_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestNestedExtension); i {
 			case 0:
-				return &v.sizeCache
-			case 1:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_test_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequired); i {
+				return &v.state
 			case 1:
 				return &v.sizeCache
 			case 2:
@@ -3549,18 +3726,10 @@
 				return nil
 			}
 		}
-		file_test_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequiredForeign); i {
-			case 4:
-				return &v.sizeCache
-			case 5:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_test_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestRequiredGroupFields); i {
+		file_test_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequired); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -3569,11 +3738,37 @@
 				return nil
 			}
 		}
+		file_test_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequiredForeign); i {
+			case 0:
+				return &v.state
+			case 5:
+				return &v.sizeCache
+			case 6:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_test_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestRequiredGroupFields); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 		file_test_test_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestWeak); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3582,8 +3777,10 @@
 		file_test_test_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FooRequest); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3592,8 +3789,10 @@
 		file_test_test_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FooResponse); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3601,6 +3800,20 @@
 		}
 		file_test_test_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes_NestedMessage); i {
+			case 0:
+				return &v.state
+			case 3:
+				return &v.sizeCache
+			case 4:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_test_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TestAllTypes_OptionalGroup); i {
+			case 0:
+				return &v.state
 			case 2:
 				return &v.sizeCache
 			case 3:
@@ -3609,21 +3822,13 @@
 				return nil
 			}
 		}
-		file_test_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TestAllTypes_OptionalGroup); i {
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_test_test_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes_RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3631,9 +3836,11 @@
 		}
 		file_test_test_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestRequiredGroupFields_OptionalGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3641,9 +3848,11 @@
 		}
 		file_test_test_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestRequiredGroupFields_RepeatedGroup); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/test_import.pb.go b/internal/testprotos/test/test_import.pb.go
index 170ac51..948ba78 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -66,6 +66,7 @@
 }
 
 type ImportMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -81,10 +82,18 @@
 func (*ImportMessage) ProtoMessage() {}
 
 func (x *ImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_import_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_import_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *ImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_import_proto_msgTypes[0].Methods()
 }
 
@@ -143,8 +152,10 @@
 		file_test_test_import_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ImportMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/test_public.pb.go b/internal/testprotos/test/test_public.pb.go
index 01037d5..edef5f9 100644
--- a/internal/testprotos/test/test_public.pb.go
+++ b/internal/testprotos/test/test_public.pb.go
@@ -18,6 +18,7 @@
 )
 
 type PublicImportMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -33,10 +34,18 @@
 func (*PublicImportMessage) ProtoMessage() {}
 
 func (x *PublicImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_test_public_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_test_public_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *PublicImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *PublicImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_test_public_proto_msgTypes[0].Methods()
 }
 
@@ -91,8 +100,10 @@
 		file_test_test_public_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*PublicImportMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test/weak/test_weak.pb.go b/internal/testprotos/test/weak/test_weak.pb.go
index 23c4c6b..365e22b 100644
--- a/internal/testprotos/test/weak/test_weak.pb.go
+++ b/internal/testprotos/test/weak/test_weak.pb.go
@@ -18,6 +18,7 @@
 )
 
 type WeakImportMessage struct {
+	state         protoimpl.MessageState
 	A             *int32 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -34,10 +35,18 @@
 func (*WeakImportMessage) ProtoMessage() {}
 
 func (x *WeakImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test_weak_test_weak_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_weak_test_weak_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *WeakImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *WeakImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test_weak_test_weak_proto_msgTypes[0].Methods()
 }
 
@@ -100,9 +109,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_test_weak_test_weak_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*WeakImportMessage); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test3/test.pb.go b/internal/testprotos/test3/test.pb.go
index 480baea..11b752b 100644
--- a/internal/testprotos/test3/test.pb.go
+++ b/internal/testprotos/test3/test.pb.go
@@ -111,6 +111,7 @@
 }
 
 type TestAllTypes struct {
+	state                  protoimpl.MessageState
 	OptionalInt32          int32                                  `protobuf:"varint,1,opt,name=optional_int32,json=optionalInt32,proto3" json:"optional_int32,omitempty"`
 	OptionalInt64          int64                                  `protobuf:"varint,2,opt,name=optional_int64,json=optionalInt64,proto3" json:"optional_int64,omitempty"`
 	OptionalUint32         uint32                                 `protobuf:"varint,3,opt,name=optional_uint32,json=optionalUint32,proto3" json:"optional_uint32,omitempty"`
@@ -196,10 +197,18 @@
 func (*TestAllTypes) ProtoMessage() {}
 
 func (x *TestAllTypes) ProtoReflect() protoreflect.Message {
-	return file_test3_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test3_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes) XXX_Methods() *protoiface.Methods {
 	return file_test3_test_proto_msgTypes[0].Methods()
 }
 
@@ -750,6 +759,7 @@
 func (*TestAllTypes_OneofEnum) isTestAllTypes_OneofField() {}
 
 type ForeignMessage struct {
+	state         protoimpl.MessageState
 	C             int32 `protobuf:"varint,1,opt,name=c,proto3" json:"c,omitempty"`
 	D             int32 `protobuf:"varint,2,opt,name=d,proto3" json:"d,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -767,10 +777,18 @@
 func (*ForeignMessage) ProtoMessage() {}
 
 func (x *ForeignMessage) ProtoReflect() protoreflect.Message {
-	return file_test3_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_test3_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ForeignMessage) XXX_Methods() *protoiface.Methods {
+func (x *ForeignMessage) XXX_Methods() *protoiface.Methods {
 	return file_test3_test_proto_msgTypes[1].Methods()
 }
 
@@ -794,6 +812,7 @@
 }
 
 type TestAllTypes_NestedMessage struct {
+	state         protoimpl.MessageState
 	A             int32         `protobuf:"varint,1,opt,name=a,proto3" json:"a,omitempty"`
 	Corecursive   *TestAllTypes `protobuf:"bytes,2,opt,name=corecursive,proto3" json:"corecursive,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -811,10 +830,18 @@
 func (*TestAllTypes_NestedMessage) ProtoMessage() {}
 
 func (x *TestAllTypes_NestedMessage) ProtoReflect() protoreflect.Message {
-	return file_test3_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_test3_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
+func (x *TestAllTypes_NestedMessage) XXX_Methods() *protoiface.Methods {
 	return file_test3_test_proto_msgTypes[2].Methods()
 }
 
@@ -1322,9 +1349,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_test3_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes); i {
-			case 60:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 61:
+				return &v.sizeCache
+			case 62:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1332,9 +1361,11 @@
 		}
 		file_test3_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ForeignMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -1342,9 +1373,11 @@
 		}
 		file_test3_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TestAllTypes_NestedMessage); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/internal/testprotos/test3/test_import.pb.go b/internal/testprotos/test3/test_import.pb.go
index 9347d75..619d959 100644
--- a/internal/testprotos/test3/test_import.pb.go
+++ b/internal/testprotos/test3/test_import.pb.go
@@ -56,6 +56,7 @@
 }
 
 type ImportMessage struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -71,10 +72,18 @@
 func (*ImportMessage) ProtoMessage() {}
 
 func (x *ImportMessage) ProtoReflect() protoreflect.Message {
-	return file_test3_test_import_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test3_test_import_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ImportMessage) XXX_Methods() *protoiface.Methods {
+func (x *ImportMessage) XXX_Methods() *protoiface.Methods {
 	return file_test3_test_import_proto_msgTypes[0].Methods()
 }
 
@@ -133,8 +142,10 @@
 		file_test3_test_import_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ImportMessage); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/reflect/protoregistry/testprotos/test.pb.go b/reflect/protoregistry/testprotos/test.pb.go
index 945d1a4..c6ea2fd 100644
--- a/reflect/protoregistry/testprotos/test.pb.go
+++ b/reflect/protoregistry/testprotos/test.pb.go
@@ -160,6 +160,7 @@
 }
 
 type Message1 struct {
+	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
@@ -176,10 +177,18 @@
 func (*Message1) ProtoMessage() {}
 
 func (x *Message1) ProtoReflect() protoreflect.Message {
-	return file_test_proto_msgTypes[0].MessageOf(x)
+	mi := &file_test_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message1) XXX_Methods() *protoiface.Methods {
+func (x *Message1) XXX_Methods() *protoiface.Methods {
 	return file_test_proto_msgTypes[0].Methods()
 }
 
@@ -198,6 +207,7 @@
 }
 
 type Message2 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -213,10 +223,18 @@
 func (*Message2) ProtoMessage() {}
 
 func (x *Message2) ProtoReflect() protoreflect.Message {
-	return file_test_proto_msgTypes[1].MessageOf(x)
+	mi := &file_test_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message2) XXX_Methods() *protoiface.Methods {
+func (x *Message2) XXX_Methods() *protoiface.Methods {
 	return file_test_proto_msgTypes[1].Methods()
 }
 
@@ -226,6 +244,7 @@
 }
 
 type Message3 struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -241,10 +260,18 @@
 func (*Message3) ProtoMessage() {}
 
 func (x *Message3) ProtoReflect() protoreflect.Message {
-	return file_test_proto_msgTypes[2].MessageOf(x)
+	mi := &file_test_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message3) XXX_Methods() *protoiface.Methods {
+func (x *Message3) XXX_Methods() *protoiface.Methods {
 	return file_test_proto_msgTypes[2].Methods()
 }
 
@@ -254,6 +281,7 @@
 }
 
 type Message4 struct {
+	state         protoimpl.MessageState
 	BoolField     *bool `protobuf:"varint,30,opt,name=bool_field,json=boolField" json:"bool_field,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -270,10 +298,18 @@
 func (*Message4) ProtoMessage() {}
 
 func (x *Message4) ProtoReflect() protoreflect.Message {
-	return file_test_proto_msgTypes[3].MessageOf(x)
+	mi := &file_test_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Message4) XXX_Methods() *protoiface.Methods {
+func (x *Message4) XXX_Methods() *protoiface.Methods {
 	return file_test_proto_msgTypes[3].Methods()
 }
 
@@ -454,10 +490,12 @@
 		file_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message1); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 2:
+				return &v.unknownFields
+			case 3:
 				return &v.extensionFields
 			default:
 				return nil
@@ -466,8 +504,10 @@
 		file_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message2); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -476,8 +516,10 @@
 		file_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message3); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
@@ -485,9 +527,11 @@
 		}
 		file_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Message4); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/runtime/protoimpl/impl.go b/runtime/protoimpl/impl.go
index e4e6c11..346a5d0 100644
--- a/runtime/protoimpl/impl.go
+++ b/runtime/protoimpl/impl.go
@@ -64,7 +64,9 @@
 
 	DescBuilder      = filedesc.DescBuilder
 	TypeBuilder      = filetype.TypeBuilder
+	Pointer          = impl.Pointer
 	MessageInfo      = impl.MessageInfo
+	MessageState     = impl.MessageState
 	SizeCache        = impl.SizeCache
 	UnknownFields    = impl.UnknownFields
 	ExtensionFields  = impl.ExtensionFields
diff --git a/types/descriptorpb/descriptor.pb.go b/types/descriptorpb/descriptor.pb.go
index e27b44e..abdc776 100644
--- a/types/descriptorpb/descriptor.pb.go
+++ b/types/descriptorpb/descriptor.pb.go
@@ -405,6 +405,7 @@
 // The protocol compiler can output a FileDescriptorSet containing the .proto
 // files it parses.
 type FileDescriptorSet struct {
+	state         protoimpl.MessageState
 	File          []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"`
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -421,10 +422,18 @@
 func (*FileDescriptorSet) ProtoMessage() {}
 
 func (x *FileDescriptorSet) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FileDescriptorSet) XXX_Methods() *protoiface.Methods {
+func (x *FileDescriptorSet) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[0].Methods()
 }
 
@@ -442,6 +451,7 @@
 
 // Describes a complete .proto file.
 type FileDescriptorProto struct {
+	state   protoimpl.MessageState
 	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.
@@ -480,10 +490,18 @@
 func (*FileDescriptorProto) ProtoMessage() {}
 
 func (x *FileDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FileDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *FileDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[1].Methods()
 }
 
@@ -578,6 +596,7 @@
 
 // Describes a message type.
 type DescriptorProto struct {
+	state          protoimpl.MessageState
 	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"`
@@ -605,10 +624,18 @@
 func (*DescriptorProto) ProtoMessage() {}
 
 func (x *DescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *DescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *DescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[2].Methods()
 }
 
@@ -688,6 +715,7 @@
 }
 
 type ExtensionRangeOptions struct {
+	state protoimpl.MessageState
 	// 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"`
 	sizeCache           protoimpl.SizeCache
@@ -706,10 +734,18 @@
 func (*ExtensionRangeOptions) ProtoMessage() {}
 
 func (x *ExtensionRangeOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[3].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ExtensionRangeOptions) XXX_Methods() *protoiface.Methods {
+func (x *ExtensionRangeOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[3].Methods()
 }
 
@@ -736,6 +772,7 @@
 
 // Describes a field within a message.
 type FieldDescriptorProto struct {
+	state  protoimpl.MessageState
 	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"`
@@ -781,10 +818,18 @@
 func (*FieldDescriptorProto) ProtoMessage() {}
 
 func (x *FieldDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[4].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *FieldDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[4].Methods()
 }
 
@@ -865,6 +910,7 @@
 
 // Describes a oneof.
 type OneofDescriptorProto struct {
+	state         protoimpl.MessageState
 	Name          *string       `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
 	Options       *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -882,10 +928,18 @@
 func (*OneofDescriptorProto) ProtoMessage() {}
 
 func (x *OneofDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[5].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *OneofDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *OneofDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[5].Methods()
 }
 
@@ -910,6 +964,7 @@
 
 // Describes an enum type.
 type EnumDescriptorProto struct {
+	state   protoimpl.MessageState
 	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"`
@@ -935,10 +990,18 @@
 func (*EnumDescriptorProto) ProtoMessage() {}
 
 func (x *EnumDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[6].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *EnumDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[6].Methods()
 }
 
@@ -984,6 +1047,7 @@
 
 // Describes a value within an enum.
 type EnumValueDescriptorProto struct {
+	state         protoimpl.MessageState
 	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"`
@@ -1002,10 +1066,18 @@
 func (*EnumValueDescriptorProto) ProtoMessage() {}
 
 func (x *EnumValueDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[7].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumValueDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *EnumValueDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[7].Methods()
 }
 
@@ -1037,6 +1109,7 @@
 
 // Describes a service.
 type ServiceDescriptorProto struct {
+	state         protoimpl.MessageState
 	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"`
@@ -1055,10 +1128,18 @@
 func (*ServiceDescriptorProto) ProtoMessage() {}
 
 func (x *ServiceDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[8].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ServiceDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *ServiceDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[8].Methods()
 }
 
@@ -1090,7 +1171,8 @@
 
 // Describes a method of a service.
 type MethodDescriptorProto struct {
-	Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	state protoimpl.MessageState
+	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"`
@@ -1115,10 +1197,18 @@
 func (*MethodDescriptorProto) ProtoMessage() {}
 
 func (x *MethodDescriptorProto) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[9].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MethodDescriptorProto) XXX_Methods() *protoiface.Methods {
+func (x *MethodDescriptorProto) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[9].Methods()
 }
 
@@ -1173,6 +1263,7 @@
 }
 
 type FileOptions struct {
+	state protoimpl.MessageState
 	// 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
@@ -1273,10 +1364,18 @@
 func (*FileOptions) ProtoMessage() {}
 
 func (x *FileOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[10].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FileOptions) XXX_Methods() *protoiface.Methods {
+func (x *FileOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[10].Methods()
 }
 
@@ -1453,6 +1552,7 @@
 }
 
 type MessageOptions struct {
+	state protoimpl.MessageState
 	// 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
@@ -1521,10 +1621,18 @@
 func (*MessageOptions) ProtoMessage() {}
 
 func (x *MessageOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[11].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MessageOptions) XXX_Methods() *protoiface.Methods {
+func (x *MessageOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[11].Methods()
 }
 
@@ -1582,6 +1690,7 @@
 }
 
 type FieldOptions struct {
+	state protoimpl.MessageState
 	// 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
@@ -1659,10 +1768,18 @@
 func (*FieldOptions) ProtoMessage() {}
 
 func (x *FieldOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[12].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldOptions) XXX_Methods() *protoiface.Methods {
+func (x *FieldOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[12].Methods()
 }
 
@@ -1736,6 +1853,7 @@
 }
 
 type OneofOptions struct {
+	state protoimpl.MessageState
 	// 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"`
 	sizeCache           protoimpl.SizeCache
@@ -1754,10 +1872,18 @@
 func (*OneofOptions) ProtoMessage() {}
 
 func (x *OneofOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[13].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *OneofOptions) XXX_Methods() *protoiface.Methods {
+func (x *OneofOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[13].Methods()
 }
 
@@ -1783,6 +1909,7 @@
 }
 
 type EnumOptions struct {
+	state protoimpl.MessageState
 	// 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"`
@@ -1809,10 +1936,18 @@
 func (*EnumOptions) ProtoMessage() {}
 
 func (x *EnumOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[14].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumOptions) XXX_Methods() *protoiface.Methods {
+func (x *EnumOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[14].Methods()
 }
 
@@ -1854,6 +1989,7 @@
 }
 
 type EnumValueOptions struct {
+	state protoimpl.MessageState
 	// 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,
@@ -1877,10 +2013,18 @@
 func (*EnumValueOptions) ProtoMessage() {}
 
 func (x *EnumValueOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[15].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumValueOptions) XXX_Methods() *protoiface.Methods {
+func (x *EnumValueOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[15].Methods()
 }
 
@@ -1915,6 +2059,7 @@
 }
 
 type ServiceOptions struct {
+	state protoimpl.MessageState
 	// 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,
@@ -1938,10 +2083,18 @@
 func (*ServiceOptions) ProtoMessage() {}
 
 func (x *ServiceOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[16].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ServiceOptions) XXX_Methods() *protoiface.Methods {
+func (x *ServiceOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[16].Methods()
 }
 
@@ -1976,6 +2129,7 @@
 }
 
 type MethodOptions struct {
+	state protoimpl.MessageState
 	// 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,
@@ -2000,10 +2154,18 @@
 func (*MethodOptions) ProtoMessage() {}
 
 func (x *MethodOptions) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[17].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *MethodOptions) XXX_Methods() *protoiface.Methods {
+func (x *MethodOptions) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[17].Methods()
 }
 
@@ -2052,7 +2214,8 @@
 // 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"`
+	state protoimpl.MessageState
+	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"`
@@ -2076,10 +2239,18 @@
 func (*UninterpretedOption) ProtoMessage() {}
 
 func (x *UninterpretedOption) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[18].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UninterpretedOption) XXX_Methods() *protoiface.Methods {
+func (x *UninterpretedOption) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[18].Methods()
 }
 
@@ -2140,6 +2311,7 @@
 // Encapsulates information about the original source file from which a
 // FileDescriptorProto was generated.
 type SourceCodeInfo struct {
+	state protoimpl.MessageState
 	// 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
@@ -2199,10 +2371,18 @@
 func (*SourceCodeInfo) ProtoMessage() {}
 
 func (x *SourceCodeInfo) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[19].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *SourceCodeInfo) XXX_Methods() *protoiface.Methods {
+func (x *SourceCodeInfo) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[19].Methods()
 }
 
@@ -2222,6 +2402,7 @@
 // file. A GeneratedCodeInfo message is associated with only one generated
 // source file, but may contain references to different source .proto files.
 type GeneratedCodeInfo struct {
+	state protoimpl.MessageState
 	// 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"`
@@ -2240,10 +2421,18 @@
 func (*GeneratedCodeInfo) ProtoMessage() {}
 
 func (x *GeneratedCodeInfo) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[20].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GeneratedCodeInfo) XXX_Methods() *protoiface.Methods {
+func (x *GeneratedCodeInfo) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[20].Methods()
 }
 
@@ -2260,6 +2449,7 @@
 }
 
 type DescriptorProto_ExtensionRange struct {
+	state         protoimpl.MessageState
 	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"`
@@ -2278,10 +2468,18 @@
 func (*DescriptorProto_ExtensionRange) ProtoMessage() {}
 
 func (x *DescriptorProto_ExtensionRange) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[21].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *DescriptorProto_ExtensionRange) XXX_Methods() *protoiface.Methods {
+func (x *DescriptorProto_ExtensionRange) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[21].Methods()
 }
 
@@ -2315,6 +2513,7 @@
 // fields or extension ranges in the same message. Reserved ranges may
 // not overlap.
 type DescriptorProto_ReservedRange struct {
+	state         protoimpl.MessageState
 	Start         *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
 	End           *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2332,10 +2531,18 @@
 func (*DescriptorProto_ReservedRange) ProtoMessage() {}
 
 func (x *DescriptorProto_ReservedRange) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[22].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *DescriptorProto_ReservedRange) XXX_Methods() *protoiface.Methods {
+func (x *DescriptorProto_ReservedRange) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[22].Methods()
 }
 
@@ -2365,6 +2572,7 @@
 // is inclusive such that it can appropriately represent the entire int32
 // domain.
 type EnumDescriptorProto_EnumReservedRange struct {
+	state         protoimpl.MessageState
 	Start         *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"`
 	End           *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -2382,10 +2590,18 @@
 func (*EnumDescriptorProto_EnumReservedRange) ProtoMessage() {}
 
 func (x *EnumDescriptorProto_EnumReservedRange) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[23].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[23]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumDescriptorProto_EnumReservedRange) XXX_Methods() *protoiface.Methods {
+func (x *EnumDescriptorProto_EnumReservedRange) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[23].Methods()
 }
 
@@ -2414,6 +2630,7 @@
 // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
 // "foo.(bar.baz).qux".
 type UninterpretedOption_NamePart struct {
+	state         protoimpl.MessageState
 	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"`
 	sizeCache     protoimpl.SizeCache
@@ -2431,10 +2648,18 @@
 func (*UninterpretedOption_NamePart) ProtoMessage() {}
 
 func (x *UninterpretedOption_NamePart) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[24].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UninterpretedOption_NamePart) XXX_Methods() *protoiface.Methods {
+func (x *UninterpretedOption_NamePart) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[24].Methods()
 }
 
@@ -2458,6 +2683,7 @@
 }
 
 type SourceCodeInfo_Location struct {
+	state protoimpl.MessageState
 	// Identifies which part of the FileDescriptorProto was defined at this
 	// location.
 	//
@@ -2553,10 +2779,18 @@
 func (*SourceCodeInfo_Location) ProtoMessage() {}
 
 func (x *SourceCodeInfo_Location) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[25].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *SourceCodeInfo_Location) XXX_Methods() *protoiface.Methods {
+func (x *SourceCodeInfo_Location) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[25].Methods()
 }
 
@@ -2601,6 +2835,7 @@
 }
 
 type GeneratedCodeInfo_Annotation struct {
+	state protoimpl.MessageState
 	// 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"`
@@ -2628,10 +2863,18 @@
 func (*GeneratedCodeInfo_Annotation) ProtoMessage() {}
 
 func (x *GeneratedCodeInfo_Annotation) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_descriptor_proto_msgTypes[26].MessageOf(x)
+	mi := &file_google_protobuf_descriptor_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *GeneratedCodeInfo_Annotation) XXX_Methods() *protoiface.Methods {
+func (x *GeneratedCodeInfo_Annotation) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_descriptor_proto_msgTypes[26].Methods()
 }
 
@@ -3254,9 +3497,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_descriptor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FileDescriptorSet); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3264,9 +3509,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FileDescriptorProto); i {
-			case 12:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 13:
+				return &v.sizeCache
+			case 14:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3274,9 +3521,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DescriptorProto); i {
-			case 10:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 11:
+				return &v.sizeCache
+			case 12:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3284,11 +3533,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ExtensionRangeOptions); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 3:
+				return &v.unknownFields
+			case 4:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3296,9 +3547,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldDescriptorProto); i {
-			case 10:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 11:
+				return &v.sizeCache
+			case 12:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3306,9 +3559,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*OneofDescriptorProto); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3316,9 +3571,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumDescriptorProto); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3326,9 +3583,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumValueDescriptorProto); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3336,9 +3595,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ServiceDescriptorProto); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3346,9 +3607,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MethodDescriptorProto); i {
-			case 6:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 7:
+				return &v.sizeCache
+			case 8:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3356,11 +3619,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FileOptions); i {
-			case 21:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 22:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 23:
+				return &v.unknownFields
+			case 24:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3368,11 +3633,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MessageOptions); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 7:
+				return &v.unknownFields
+			case 8:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3380,11 +3647,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldOptions); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 9:
+				return &v.unknownFields
+			case 10:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3392,11 +3661,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*OneofOptions); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 3:
+				return &v.unknownFields
+			case 4:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3404,11 +3675,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumOptions); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 5:
+				return &v.unknownFields
+			case 6:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3416,11 +3689,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumValueOptions); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 4:
+				return &v.unknownFields
+			case 5:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3428,11 +3703,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ServiceOptions); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 4:
+				return &v.unknownFields
+			case 5:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3440,11 +3717,13 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MethodOptions); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
-				return &v.unknownFields
+				return &v.sizeCache
 			case 5:
+				return &v.unknownFields
+			case 6:
 				return &v.extensionFields
 			default:
 				return nil
@@ -3452,9 +3731,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UninterpretedOption); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3462,9 +3743,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*SourceCodeInfo); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3472,9 +3755,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GeneratedCodeInfo); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3482,9 +3767,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DescriptorProto_ExtensionRange); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3492,9 +3779,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DescriptorProto_ReservedRange); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3502,9 +3791,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumDescriptorProto_EnumReservedRange); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3512,9 +3803,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UninterpretedOption_NamePart); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3522,9 +3815,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*SourceCodeInfo_Location); i {
-			case 5:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 6:
+				return &v.sizeCache
+			case 7:
 				return &v.unknownFields
 			default:
 				return nil
@@ -3532,9 +3827,11 @@
 		}
 		file_google_protobuf_descriptor_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*GeneratedCodeInfo_Annotation); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/anypb/any.pb.go b/types/known/anypb/any.pb.go
index 41a3e9a..595b70f 100644
--- a/types/known/anypb/any.pb.go
+++ b/types/known/anypb/any.pb.go
@@ -98,6 +98,7 @@
 //     }
 //
 type Any struct {
+	state protoimpl.MessageState
 	// A URL/resource name that uniquely identifies the type of the serialized
 	// protocol buffer message. This string must contain at least
 	// one "/" character. The last segment of the URL's path must represent
@@ -144,10 +145,18 @@
 func (*Any) ProtoMessage() {}
 
 func (x *Any) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_any_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_any_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Any) XXX_Methods() *protoiface.Methods {
+func (x *Any) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_any_proto_msgTypes[0].Methods()
 }
 
@@ -222,9 +231,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_any_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Any); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/apipb/api.pb.go b/types/known/apipb/api.pb.go
index b0d4128..9bc70e1 100644
--- a/types/known/apipb/api.pb.go
+++ b/types/known/apipb/api.pb.go
@@ -29,6 +29,7 @@
 // this message itself. See https://cloud.google.com/apis/design/glossary for
 // detailed terminology.
 type Api struct {
+	state protoimpl.MessageState
 	// The fully qualified name of this interface, including package name
 	// followed by the interface's simple name.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
@@ -80,10 +81,18 @@
 func (*Api) ProtoMessage() {}
 
 func (x *Api) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_api_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_api_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Api) XXX_Methods() *protoiface.Methods {
+func (x *Api) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_api_proto_msgTypes[0].Methods()
 }
 
@@ -143,6 +152,7 @@
 
 // Method represents a method of an API interface.
 type Method struct {
+	state protoimpl.MessageState
 	// The simple name of this method.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// A URL of the input message type.
@@ -172,10 +182,18 @@
 func (*Method) ProtoMessage() {}
 
 func (x *Method) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_api_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_api_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Method) XXX_Methods() *protoiface.Methods {
+func (x *Method) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_api_proto_msgTypes[1].Methods()
 }
 
@@ -312,6 +330,7 @@
 //       ...
 //     }
 type Mixin struct {
+	state protoimpl.MessageState
 	// The fully qualified name of the interface which is included.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// If non-empty specifies a path under which inherited HTTP paths
@@ -332,10 +351,18 @@
 func (*Mixin) ProtoMessage() {}
 
 func (x *Mixin) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_api_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_api_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Mixin) XXX_Methods() *protoiface.Methods {
+func (x *Mixin) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_api_proto_msgTypes[2].Methods()
 }
 
@@ -465,9 +492,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Api); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -475,9 +504,11 @@
 		}
 		file_google_protobuf_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Method); i {
-			case 7:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 8:
+				return &v.sizeCache
+			case 9:
 				return &v.unknownFields
 			default:
 				return nil
@@ -485,9 +516,11 @@
 		}
 		file_google_protobuf_api_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Mixin); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/durationpb/duration.pb.go b/types/known/durationpb/duration.pb.go
index 20043ee..de6d461 100644
--- a/types/known/durationpb/duration.pb.go
+++ b/types/known/durationpb/duration.pb.go
@@ -78,6 +78,7 @@
 //
 //
 type Duration struct {
+	state protoimpl.MessageState
 	// Signed seconds of the span of time. Must be from -315,576,000,000
 	// to +315,576,000,000 inclusive. Note: these bounds are computed from:
 	// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
@@ -104,10 +105,18 @@
 func (*Duration) ProtoMessage() {}
 
 func (x *Duration) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_duration_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_duration_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Duration) XXX_Methods() *protoiface.Methods {
+func (x *Duration) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_duration_proto_msgTypes[0].Methods()
 }
 
@@ -183,9 +192,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_duration_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Duration); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/emptypb/empty.pb.go b/types/known/emptypb/empty.pb.go
index a6aabb7..4558682 100644
--- a/types/known/emptypb/empty.pb.go
+++ b/types/known/emptypb/empty.pb.go
@@ -27,6 +27,7 @@
 //
 // The JSON representation for `Empty` is empty JSON object `{}`.
 type Empty struct {
+	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 }
@@ -42,10 +43,18 @@
 func (*Empty) ProtoMessage() {}
 
 func (x *Empty) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_empty_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_empty_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Empty) XXX_Methods() *protoiface.Methods {
+func (x *Empty) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_empty_proto_msgTypes[0].Methods()
 }
 
@@ -104,8 +113,10 @@
 		file_google_protobuf_empty_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Empty); i {
 			case 0:
-				return &v.sizeCache
+				return &v.state
 			case 1:
+				return &v.sizeCache
+			case 2:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/fieldmaskpb/field_mask.pb.go b/types/known/fieldmaskpb/field_mask.pb.go
index 1b72928..cb7b45e 100644
--- a/types/known/fieldmaskpb/field_mask.pb.go
+++ b/types/known/fieldmaskpb/field_mask.pb.go
@@ -217,6 +217,7 @@
 // request should verify the included field paths, and return an
 // `INVALID_ARGUMENT` error if any path is duplicated or unmappable.
 type FieldMask struct {
+	state protoimpl.MessageState
 	// The set of field mask paths.
 	Paths         []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -234,10 +235,18 @@
 func (*FieldMask) ProtoMessage() {}
 
 func (x *FieldMask) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_field_mask_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_field_mask_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FieldMask) XXX_Methods() *protoiface.Methods {
+func (x *FieldMask) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_field_mask_proto_msgTypes[0].Methods()
 }
 
@@ -305,9 +314,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_field_mask_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FieldMask); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/sourcecontextpb/source_context.pb.go b/types/known/sourcecontextpb/source_context.pb.go
index 016fafd..e482879 100644
--- a/types/known/sourcecontextpb/source_context.pb.go
+++ b/types/known/sourcecontextpb/source_context.pb.go
@@ -20,6 +20,7 @@
 // `SourceContext` represents information about the source of a
 // protobuf element, like the file in which it is defined.
 type SourceContext struct {
+	state protoimpl.MessageState
 	// The path-qualified name of the .proto file that contained the associated
 	// protobuf element.  For example: `"google/protobuf/source_context.proto"`.
 	FileName      string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
@@ -38,10 +39,18 @@
 func (*SourceContext) ProtoMessage() {}
 
 func (x *SourceContext) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_source_context_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_source_context_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *SourceContext) XXX_Methods() *protoiface.Methods {
+func (x *SourceContext) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_source_context_proto_msgTypes[0].Methods()
 }
 
@@ -110,9 +119,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_source_context_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*SourceContext); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/structpb/struct.pb.go b/types/known/structpb/struct.pb.go
index 84a3434..cc19871 100644
--- a/types/known/structpb/struct.pb.go
+++ b/types/known/structpb/struct.pb.go
@@ -69,6 +69,7 @@
 //
 // The JSON representation for `Struct` is JSON object.
 type Struct struct {
+	state protoimpl.MessageState
 	// Unordered map of dynamically typed values.
 	Fields        map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	sizeCache     protoimpl.SizeCache
@@ -86,10 +87,18 @@
 func (*Struct) ProtoMessage() {}
 
 func (x *Struct) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_struct_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_struct_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Struct) XXX_Methods() *protoiface.Methods {
+func (x *Struct) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_struct_proto_msgTypes[0].Methods()
 }
 
@@ -112,6 +121,7 @@
 //
 // The JSON representation for `Value` is JSON value.
 type Value struct {
+	state protoimpl.MessageState
 	// The kind of value.
 	//
 	// Types that are valid to be assigned to Kind:
@@ -143,10 +153,18 @@
 func (*Value) ProtoMessage() {}
 
 func (x *Value) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_struct_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_struct_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Value) XXX_Methods() *protoiface.Methods {
+func (x *Value) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_struct_proto_msgTypes[1].Methods()
 }
 
@@ -248,6 +266,7 @@
 //
 // The JSON representation for `ListValue` is JSON array.
 type ListValue struct {
+	state protoimpl.MessageState
 	// Repeated field of dynamically typed values.
 	Values        []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -265,10 +284,18 @@
 func (*ListValue) ProtoMessage() {}
 
 func (x *ListValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_struct_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_struct_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *ListValue) XXX_Methods() *protoiface.Methods {
+func (x *ListValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_struct_proto_msgTypes[2].Methods()
 }
 
@@ -379,9 +406,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_struct_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Struct); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -389,9 +418,11 @@
 		}
 		file_google_protobuf_struct_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Value); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -399,9 +430,11 @@
 		}
 		file_google_protobuf_struct_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*ListValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/timestamppb/timestamp.pb.go b/types/known/timestamppb/timestamp.pb.go
index 62f6f6c..3ade4ba 100644
--- a/types/known/timestamppb/timestamp.pb.go
+++ b/types/known/timestamppb/timestamp.pb.go
@@ -100,6 +100,7 @@
 //
 //
 type Timestamp struct {
+	state protoimpl.MessageState
 	// Represents seconds of UTC time since Unix epoch
 	// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
 	// 9999-12-31T23:59:59Z inclusive.
@@ -124,10 +125,18 @@
 func (*Timestamp) ProtoMessage() {}
 
 func (x *Timestamp) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_timestamp_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_timestamp_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Timestamp) XXX_Methods() *protoiface.Methods {
+func (x *Timestamp) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_timestamp_proto_msgTypes[0].Methods()
 }
 
@@ -203,9 +212,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_timestamp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Timestamp); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/typepb/type.pb.go b/types/known/typepb/type.pb.go
index bc350d3..4a37caf 100644
--- a/types/known/typepb/type.pb.go
+++ b/types/known/typepb/type.pb.go
@@ -227,6 +227,7 @@
 
 // A protocol buffer message type.
 type Type struct {
+	state protoimpl.MessageState
 	// The fully qualified message name.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// The list of fields.
@@ -254,10 +255,18 @@
 func (*Type) ProtoMessage() {}
 
 func (x *Type) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_type_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_type_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Type) XXX_Methods() *protoiface.Methods {
+func (x *Type) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_type_proto_msgTypes[0].Methods()
 }
 
@@ -310,6 +319,7 @@
 
 // A single field of a message type.
 type Field struct {
+	state protoimpl.MessageState
 	// The field type.
 	Kind Field_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=google.protobuf.Field_Kind" json:"kind,omitempty"`
 	// The field cardinality.
@@ -347,10 +357,18 @@
 func (*Field) ProtoMessage() {}
 
 func (x *Field) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_type_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_type_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Field) XXX_Methods() *protoiface.Methods {
+func (x *Field) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_type_proto_msgTypes[1].Methods()
 }
 
@@ -431,6 +449,7 @@
 
 // Enum type definition.
 type Enum struct {
+	state protoimpl.MessageState
 	// Enum type name.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Enum value definitions.
@@ -456,10 +475,18 @@
 func (*Enum) ProtoMessage() {}
 
 func (x *Enum) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_type_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_type_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Enum) XXX_Methods() *protoiface.Methods {
+func (x *Enum) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_type_proto_msgTypes[2].Methods()
 }
 
@@ -505,6 +532,7 @@
 
 // Enum value definition.
 type EnumValue struct {
+	state protoimpl.MessageState
 	// Enum value name.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Enum value number.
@@ -526,10 +554,18 @@
 func (*EnumValue) ProtoMessage() {}
 
 func (x *EnumValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_type_proto_msgTypes[3].MessageOf(x)
+	mi := &file_google_protobuf_type_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *EnumValue) XXX_Methods() *protoiface.Methods {
+func (x *EnumValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_type_proto_msgTypes[3].Methods()
 }
 
@@ -562,6 +598,7 @@
 // A protocol buffer option, which can be attached to a message, field,
 // enumeration, etc.
 type Option struct {
+	state protoimpl.MessageState
 	// The option's name. For protobuf built-in options (options defined in
 	// descriptor.proto), this is the short name. For example, `"map_entry"`.
 	// For custom options, it should be the fully-qualified name. For example,
@@ -587,10 +624,18 @@
 func (*Option) ProtoMessage() {}
 
 func (x *Option) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_type_proto_msgTypes[4].MessageOf(x)
+	mi := &file_google_protobuf_type_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Option) XXX_Methods() *protoiface.Methods {
+func (x *Option) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_type_proto_msgTypes[4].Methods()
 }
 
@@ -788,6 +833,32 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Type); i {
+			case 0:
+				return &v.state
+			case 7:
+				return &v.sizeCache
+			case 8:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_protobuf_type_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Field); i {
+			case 0:
+				return &v.state
+			case 11:
+				return &v.sizeCache
+			case 12:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_google_protobuf_type_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Enum); i {
+			case 0:
+				return &v.state
 			case 6:
 				return &v.sizeCache
 			case 7:
@@ -796,31 +867,13 @@
 				return nil
 			}
 		}
-		file_google_protobuf_type_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Field); i {
-			case 10:
-				return &v.sizeCache
-			case 11:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_google_protobuf_type_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Enum); i {
-			case 5:
-				return &v.sizeCache
-			case 6:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
 		file_google_protobuf_type_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*EnumValue); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
@@ -828,9 +881,11 @@
 		}
 		file_google_protobuf_type_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Option); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/known/wrapperspb/wrappers.pb.go b/types/known/wrapperspb/wrappers.pb.go
index 20ca470..846cd59 100644
--- a/types/known/wrapperspb/wrappers.pb.go
+++ b/types/known/wrapperspb/wrappers.pb.go
@@ -21,6 +21,7 @@
 //
 // The JSON representation for `DoubleValue` is JSON number.
 type DoubleValue struct {
+	state protoimpl.MessageState
 	// The double value.
 	Value         float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -38,10 +39,18 @@
 func (*DoubleValue) ProtoMessage() {}
 
 func (x *DoubleValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *DoubleValue) XXX_Methods() *protoiface.Methods {
+func (x *DoubleValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[0].Methods()
 }
 
@@ -61,6 +70,7 @@
 //
 // The JSON representation for `FloatValue` is JSON number.
 type FloatValue struct {
+	state protoimpl.MessageState
 	// The float value.
 	Value         float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -78,10 +88,18 @@
 func (*FloatValue) ProtoMessage() {}
 
 func (x *FloatValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *FloatValue) XXX_Methods() *protoiface.Methods {
+func (x *FloatValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[1].Methods()
 }
 
@@ -101,6 +119,7 @@
 //
 // The JSON representation for `Int64Value` is JSON string.
 type Int64Value struct {
+	state protoimpl.MessageState
 	// The int64 value.
 	Value         int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -118,10 +137,18 @@
 func (*Int64Value) ProtoMessage() {}
 
 func (x *Int64Value) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Int64Value) XXX_Methods() *protoiface.Methods {
+func (x *Int64Value) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[2].Methods()
 }
 
@@ -141,6 +168,7 @@
 //
 // The JSON representation for `UInt64Value` is JSON string.
 type UInt64Value struct {
+	state protoimpl.MessageState
 	// The uint64 value.
 	Value         uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -158,10 +186,18 @@
 func (*UInt64Value) ProtoMessage() {}
 
 func (x *UInt64Value) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[3].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UInt64Value) XXX_Methods() *protoiface.Methods {
+func (x *UInt64Value) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[3].Methods()
 }
 
@@ -181,6 +217,7 @@
 //
 // The JSON representation for `Int32Value` is JSON number.
 type Int32Value struct {
+	state protoimpl.MessageState
 	// The int32 value.
 	Value         int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -198,10 +235,18 @@
 func (*Int32Value) ProtoMessage() {}
 
 func (x *Int32Value) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[4].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Int32Value) XXX_Methods() *protoiface.Methods {
+func (x *Int32Value) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[4].Methods()
 }
 
@@ -221,6 +266,7 @@
 //
 // The JSON representation for `UInt32Value` is JSON number.
 type UInt32Value struct {
+	state protoimpl.MessageState
 	// The uint32 value.
 	Value         uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -238,10 +284,18 @@
 func (*UInt32Value) ProtoMessage() {}
 
 func (x *UInt32Value) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[5].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *UInt32Value) XXX_Methods() *protoiface.Methods {
+func (x *UInt32Value) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[5].Methods()
 }
 
@@ -261,6 +315,7 @@
 //
 // The JSON representation for `BoolValue` is JSON `true` and `false`.
 type BoolValue struct {
+	state protoimpl.MessageState
 	// The bool value.
 	Value         bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -278,10 +333,18 @@
 func (*BoolValue) ProtoMessage() {}
 
 func (x *BoolValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[6].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *BoolValue) XXX_Methods() *protoiface.Methods {
+func (x *BoolValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[6].Methods()
 }
 
@@ -301,6 +364,7 @@
 //
 // The JSON representation for `StringValue` is JSON string.
 type StringValue struct {
+	state protoimpl.MessageState
 	// The string value.
 	Value         string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -318,10 +382,18 @@
 func (*StringValue) ProtoMessage() {}
 
 func (x *StringValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[7].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *StringValue) XXX_Methods() *protoiface.Methods {
+func (x *StringValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[7].Methods()
 }
 
@@ -341,6 +413,7 @@
 //
 // The JSON representation for `BytesValue` is JSON string.
 type BytesValue struct {
+	state protoimpl.MessageState
 	// The bytes value.
 	Value         []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
 	sizeCache     protoimpl.SizeCache
@@ -358,10 +431,18 @@
 func (*BytesValue) ProtoMessage() {}
 
 func (x *BytesValue) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_wrappers_proto_msgTypes[8].MessageOf(x)
+	mi := &file_google_protobuf_wrappers_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *BytesValue) XXX_Methods() *protoiface.Methods {
+func (x *BytesValue) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_wrappers_proto_msgTypes[8].Methods()
 }
 
@@ -455,9 +536,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_wrappers_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*DoubleValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -465,9 +548,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*FloatValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -475,9 +560,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Int64Value); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -485,9 +572,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UInt64Value); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -495,9 +584,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Int32Value); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -505,9 +596,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*UInt32Value); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -515,9 +608,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BoolValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -525,9 +620,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*StringValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
@@ -535,9 +632,11 @@
 		}
 		file_google_protobuf_wrappers_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*BytesValue); i {
-			case 1:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 2:
+				return &v.sizeCache
+			case 3:
 				return &v.unknownFields
 			default:
 				return nil
diff --git a/types/pluginpb/plugin.pb.go b/types/pluginpb/plugin.pb.go
index 6a1f738..258574e 100644
--- a/types/pluginpb/plugin.pb.go
+++ b/types/pluginpb/plugin.pb.go
@@ -20,6 +20,7 @@
 
 // The version number of protocol compiler.
 type Version struct {
+	state protoimpl.MessageState
 	Major *int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"`
 	Minor *int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"`
 	Patch *int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"`
@@ -41,10 +42,18 @@
 func (*Version) ProtoMessage() {}
 
 func (x *Version) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_compiler_plugin_proto_msgTypes[0].MessageOf(x)
+	mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *Version) XXX_Methods() *protoiface.Methods {
+func (x *Version) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_compiler_plugin_proto_msgTypes[0].Methods()
 }
 
@@ -83,6 +92,7 @@
 
 // An encoded CodeGeneratorRequest is written to the plugin's stdin.
 type CodeGeneratorRequest struct {
+	state protoimpl.MessageState
 	// The .proto files that were explicitly listed on the command-line.  The
 	// code generator should generate code only for these files.  Each file's
 	// descriptor will be included in proto_file, below.
@@ -121,10 +131,18 @@
 func (*CodeGeneratorRequest) ProtoMessage() {}
 
 func (x *CodeGeneratorRequest) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_compiler_plugin_proto_msgTypes[1].MessageOf(x)
+	mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *CodeGeneratorRequest) XXX_Methods() *protoiface.Methods {
+func (x *CodeGeneratorRequest) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_compiler_plugin_proto_msgTypes[1].Methods()
 }
 
@@ -163,6 +181,7 @@
 
 // The plugin writes an encoded CodeGeneratorResponse to stdout.
 type CodeGeneratorResponse struct {
+	state protoimpl.MessageState
 	// Error message.  If non-empty, code generation failed.  The plugin process
 	// should exit with status code zero even if it reports an error in this way.
 	//
@@ -188,10 +207,18 @@
 func (*CodeGeneratorResponse) ProtoMessage() {}
 
 func (x *CodeGeneratorResponse) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_compiler_plugin_proto_msgTypes[2].MessageOf(x)
+	mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *CodeGeneratorResponse) XXX_Methods() *protoiface.Methods {
+func (x *CodeGeneratorResponse) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_compiler_plugin_proto_msgTypes[2].Methods()
 }
 
@@ -216,6 +243,7 @@
 
 // Represents a single generated file.
 type CodeGeneratorResponse_File struct {
+	state protoimpl.MessageState
 	// The file name, relative to the output directory.  The name must not
 	// contain "." or ".." components and must be relative, not be absolute (so,
 	// the file cannot lie outside the output directory).  "/" must be used as
@@ -283,10 +311,18 @@
 func (*CodeGeneratorResponse_File) ProtoMessage() {}
 
 func (x *CodeGeneratorResponse_File) ProtoReflect() protoreflect.Message {
-	return file_google_protobuf_compiler_plugin_proto_msgTypes[3].MessageOf(x)
+	mi := &file_google_protobuf_compiler_plugin_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-func (m *CodeGeneratorResponse_File) XXX_Methods() *protoiface.Methods {
+func (x *CodeGeneratorResponse_File) XXX_Methods() *protoiface.Methods {
 	return file_google_protobuf_compiler_plugin_proto_msgTypes[3].Methods()
 }
 
@@ -407,9 +443,11 @@
 	if !protoimpl.UnsafeEnabled {
 		file_google_protobuf_compiler_plugin_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*Version); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -417,9 +455,11 @@
 		}
 		file_google_protobuf_compiler_plugin_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CodeGeneratorRequest); i {
-			case 4:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 5:
+				return &v.sizeCache
+			case 6:
 				return &v.unknownFields
 			default:
 				return nil
@@ -427,9 +467,11 @@
 		}
 		file_google_protobuf_compiler_plugin_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CodeGeneratorResponse); i {
-			case 2:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 3:
+				return &v.sizeCache
+			case 4:
 				return &v.unknownFields
 			default:
 				return nil
@@ -437,9 +479,11 @@
 		}
 		file_google_protobuf_compiler_plugin_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*CodeGeneratorResponse_File); i {
-			case 3:
-				return &v.sizeCache
+			case 0:
+				return &v.state
 			case 4:
+				return &v.sizeCache
+			case 5:
 				return &v.unknownFields
 			default:
 				return nil
