// 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 (
	
	
	

	
	
	
	
	
	
)

type errInvalidUTF8 struct{}

func (errInvalidUTF8) () string     { return "string field contains invalid UTF-8" }
func (errInvalidUTF8) () bool { return true }
func (errInvalidUTF8) () error     { return errors.Error }

// initOneofFieldCoders initializes the fast-path functions for the fields in a oneof.
//
// For size, marshal, and isInit operations, functions are set only on the first field
// in the oneof. The functions are called when the oneof is non-nil, and will dispatch
// to the appropriate field-specific function as necessary.
//
// The unmarshal function is set on each field individually as usual.
func ( *MessageInfo) ( protoreflect.OneofDescriptor,  structInfo) {
	 := .oneofsByName[.Name()]
	 := .Type
	 := make(map[reflect.Type]*coderFieldInfo)
	 := false
	 := .Fields()
	for ,  := 0, .Len();  < ; ++ {
		 := .Fields().Get()
		 := .Number()
		// Make a copy of the original coderFieldInfo for use in unmarshaling.
		//
		// oneofFields[oneofType].funcs.marshal is the field-specific marshal function.
		//
		// mi.coderFields[num].marshal is set on only the first field in the oneof,
		// and dispatches to the field-specific marshaler in oneofFields.
		 := *.coderFields[]
		 := .oneofWrappersByNumber[]
		.ft = .Field(0).Type
		.mi, .funcs = fieldCoder(, .ft)
		[] = &
		if .funcs.isInit != nil {
			 = true
		}
		.coderFields[].funcs.unmarshal = func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
			var  reflect.Value         // pointer to wrapper type
			 := .AsValueOf().Elem() // oneof field value of interface kind
			if !.IsNil() && !.Elem().IsNil() && .Elem().Elem().Type() ==  {
				 = .Elem()
			} else {
				 = reflect.New()
			}
			,  := .funcs.unmarshal(, pointerOfValue().Apply(zeroOffset), , &, )
			if  != nil {
				return , 
			}
			.Set()
			return , nil
		}
	}
	 := func( pointer) (pointer, *coderFieldInfo) {
		 := .AsValueOf().Elem()
		if .IsNil() {
			return pointer{}, nil
		}
		 = .Elem() // interface -> *struct
		if .IsNil() {
			return pointer{}, nil
		}
		return pointerOfValue().Apply(zeroOffset), [.Elem().Type()]
	}
	 := .coderFields[.Fields().Get(0).Number()]
	.funcs.size = func( pointer,  *coderFieldInfo,  marshalOptions) int {
		,  := ()
		if  == nil || .funcs.size == nil {
			return 0
		}
		return .funcs.size(, , )
	}
	.funcs.marshal = func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
		,  := ()
		if  == nil || .funcs.marshal == nil {
			return , nil
		}
		return .funcs.marshal(, , , )
	}
	.funcs.merge = func(,  pointer,  *coderFieldInfo,  mergeOptions) {
		,  := ()
		if  == nil || .funcs.merge == nil {
			return
		}
		,  := ()
		if  !=  {
			.AsValueOf().Elem().Set(reflect.New(.AsValueOf().Elem().Elem().Elem().Type()))
			 = pointerOfValue(.AsValueOf().Elem().Elem()).Apply(zeroOffset)
		}
		.funcs.merge(, , , )
	}
	if  {
		.funcs.isInit = func( pointer,  *coderFieldInfo) error {
			,  := ()
			if  == nil || .funcs.isInit == nil {
				return nil
			}
			return .funcs.isInit(, )
		}
	}
}

func ( protoreflect.FieldDescriptor) pointerCoderFuncs {
	var  sync.Once
	var  protoreflect.MessageType
	 := func() {
		.Do(func() {
			 := .Message().FullName()
			, _ = protoregistry.GlobalTypes.FindMessageByName()
		})
	}

	return pointerCoderFuncs{
		size: func( pointer,  *coderFieldInfo,  marshalOptions) int {
			,  := .WeakFields().get(.num)
			if ! {
				return 0
			}
			()
			if  == nil {
				panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
			}
			return sizeMessage(, .tagsize, )
		},
		marshal: func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
			,  := .WeakFields().get(.num)
			if ! {
				return , nil
			}
			()
			if  == nil {
				panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
			}
			return appendMessage(, , .wiretag, )
		},
		unmarshal: func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
			 := .WeakFields()
			,  := .get(.num)
			if ! {
				()
				if  == nil {
					return unmarshalOutput{}, errUnknown
				}
				 = .New().Interface()
				.set(.num, )
			}
			return consumeMessage(, , , )
		},
		isInit: func( pointer,  *coderFieldInfo) error {
			,  := .WeakFields().get(.num)
			if ! {
				return nil
			}
			return proto.CheckInitialized()
		},
		merge: func(,  pointer,  *coderFieldInfo,  mergeOptions) {
			,  := .WeakFields().get(.num)
			if ! {
				return
			}
			,  := .WeakFields().get(.num)
			if ! {
				()
				if  == nil {
					panic(fmt.Sprintf("weak message %v is not linked in", .Message().FullName()))
				}
				 = .New().Interface()
				.WeakFields().set(.num, )
			}
			.Merge(, )
		},
	}
}

