//go:build !no_gotd_slices
// +build !no_gotd_slices

// Code generated by gotdgen, DO NOT EDIT.

package tg

import (
	"context"
	"errors"
	"fmt"
	"sort"
	"strings"

	"go.uber.org/multierr"

	"go.mau.fi/mautrix-telegram/pkg/gotd/bin"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdjson"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tdp"
	"go.mau.fi/mautrix-telegram/pkg/gotd/tgerr"
)

// No-op definition for keeping imports.
var (
	_ = bin.Buffer{}
	_ = context.Background()
	_ = fmt.Stringer(nil)
	_ = strings.Builder{}
	_ = errors.Is
	_ = multierr.AppendInto
	_ = sort.Ints
	_ = tdp.Format
	_ = tgerr.Error{}
	_ = tdjson.Encoder{}
)

// MessageEntityClassArray is adapter for slice of MessageEntityClass.
type MessageEntityClassArray []MessageEntityClass

// Sort sorts slice of MessageEntityClass.
func (s MessageEntityClassArray) Sort(less func(a, b MessageEntityClass) bool) MessageEntityClassArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityClass.
func (s MessageEntityClassArray) SortStable(less func(a, b MessageEntityClass) bool) MessageEntityClassArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityClass.
func (s MessageEntityClassArray) Retain(keep func(x MessageEntityClass) bool) MessageEntityClassArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityClassArray) First() (v MessageEntityClass, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityClassArray) Last() (v MessageEntityClass, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityClassArray) PopFirst() (v MessageEntityClass, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityClass
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityClassArray) Pop() (v MessageEntityClass, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// AsMessageEntityUnknown returns copy with only MessageEntityUnknown constructors.
func (s MessageEntityClassArray) AsMessageEntityUnknown() (to MessageEntityUnknownArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityUnknown)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityMention returns copy with only MessageEntityMention constructors.
func (s MessageEntityClassArray) AsMessageEntityMention() (to MessageEntityMentionArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityMention)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityHashtag returns copy with only MessageEntityHashtag constructors.
func (s MessageEntityClassArray) AsMessageEntityHashtag() (to MessageEntityHashtagArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityHashtag)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityBotCommand returns copy with only MessageEntityBotCommand constructors.
func (s MessageEntityClassArray) AsMessageEntityBotCommand() (to MessageEntityBotCommandArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityBotCommand)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityURL returns copy with only MessageEntityURL constructors.
func (s MessageEntityClassArray) AsMessageEntityURL() (to MessageEntityURLArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityURL)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityEmail returns copy with only MessageEntityEmail constructors.
func (s MessageEntityClassArray) AsMessageEntityEmail() (to MessageEntityEmailArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityEmail)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityBold returns copy with only MessageEntityBold constructors.
func (s MessageEntityClassArray) AsMessageEntityBold() (to MessageEntityBoldArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityBold)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityItalic returns copy with only MessageEntityItalic constructors.
func (s MessageEntityClassArray) AsMessageEntityItalic() (to MessageEntityItalicArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityItalic)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityCode returns copy with only MessageEntityCode constructors.
func (s MessageEntityClassArray) AsMessageEntityCode() (to MessageEntityCodeArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityCode)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityPre returns copy with only MessageEntityPre constructors.
func (s MessageEntityClassArray) AsMessageEntityPre() (to MessageEntityPreArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityPre)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityTextURL returns copy with only MessageEntityTextURL constructors.
func (s MessageEntityClassArray) AsMessageEntityTextURL() (to MessageEntityTextURLArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityTextURL)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityMentionName returns copy with only MessageEntityMentionName constructors.
func (s MessageEntityClassArray) AsMessageEntityMentionName() (to MessageEntityMentionNameArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityMentionName)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsInputMessageEntityMentionName returns copy with only InputMessageEntityMentionName constructors.
func (s MessageEntityClassArray) AsInputMessageEntityMentionName() (to InputMessageEntityMentionNameArray) {
	for _, elem := range s {
		value, ok := elem.(*InputMessageEntityMentionName)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityPhone returns copy with only MessageEntityPhone constructors.
func (s MessageEntityClassArray) AsMessageEntityPhone() (to MessageEntityPhoneArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityPhone)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityCashtag returns copy with only MessageEntityCashtag constructors.
func (s MessageEntityClassArray) AsMessageEntityCashtag() (to MessageEntityCashtagArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityCashtag)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityUnderline returns copy with only MessageEntityUnderline constructors.
func (s MessageEntityClassArray) AsMessageEntityUnderline() (to MessageEntityUnderlineArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityUnderline)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityStrike returns copy with only MessageEntityStrike constructors.
func (s MessageEntityClassArray) AsMessageEntityStrike() (to MessageEntityStrikeArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityStrike)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityBankCard returns copy with only MessageEntityBankCard constructors.
func (s MessageEntityClassArray) AsMessageEntityBankCard() (to MessageEntityBankCardArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityBankCard)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntitySpoiler returns copy with only MessageEntitySpoiler constructors.
func (s MessageEntityClassArray) AsMessageEntitySpoiler() (to MessageEntitySpoilerArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntitySpoiler)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityCustomEmoji returns copy with only MessageEntityCustomEmoji constructors.
func (s MessageEntityClassArray) AsMessageEntityCustomEmoji() (to MessageEntityCustomEmojiArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityCustomEmoji)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityBlockquote returns copy with only MessageEntityBlockquote constructors.
func (s MessageEntityClassArray) AsMessageEntityBlockquote() (to MessageEntityBlockquoteArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityBlockquote)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityFormattedDate returns copy with only MessageEntityFormattedDate constructors.
func (s MessageEntityClassArray) AsMessageEntityFormattedDate() (to MessageEntityFormattedDateArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityFormattedDate)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityDiffInsert returns copy with only MessageEntityDiffInsert constructors.
func (s MessageEntityClassArray) AsMessageEntityDiffInsert() (to MessageEntityDiffInsertArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityDiffInsert)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityDiffReplace returns copy with only MessageEntityDiffReplace constructors.
func (s MessageEntityClassArray) AsMessageEntityDiffReplace() (to MessageEntityDiffReplaceArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityDiffReplace)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// AsMessageEntityDiffDelete returns copy with only MessageEntityDiffDelete constructors.
func (s MessageEntityClassArray) AsMessageEntityDiffDelete() (to MessageEntityDiffDeleteArray) {
	for _, elem := range s {
		value, ok := elem.(*MessageEntityDiffDelete)
		if !ok {
			continue
		}
		to = append(to, *value)
	}

	return to
}

// MessageEntityUnknownArray is adapter for slice of MessageEntityUnknown.
type MessageEntityUnknownArray []MessageEntityUnknown

// Sort sorts slice of MessageEntityUnknown.
func (s MessageEntityUnknownArray) Sort(less func(a, b MessageEntityUnknown) bool) MessageEntityUnknownArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityUnknown.
func (s MessageEntityUnknownArray) SortStable(less func(a, b MessageEntityUnknown) bool) MessageEntityUnknownArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityUnknown.
func (s MessageEntityUnknownArray) Retain(keep func(x MessageEntityUnknown) bool) MessageEntityUnknownArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityUnknownArray) First() (v MessageEntityUnknown, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityUnknownArray) Last() (v MessageEntityUnknown, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityUnknownArray) PopFirst() (v MessageEntityUnknown, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityUnknown
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityUnknownArray) Pop() (v MessageEntityUnknown, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityMentionArray is adapter for slice of MessageEntityMention.
type MessageEntityMentionArray []MessageEntityMention

// Sort sorts slice of MessageEntityMention.
func (s MessageEntityMentionArray) Sort(less func(a, b MessageEntityMention) bool) MessageEntityMentionArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityMention.
func (s MessageEntityMentionArray) SortStable(less func(a, b MessageEntityMention) bool) MessageEntityMentionArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityMention.
func (s MessageEntityMentionArray) Retain(keep func(x MessageEntityMention) bool) MessageEntityMentionArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityMentionArray) First() (v MessageEntityMention, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityMentionArray) Last() (v MessageEntityMention, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityMentionArray) PopFirst() (v MessageEntityMention, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityMention
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityMentionArray) Pop() (v MessageEntityMention, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityHashtagArray is adapter for slice of MessageEntityHashtag.
type MessageEntityHashtagArray []MessageEntityHashtag

// Sort sorts slice of MessageEntityHashtag.
func (s MessageEntityHashtagArray) Sort(less func(a, b MessageEntityHashtag) bool) MessageEntityHashtagArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityHashtag.
func (s MessageEntityHashtagArray) SortStable(less func(a, b MessageEntityHashtag) bool) MessageEntityHashtagArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityHashtag.
func (s MessageEntityHashtagArray) Retain(keep func(x MessageEntityHashtag) bool) MessageEntityHashtagArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityHashtagArray) First() (v MessageEntityHashtag, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityHashtagArray) Last() (v MessageEntityHashtag, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityHashtagArray) PopFirst() (v MessageEntityHashtag, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityHashtag
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityHashtagArray) Pop() (v MessageEntityHashtag, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityBotCommandArray is adapter for slice of MessageEntityBotCommand.
type MessageEntityBotCommandArray []MessageEntityBotCommand

// Sort sorts slice of MessageEntityBotCommand.
func (s MessageEntityBotCommandArray) Sort(less func(a, b MessageEntityBotCommand) bool) MessageEntityBotCommandArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityBotCommand.
func (s MessageEntityBotCommandArray) SortStable(less func(a, b MessageEntityBotCommand) bool) MessageEntityBotCommandArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityBotCommand.
func (s MessageEntityBotCommandArray) Retain(keep func(x MessageEntityBotCommand) bool) MessageEntityBotCommandArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityBotCommandArray) First() (v MessageEntityBotCommand, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityBotCommandArray) Last() (v MessageEntityBotCommand, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityBotCommandArray) PopFirst() (v MessageEntityBotCommand, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityBotCommand
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityBotCommandArray) Pop() (v MessageEntityBotCommand, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityURLArray is adapter for slice of MessageEntityURL.
type MessageEntityURLArray []MessageEntityURL

// Sort sorts slice of MessageEntityURL.
func (s MessageEntityURLArray) Sort(less func(a, b MessageEntityURL) bool) MessageEntityURLArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityURL.
func (s MessageEntityURLArray) SortStable(less func(a, b MessageEntityURL) bool) MessageEntityURLArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityURL.
func (s MessageEntityURLArray) Retain(keep func(x MessageEntityURL) bool) MessageEntityURLArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityURLArray) First() (v MessageEntityURL, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityURLArray) Last() (v MessageEntityURL, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityURLArray) PopFirst() (v MessageEntityURL, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityURL
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityURLArray) Pop() (v MessageEntityURL, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityEmailArray is adapter for slice of MessageEntityEmail.
type MessageEntityEmailArray []MessageEntityEmail

// Sort sorts slice of MessageEntityEmail.
func (s MessageEntityEmailArray) Sort(less func(a, b MessageEntityEmail) bool) MessageEntityEmailArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityEmail.
func (s MessageEntityEmailArray) SortStable(less func(a, b MessageEntityEmail) bool) MessageEntityEmailArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityEmail.
func (s MessageEntityEmailArray) Retain(keep func(x MessageEntityEmail) bool) MessageEntityEmailArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityEmailArray) First() (v MessageEntityEmail, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityEmailArray) Last() (v MessageEntityEmail, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityEmailArray) PopFirst() (v MessageEntityEmail, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityEmail
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityEmailArray) Pop() (v MessageEntityEmail, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityBoldArray is adapter for slice of MessageEntityBold.
type MessageEntityBoldArray []MessageEntityBold

// Sort sorts slice of MessageEntityBold.
func (s MessageEntityBoldArray) Sort(less func(a, b MessageEntityBold) bool) MessageEntityBoldArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityBold.
func (s MessageEntityBoldArray) SortStable(less func(a, b MessageEntityBold) bool) MessageEntityBoldArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityBold.
func (s MessageEntityBoldArray) Retain(keep func(x MessageEntityBold) bool) MessageEntityBoldArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityBoldArray) First() (v MessageEntityBold, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityBoldArray) Last() (v MessageEntityBold, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityBoldArray) PopFirst() (v MessageEntityBold, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityBold
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityBoldArray) Pop() (v MessageEntityBold, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityItalicArray is adapter for slice of MessageEntityItalic.
type MessageEntityItalicArray []MessageEntityItalic

// Sort sorts slice of MessageEntityItalic.
func (s MessageEntityItalicArray) Sort(less func(a, b MessageEntityItalic) bool) MessageEntityItalicArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityItalic.
func (s MessageEntityItalicArray) SortStable(less func(a, b MessageEntityItalic) bool) MessageEntityItalicArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityItalic.
func (s MessageEntityItalicArray) Retain(keep func(x MessageEntityItalic) bool) MessageEntityItalicArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityItalicArray) First() (v MessageEntityItalic, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityItalicArray) Last() (v MessageEntityItalic, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityItalicArray) PopFirst() (v MessageEntityItalic, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityItalic
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityItalicArray) Pop() (v MessageEntityItalic, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityCodeArray is adapter for slice of MessageEntityCode.
type MessageEntityCodeArray []MessageEntityCode

// Sort sorts slice of MessageEntityCode.
func (s MessageEntityCodeArray) Sort(less func(a, b MessageEntityCode) bool) MessageEntityCodeArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityCode.
func (s MessageEntityCodeArray) SortStable(less func(a, b MessageEntityCode) bool) MessageEntityCodeArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityCode.
func (s MessageEntityCodeArray) Retain(keep func(x MessageEntityCode) bool) MessageEntityCodeArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityCodeArray) First() (v MessageEntityCode, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityCodeArray) Last() (v MessageEntityCode, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityCodeArray) PopFirst() (v MessageEntityCode, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityCode
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityCodeArray) Pop() (v MessageEntityCode, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityPreArray is adapter for slice of MessageEntityPre.
type MessageEntityPreArray []MessageEntityPre

// Sort sorts slice of MessageEntityPre.
func (s MessageEntityPreArray) Sort(less func(a, b MessageEntityPre) bool) MessageEntityPreArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityPre.
func (s MessageEntityPreArray) SortStable(less func(a, b MessageEntityPre) bool) MessageEntityPreArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityPre.
func (s MessageEntityPreArray) Retain(keep func(x MessageEntityPre) bool) MessageEntityPreArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityPreArray) First() (v MessageEntityPre, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityPreArray) Last() (v MessageEntityPre, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityPreArray) PopFirst() (v MessageEntityPre, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityPre
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityPreArray) Pop() (v MessageEntityPre, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityTextURLArray is adapter for slice of MessageEntityTextURL.
type MessageEntityTextURLArray []MessageEntityTextURL

// Sort sorts slice of MessageEntityTextURL.
func (s MessageEntityTextURLArray) Sort(less func(a, b MessageEntityTextURL) bool) MessageEntityTextURLArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityTextURL.
func (s MessageEntityTextURLArray) SortStable(less func(a, b MessageEntityTextURL) bool) MessageEntityTextURLArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityTextURL.
func (s MessageEntityTextURLArray) Retain(keep func(x MessageEntityTextURL) bool) MessageEntityTextURLArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityTextURLArray) First() (v MessageEntityTextURL, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityTextURLArray) Last() (v MessageEntityTextURL, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityTextURLArray) PopFirst() (v MessageEntityTextURL, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityTextURL
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityTextURLArray) Pop() (v MessageEntityTextURL, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityMentionNameArray is adapter for slice of MessageEntityMentionName.
type MessageEntityMentionNameArray []MessageEntityMentionName

// Sort sorts slice of MessageEntityMentionName.
func (s MessageEntityMentionNameArray) Sort(less func(a, b MessageEntityMentionName) bool) MessageEntityMentionNameArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityMentionName.
func (s MessageEntityMentionNameArray) SortStable(less func(a, b MessageEntityMentionName) bool) MessageEntityMentionNameArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityMentionName.
func (s MessageEntityMentionNameArray) Retain(keep func(x MessageEntityMentionName) bool) MessageEntityMentionNameArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityMentionNameArray) First() (v MessageEntityMentionName, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityMentionNameArray) Last() (v MessageEntityMentionName, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityMentionNameArray) PopFirst() (v MessageEntityMentionName, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityMentionName
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityMentionNameArray) Pop() (v MessageEntityMentionName, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// InputMessageEntityMentionNameArray is adapter for slice of InputMessageEntityMentionName.
type InputMessageEntityMentionNameArray []InputMessageEntityMentionName

// Sort sorts slice of InputMessageEntityMentionName.
func (s InputMessageEntityMentionNameArray) Sort(less func(a, b InputMessageEntityMentionName) bool) InputMessageEntityMentionNameArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of InputMessageEntityMentionName.
func (s InputMessageEntityMentionNameArray) SortStable(less func(a, b InputMessageEntityMentionName) bool) InputMessageEntityMentionNameArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of InputMessageEntityMentionName.
func (s InputMessageEntityMentionNameArray) Retain(keep func(x InputMessageEntityMentionName) bool) InputMessageEntityMentionNameArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s InputMessageEntityMentionNameArray) First() (v InputMessageEntityMentionName, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s InputMessageEntityMentionNameArray) Last() (v InputMessageEntityMentionName, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *InputMessageEntityMentionNameArray) PopFirst() (v InputMessageEntityMentionName, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero InputMessageEntityMentionName
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *InputMessageEntityMentionNameArray) Pop() (v InputMessageEntityMentionName, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityPhoneArray is adapter for slice of MessageEntityPhone.
type MessageEntityPhoneArray []MessageEntityPhone

// Sort sorts slice of MessageEntityPhone.
func (s MessageEntityPhoneArray) Sort(less func(a, b MessageEntityPhone) bool) MessageEntityPhoneArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityPhone.
func (s MessageEntityPhoneArray) SortStable(less func(a, b MessageEntityPhone) bool) MessageEntityPhoneArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityPhone.
func (s MessageEntityPhoneArray) Retain(keep func(x MessageEntityPhone) bool) MessageEntityPhoneArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityPhoneArray) First() (v MessageEntityPhone, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityPhoneArray) Last() (v MessageEntityPhone, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityPhoneArray) PopFirst() (v MessageEntityPhone, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityPhone
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityPhoneArray) Pop() (v MessageEntityPhone, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityCashtagArray is adapter for slice of MessageEntityCashtag.
type MessageEntityCashtagArray []MessageEntityCashtag

// Sort sorts slice of MessageEntityCashtag.
func (s MessageEntityCashtagArray) Sort(less func(a, b MessageEntityCashtag) bool) MessageEntityCashtagArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityCashtag.
func (s MessageEntityCashtagArray) SortStable(less func(a, b MessageEntityCashtag) bool) MessageEntityCashtagArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityCashtag.
func (s MessageEntityCashtagArray) Retain(keep func(x MessageEntityCashtag) bool) MessageEntityCashtagArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityCashtagArray) First() (v MessageEntityCashtag, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityCashtagArray) Last() (v MessageEntityCashtag, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityCashtagArray) PopFirst() (v MessageEntityCashtag, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityCashtag
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityCashtagArray) Pop() (v MessageEntityCashtag, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityUnderlineArray is adapter for slice of MessageEntityUnderline.
type MessageEntityUnderlineArray []MessageEntityUnderline

// Sort sorts slice of MessageEntityUnderline.
func (s MessageEntityUnderlineArray) Sort(less func(a, b MessageEntityUnderline) bool) MessageEntityUnderlineArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityUnderline.
func (s MessageEntityUnderlineArray) SortStable(less func(a, b MessageEntityUnderline) bool) MessageEntityUnderlineArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityUnderline.
func (s MessageEntityUnderlineArray) Retain(keep func(x MessageEntityUnderline) bool) MessageEntityUnderlineArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityUnderlineArray) First() (v MessageEntityUnderline, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityUnderlineArray) Last() (v MessageEntityUnderline, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityUnderlineArray) PopFirst() (v MessageEntityUnderline, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityUnderline
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityUnderlineArray) Pop() (v MessageEntityUnderline, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityStrikeArray is adapter for slice of MessageEntityStrike.
type MessageEntityStrikeArray []MessageEntityStrike

// Sort sorts slice of MessageEntityStrike.
func (s MessageEntityStrikeArray) Sort(less func(a, b MessageEntityStrike) bool) MessageEntityStrikeArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityStrike.
func (s MessageEntityStrikeArray) SortStable(less func(a, b MessageEntityStrike) bool) MessageEntityStrikeArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityStrike.
func (s MessageEntityStrikeArray) Retain(keep func(x MessageEntityStrike) bool) MessageEntityStrikeArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityStrikeArray) First() (v MessageEntityStrike, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityStrikeArray) Last() (v MessageEntityStrike, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityStrikeArray) PopFirst() (v MessageEntityStrike, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityStrike
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityStrikeArray) Pop() (v MessageEntityStrike, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityBankCardArray is adapter for slice of MessageEntityBankCard.
type MessageEntityBankCardArray []MessageEntityBankCard

// Sort sorts slice of MessageEntityBankCard.
func (s MessageEntityBankCardArray) Sort(less func(a, b MessageEntityBankCard) bool) MessageEntityBankCardArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityBankCard.
func (s MessageEntityBankCardArray) SortStable(less func(a, b MessageEntityBankCard) bool) MessageEntityBankCardArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityBankCard.
func (s MessageEntityBankCardArray) Retain(keep func(x MessageEntityBankCard) bool) MessageEntityBankCardArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityBankCardArray) First() (v MessageEntityBankCard, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityBankCardArray) Last() (v MessageEntityBankCard, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityBankCardArray) PopFirst() (v MessageEntityBankCard, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityBankCard
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityBankCardArray) Pop() (v MessageEntityBankCard, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntitySpoilerArray is adapter for slice of MessageEntitySpoiler.
type MessageEntitySpoilerArray []MessageEntitySpoiler

// Sort sorts slice of MessageEntitySpoiler.
func (s MessageEntitySpoilerArray) Sort(less func(a, b MessageEntitySpoiler) bool) MessageEntitySpoilerArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntitySpoiler.
func (s MessageEntitySpoilerArray) SortStable(less func(a, b MessageEntitySpoiler) bool) MessageEntitySpoilerArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntitySpoiler.
func (s MessageEntitySpoilerArray) Retain(keep func(x MessageEntitySpoiler) bool) MessageEntitySpoilerArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntitySpoilerArray) First() (v MessageEntitySpoiler, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntitySpoilerArray) Last() (v MessageEntitySpoiler, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntitySpoilerArray) PopFirst() (v MessageEntitySpoiler, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntitySpoiler
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntitySpoilerArray) Pop() (v MessageEntitySpoiler, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityCustomEmojiArray is adapter for slice of MessageEntityCustomEmoji.
type MessageEntityCustomEmojiArray []MessageEntityCustomEmoji

// Sort sorts slice of MessageEntityCustomEmoji.
func (s MessageEntityCustomEmojiArray) Sort(less func(a, b MessageEntityCustomEmoji) bool) MessageEntityCustomEmojiArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityCustomEmoji.
func (s MessageEntityCustomEmojiArray) SortStable(less func(a, b MessageEntityCustomEmoji) bool) MessageEntityCustomEmojiArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityCustomEmoji.
func (s MessageEntityCustomEmojiArray) Retain(keep func(x MessageEntityCustomEmoji) bool) MessageEntityCustomEmojiArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityCustomEmojiArray) First() (v MessageEntityCustomEmoji, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityCustomEmojiArray) Last() (v MessageEntityCustomEmoji, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityCustomEmojiArray) PopFirst() (v MessageEntityCustomEmoji, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityCustomEmoji
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityCustomEmojiArray) Pop() (v MessageEntityCustomEmoji, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityBlockquoteArray is adapter for slice of MessageEntityBlockquote.
type MessageEntityBlockquoteArray []MessageEntityBlockquote

// Sort sorts slice of MessageEntityBlockquote.
func (s MessageEntityBlockquoteArray) Sort(less func(a, b MessageEntityBlockquote) bool) MessageEntityBlockquoteArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityBlockquote.
func (s MessageEntityBlockquoteArray) SortStable(less func(a, b MessageEntityBlockquote) bool) MessageEntityBlockquoteArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityBlockquote.
func (s MessageEntityBlockquoteArray) Retain(keep func(x MessageEntityBlockquote) bool) MessageEntityBlockquoteArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityBlockquoteArray) First() (v MessageEntityBlockquote, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityBlockquoteArray) Last() (v MessageEntityBlockquote, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityBlockquoteArray) PopFirst() (v MessageEntityBlockquote, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityBlockquote
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityBlockquoteArray) Pop() (v MessageEntityBlockquote, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityFormattedDateArray is adapter for slice of MessageEntityFormattedDate.
type MessageEntityFormattedDateArray []MessageEntityFormattedDate

// Sort sorts slice of MessageEntityFormattedDate.
func (s MessageEntityFormattedDateArray) Sort(less func(a, b MessageEntityFormattedDate) bool) MessageEntityFormattedDateArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityFormattedDate.
func (s MessageEntityFormattedDateArray) SortStable(less func(a, b MessageEntityFormattedDate) bool) MessageEntityFormattedDateArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityFormattedDate.
func (s MessageEntityFormattedDateArray) Retain(keep func(x MessageEntityFormattedDate) bool) MessageEntityFormattedDateArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityFormattedDateArray) First() (v MessageEntityFormattedDate, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityFormattedDateArray) Last() (v MessageEntityFormattedDate, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityFormattedDateArray) PopFirst() (v MessageEntityFormattedDate, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityFormattedDate
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityFormattedDateArray) Pop() (v MessageEntityFormattedDate, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// SortByDate sorts slice of MessageEntityFormattedDate by Date.
func (s MessageEntityFormattedDateArray) SortByDate() MessageEntityFormattedDateArray {
	return s.Sort(func(a, b MessageEntityFormattedDate) bool {
		return a.GetDate() < b.GetDate()
	})
}

// SortStableByDate sorts slice of MessageEntityFormattedDate by Date.
func (s MessageEntityFormattedDateArray) SortStableByDate() MessageEntityFormattedDateArray {
	return s.SortStable(func(a, b MessageEntityFormattedDate) bool {
		return a.GetDate() < b.GetDate()
	})
}

// MessageEntityDiffInsertArray is adapter for slice of MessageEntityDiffInsert.
type MessageEntityDiffInsertArray []MessageEntityDiffInsert

// Sort sorts slice of MessageEntityDiffInsert.
func (s MessageEntityDiffInsertArray) Sort(less func(a, b MessageEntityDiffInsert) bool) MessageEntityDiffInsertArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityDiffInsert.
func (s MessageEntityDiffInsertArray) SortStable(less func(a, b MessageEntityDiffInsert) bool) MessageEntityDiffInsertArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityDiffInsert.
func (s MessageEntityDiffInsertArray) Retain(keep func(x MessageEntityDiffInsert) bool) MessageEntityDiffInsertArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityDiffInsertArray) First() (v MessageEntityDiffInsert, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityDiffInsertArray) Last() (v MessageEntityDiffInsert, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityDiffInsertArray) PopFirst() (v MessageEntityDiffInsert, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityDiffInsert
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityDiffInsertArray) Pop() (v MessageEntityDiffInsert, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityDiffReplaceArray is adapter for slice of MessageEntityDiffReplace.
type MessageEntityDiffReplaceArray []MessageEntityDiffReplace

// Sort sorts slice of MessageEntityDiffReplace.
func (s MessageEntityDiffReplaceArray) Sort(less func(a, b MessageEntityDiffReplace) bool) MessageEntityDiffReplaceArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityDiffReplace.
func (s MessageEntityDiffReplaceArray) SortStable(less func(a, b MessageEntityDiffReplace) bool) MessageEntityDiffReplaceArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityDiffReplace.
func (s MessageEntityDiffReplaceArray) Retain(keep func(x MessageEntityDiffReplace) bool) MessageEntityDiffReplaceArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityDiffReplaceArray) First() (v MessageEntityDiffReplace, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityDiffReplaceArray) Last() (v MessageEntityDiffReplace, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityDiffReplaceArray) PopFirst() (v MessageEntityDiffReplace, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityDiffReplace
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityDiffReplaceArray) Pop() (v MessageEntityDiffReplace, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// MessageEntityDiffDeleteArray is adapter for slice of MessageEntityDiffDelete.
type MessageEntityDiffDeleteArray []MessageEntityDiffDelete

// Sort sorts slice of MessageEntityDiffDelete.
func (s MessageEntityDiffDeleteArray) Sort(less func(a, b MessageEntityDiffDelete) bool) MessageEntityDiffDeleteArray {
	sort.Slice(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// SortStable sorts slice of MessageEntityDiffDelete.
func (s MessageEntityDiffDeleteArray) SortStable(less func(a, b MessageEntityDiffDelete) bool) MessageEntityDiffDeleteArray {
	sort.SliceStable(s, func(i, j int) bool {
		return less(s[i], s[j])
	})
	return s
}

// Retain filters in-place slice of MessageEntityDiffDelete.
func (s MessageEntityDiffDeleteArray) Retain(keep func(x MessageEntityDiffDelete) bool) MessageEntityDiffDeleteArray {
	n := 0
	for _, x := range s {
		if keep(x) {
			s[n] = x
			n++
		}
	}
	s = s[:n]

	return s
}

// First returns first element of slice (if exists).
func (s MessageEntityDiffDeleteArray) First() (v MessageEntityDiffDelete, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[0], true
}

// Last returns last element of slice (if exists).
func (s MessageEntityDiffDeleteArray) Last() (v MessageEntityDiffDelete, ok bool) {
	if len(s) < 1 {
		return
	}
	return s[len(s)-1], true
}

// PopFirst returns first element of slice (if exists) and deletes it.
func (s *MessageEntityDiffDeleteArray) PopFirst() (v MessageEntityDiffDelete, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[0]

	// Delete by index from SliceTricks.
	copy(a[0:], a[1:])
	var zero MessageEntityDiffDelete
	a[len(a)-1] = zero
	a = a[:len(a)-1]
	*s = a

	return v, true
}

// Pop returns last element of slice (if exists) and deletes it.
func (s *MessageEntityDiffDeleteArray) Pop() (v MessageEntityDiffDelete, ok bool) {
	if s == nil || len(*s) < 1 {
		return
	}

	a := *s
	v = a[len(a)-1]
	a = a[:len(a)-1]
	*s = a

	return v, true
}