func ( protoreflect.FieldDescriptor,  reflect.Type) pointerCoderFuncs {
	if  := getMessageInfo();  != nil {
		 := pointerCoderFuncs{
			size:      sizeMessageInfo,
			marshal:   appendMessageInfo,
			unmarshal: consumeMessageInfo,
			merge:     mergeMessage,
		}
		if needsInitCheck(.Desc) {
			.isInit = isInitMessageInfo
		}
		return 
	} else {
		return pointerCoderFuncs{
			size: func( pointer,  *coderFieldInfo,  marshalOptions) int {
				 := asMessage(.AsValueOf().Elem())
				return sizeMessage(, .tagsize, )
			},
			marshal: func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
				 := asMessage(.AsValueOf().Elem())
				return appendMessage(, , .wiretag, )
			},
			unmarshal: func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
				 := .AsValueOf().Elem()
				if .IsNil() {
					.Set(reflect.New(.Elem()))
				}
				return consumeMessage(, asMessage(), , )
			},
			isInit: func( pointer,  *coderFieldInfo) error {
				 := asMessage(.AsValueOf().Elem())
				return proto.CheckInitialized()
			},
			merge: mergeMessage,
		}
	}
}

func ( pointer,  *coderFieldInfo,  marshalOptions) int {
	return protowire.SizeBytes(.mi.sizePointer(.Elem(), )) + .tagsize
}

func ( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
	 = protowire.AppendVarint(, .wiretag)
	 = protowire.AppendVarint(, uint64(.mi.sizePointer(.Elem(), )))
	return .mi.marshalAppendPointer(, .Elem(), )
}

func ( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.BytesType {
		return , errUnknown
	}
	,  := protowire.ConsumeBytes()
	if  < 0 {
		return , errDecode
	}
	if .Elem().IsNil() {
		.SetPointer(pointerOfValue(reflect.New(.mi.GoReflectType.Elem())))
	}
	,  := .mi.unmarshalPointer(, .Elem(), 0, )
	if  != nil {
		return , 
	}
	.n = 
	.initialized = .initialized
	return , nil
}

func ( pointer,  *coderFieldInfo) error {
	return .mi.checkInitializedPointer(.Elem())
}

func ( proto.Message,  int,  marshalOptions) int {
	return protowire.SizeBytes(proto.Size()) + 
}

func ( []byte,  proto.Message,  uint64,  marshalOptions) ([]byte, error) {
	 = protowire.AppendVarint(, )
	 = protowire.AppendVarint(, uint64(proto.Size()))
	return .Options().MarshalAppend(, )
}

func ( []byte,  proto.Message,  protowire.Type,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.BytesType {
		return , errUnknown
	}
	,  := protowire.ConsumeBytes()
	if  < 0 {
		return , errDecode
	}
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: .ProtoReflect(),
	})
	if  != nil {
		return , 
	}
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , nil
}

func ( protoreflect.Value,  int,  marshalOptions) int {
	 := .Message().Interface()
	return sizeMessage(, , )
}

func ( []byte,  protoreflect.Value,  uint64,  marshalOptions) ([]byte, error) {
	 := .Message().Interface()
	return appendMessage(, , , )
}

func ( []byte,  protoreflect.Value,  protowire.Number,  protowire.Type,  unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
	 := .Message().Interface()
	,  := consumeMessage(, , , )
	return , , 
}

func ( protoreflect.Value) error {
	 := .Message().Interface()
	return proto.CheckInitialized()
}

var coderMessageValue = valueCoderFuncs{
	size:      sizeMessageValue,
	marshal:   appendMessageValue,
	unmarshal: consumeMessageValue,
	isInit:    isInitMessageValue,
	merge:     mergeMessageValue,
}

func ( protoreflect.Value,  int,  marshalOptions) int {
	 := .Message().Interface()
	return sizeGroup(, , )
}

func ( []byte,  protoreflect.Value,  uint64,  marshalOptions) ([]byte, error) {
	 := .Message().Interface()
	return appendGroup(, , , )
}

func ( []byte,  protoreflect.Value,  protowire.Number,  protowire.Type,  unmarshalOptions) (protoreflect.Value, unmarshalOutput, error) {
	 := .Message().Interface()
	,  := consumeGroup(, , , , )
	return , , 
}

var coderGroupValue = valueCoderFuncs{
	size:      sizeGroupValue,
	marshal:   appendGroupValue,
	unmarshal: consumeGroupValue,
	isInit:    isInitMessageValue,
	merge:     mergeMessageValue,
}

func ( protoreflect.FieldDescriptor,  reflect.Type) pointerCoderFuncs {
	 := .Number()
	if  := getMessageInfo();  != nil {
		 := pointerCoderFuncs{
			size:      sizeGroupType,
			marshal:   appendGroupType,
			unmarshal: consumeGroupType,
			merge:     mergeMessage,
		}
		if needsInitCheck(.Desc) {
			.isInit = isInitMessageInfo
		}
		return 
	} else {
		return pointerCoderFuncs{
			size: func( pointer,  *coderFieldInfo,  marshalOptions) int {
				 := asMessage(.AsValueOf().Elem())
				return sizeGroup(, .tagsize, )
			},
			marshal: func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
				 := asMessage(.AsValueOf().Elem())
				return appendGroup(, , .wiretag, )
			},
			unmarshal: func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
				 := .AsValueOf().Elem()
				if .IsNil() {
					.Set(reflect.New(.Elem()))
				}
				return consumeGroup(, asMessage(), , , )
			},
			isInit: func( pointer,  *coderFieldInfo) error {
				 := asMessage(.AsValueOf().Elem())
				return proto.CheckInitialized()
			},
			merge: mergeMessage,
		}
	}
}

func ( pointer,  *coderFieldInfo,  marshalOptions) int {
	return 2*.tagsize + .mi.sizePointer(.Elem(), )
}

func ( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
	 = protowire.AppendVarint(, .wiretag) // start group
	,  := .mi.marshalAppendPointer(, .Elem(), )
	 = protowire.AppendVarint(, .wiretag+1) // end group
	return , 
}

func ( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.StartGroupType {
		return , errUnknown
	}
	if .Elem().IsNil() {
		.SetPointer(pointerOfValue(reflect.New(.mi.GoReflectType.Elem())))
	}
	return .mi.unmarshalPointer(, .Elem(), .num, )
}

func ( proto.Message,  int,  marshalOptions) int {
	return 2* + proto.Size()
}

func ( []byte,  proto.Message,  uint64,  marshalOptions) ([]byte, error) {
	 = protowire.AppendVarint(, ) // start group
	,  := .Options().MarshalAppend(, )
	 = protowire.AppendVarint(, +1) // end group
	return , 
}

func ( []byte,  proto.Message,  protowire.Number,  protowire.Type,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.StartGroupType {
		return , errUnknown
	}
	,  := protowire.ConsumeGroup(, )
	if  < 0 {
		return , errDecode
	}
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: .ProtoReflect(),
	})
	if  != nil {
		return , 
	}
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , nil
}

func ( protoreflect.FieldDescriptor,  reflect.Type) pointerCoderFuncs {
	if  := getMessageInfo();  != nil {
		 := pointerCoderFuncs{
			size:      sizeMessageSliceInfo,
			marshal:   appendMessageSliceInfo,
			unmarshal: consumeMessageSliceInfo,
			merge:     mergeMessageSlice,
		}
		if needsInitCheck(.Desc) {
			.isInit = isInitMessageSliceInfo
		}
		return 
	}
	return pointerCoderFuncs{
		size: func( pointer,  *coderFieldInfo,  marshalOptions) int {
			return sizeMessageSlice(, , .tagsize, )
		},
		marshal: func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
			return appendMessageSlice(, , .wiretag, , )
		},
		unmarshal: func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
			return consumeMessageSlice(, , , , )
		},
		isInit: func( pointer,  *coderFieldInfo) error {
			return isInitMessageSlice(, )
		},
		merge: mergeMessageSlice,
	}
}

func ( pointer,  *coderFieldInfo,  marshalOptions) int {
	 := .PointerSlice()
	 := 0
	for ,  := range  {
		 += protowire.SizeBytes(.mi.sizePointer(, )) + .tagsize
	}
	return 
}

func ( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
	 := .PointerSlice()
	var  error
	for ,  := range  {
		 = protowire.AppendVarint(, .wiretag)
		 := .mi.sizePointer(, )
		 = protowire.AppendVarint(, uint64())
		,  = .mi.marshalAppendPointer(, , )
		if  != nil {
			return , 
		}
	}
	return , nil
}

func ( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.BytesType {
		return , errUnknown
	}
	,  := protowire.ConsumeBytes()
	if  < 0 {
		return , errDecode
	}
	 := reflect.New(.mi.GoReflectType.Elem()).Interface()
	 := pointerOfIface()
	,  := .mi.unmarshalPointer(, , 0, )
	if  != nil {
		return , 
	}
	.AppendPointerSlice()
	.n = 
	.initialized = .initialized
	return , nil
}

func ( pointer,  *coderFieldInfo) error {
	 := .PointerSlice()
	for ,  := range  {
		if  := .mi.checkInitializedPointer();  != nil {
			return 
		}
	}
	return nil
}

func ( pointer,  reflect.Type,  int,  marshalOptions) int {
	 := .PointerSlice()
	 := 0
	for ,  := range  {
		 := asMessage(.AsValueOf(.Elem()))
		 += protowire.SizeBytes(proto.Size()) + 
	}
	return 
}

func ( []byte,  pointer,  uint64,  reflect.Type,  marshalOptions) ([]byte, error) {
	 := .PointerSlice()
	var  error
	for ,  := range  {
		 := asMessage(.AsValueOf(.Elem()))
		 = protowire.AppendVarint(, )
		 := proto.Size()
		 = protowire.AppendVarint(, uint64())
		,  = .Options().MarshalAppend(, )
		if  != nil {
			return , 
		}
	}
	return , nil
}

func ( []byte,  pointer,  reflect.Type,  protowire.Type,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.BytesType {
		return , errUnknown
	}
	,  := protowire.ConsumeBytes()
	if  < 0 {
		return , errDecode
	}
	 := reflect.New(.Elem())
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: asMessage().ProtoReflect(),
	})
	if  != nil {
		return , 
	}
	.AppendPointerSlice(pointerOfValue())
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , nil
}

func ( pointer,  reflect.Type) error {
	 := .PointerSlice()
	for ,  := range  {
		 := asMessage(.AsValueOf(.Elem()))
		if  := proto.CheckInitialized();  != nil {
			return 
		}
	}
	return nil
}

// Slices of messages

func ( protoreflect.Value,  int,  marshalOptions) int {
	 := .List()
	 := 0
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message().Interface()
		 += protowire.SizeBytes(proto.Size()) + 
	}
	return 
}

func ( []byte,  protoreflect.Value,  uint64,  marshalOptions) ([]byte, error) {
	 := .List()
	 := .Options()
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message().Interface()
		 = protowire.AppendVarint(, )
		 := proto.Size()
		 = protowire.AppendVarint(, uint64())
		var  error
		,  = .MarshalAppend(, )
		if  != nil {
			return , 
		}
	}
	return , nil
}

func ( []byte,  protoreflect.Value,  protowire.Number,  protowire.Type,  unmarshalOptions) ( protoreflect.Value,  unmarshalOutput,  error) {
	 := .List()
	if  != protowire.BytesType {
		return protoreflect.Value{}, , errUnknown
	}
	,  := protowire.ConsumeBytes()
	if  < 0 {
		return protoreflect.Value{}, , errDecode
	}
	 := .NewElement()
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: .Message(),
	})
	if  != nil {
		return protoreflect.Value{}, , 
	}
	.Append()
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , , nil
}

func ( protoreflect.Value) error {
	 := .List()
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message().Interface()
		if  := proto.CheckInitialized();  != nil {
			return 
		}
	}
	return nil
}

var coderMessageSliceValue = valueCoderFuncs{
	size:      sizeMessageSliceValue,
	marshal:   appendMessageSliceValue,
	unmarshal: consumeMessageSliceValue,
	isInit:    isInitMessageSliceValue,
	merge:     mergeMessageListValue,
}

func ( protoreflect.Value,  int,  marshalOptions) int {
	 := .List()
	 := 0
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message().Interface()
		 += 2* + proto.Size()
	}
	return 
}

func ( []byte,  protoreflect.Value,  uint64,  marshalOptions) ([]byte, error) {
	 := .List()
	 := .Options()
	for ,  := 0, .Len();  < ; ++ {
		 := .Get().Message().Interface()
		 = protowire.AppendVarint(, ) // start group
		var  error
		,  = .MarshalAppend(, )
		if  != nil {
			return , 
		}
		 = protowire.AppendVarint(, +1) // end group
	}
	return , nil
}

func ( []byte,  protoreflect.Value,  protowire.Number,  protowire.Type,  unmarshalOptions) ( protoreflect.Value,  unmarshalOutput,  error) {
	 := .List()
	if  != protowire.StartGroupType {
		return protoreflect.Value{}, , errUnknown
	}
	,  := protowire.ConsumeGroup(, )
	if  < 0 {
		return protoreflect.Value{}, , errDecode
	}
	 := .NewElement()
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: .Message(),
	})
	if  != nil {
		return protoreflect.Value{}, , 
	}
	.Append()
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , , nil
}

var coderGroupSliceValue = valueCoderFuncs{
	size:      sizeGroupSliceValue,
	marshal:   appendGroupSliceValue,
	unmarshal: consumeGroupSliceValue,
	isInit:    isInitMessageSliceValue,
	merge:     mergeMessageListValue,
}

func ( protoreflect.FieldDescriptor,  reflect.Type) pointerCoderFuncs {
	 := .Number()
	if  := getMessageInfo();  != nil {
		 := pointerCoderFuncs{
			size:      sizeGroupSliceInfo,
			marshal:   appendGroupSliceInfo,
			unmarshal: consumeGroupSliceInfo,
			merge:     mergeMessageSlice,
		}
		if needsInitCheck(.Desc) {
			.isInit = isInitMessageSliceInfo
		}
		return 
	}
	return pointerCoderFuncs{
		size: func( pointer,  *coderFieldInfo,  marshalOptions) int {
			return sizeGroupSlice(, , .tagsize, )
		},
		marshal: func( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
			return appendGroupSlice(, , .wiretag, , )
		},
		unmarshal: func( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
			return consumeGroupSlice(, , , , , )
		},
		isInit: func( pointer,  *coderFieldInfo) error {
			return isInitMessageSlice(, )
		},
		merge: mergeMessageSlice,
	}
}

func ( pointer,  reflect.Type,  int,  marshalOptions) int {
	 := .PointerSlice()
	 := 0
	for ,  := range  {
		 := asMessage(.AsValueOf(.Elem()))
		 += 2* + proto.Size()
	}
	return 
}

func ( []byte,  pointer,  uint64,  reflect.Type,  marshalOptions) ([]byte, error) {
	 := .PointerSlice()
	var  error
	for ,  := range  {
		 := asMessage(.AsValueOf(.Elem()))
		 = protowire.AppendVarint(, ) // start group
		,  = .Options().MarshalAppend(, )
		if  != nil {
			return , 
		}
		 = protowire.AppendVarint(, +1) // end group
	}
	return , nil
}

func ( []byte,  pointer,  protowire.Number,  protowire.Type,  reflect.Type,  unmarshalOptions) ( unmarshalOutput,  error) {
	if  != protowire.StartGroupType {
		return , errUnknown
	}
	,  := protowire.ConsumeGroup(, )
	if  < 0 {
		return , errDecode
	}
	 := reflect.New(.Elem())
	,  := .Options().UnmarshalState(protoiface.UnmarshalInput{
		Buf:     ,
		Message: asMessage().ProtoReflect(),
	})
	if  != nil {
		return , 
	}
	.AppendPointerSlice(pointerOfValue())
	.n = 
	.initialized = .Flags&protoiface.UnmarshalInitialized != 0
	return , nil
}

func ( pointer,  *coderFieldInfo,  marshalOptions) int {
	 := .PointerSlice()
	 := 0
	for ,  := range  {
		 += 2*.tagsize + .mi.sizePointer(, )
	}
	return 
}

func ( []byte,  pointer,  *coderFieldInfo,  marshalOptions) ([]byte, error) {
	 := .PointerSlice()
	var  error
	for ,  := range  {
		 = protowire.AppendVarint(, .wiretag) // start group
		,  = .mi.marshalAppendPointer(, , )
		if  != nil {
			return , 
		}
		 = protowire.AppendVarint(, .wiretag+1) // end group
	}
	return , nil
}

func ( []byte,  pointer,  protowire.Type,  *coderFieldInfo,  unmarshalOptions) (unmarshalOutput, error) {
	if  != protowire.StartGroupType {
		return unmarshalOutput{}, errUnknown
	}
	 := reflect.New(.mi.GoReflectType.Elem()).Interface()
	 := pointerOfIface()
	,  := .mi.unmarshalPointer(, , .num, )
	if  != nil {
		return , 
	}
	.AppendPointerSlice()
	return , nil
}

func ( reflect.Value) protoreflect.ProtoMessage {
	if ,  := .Interface().(protoreflect.ProtoMessage);  {
		return 
	}
	return legacyWrapMessage().Interface()
}